diff --git a/.commitlintrc.yml b/.commitlintrc.yml deleted file mode 100644 index 9f17590d..00000000 --- a/.commitlintrc.yml +++ /dev/null @@ -1,4 +0,0 @@ -extends: - - '@commitlint/config-angular' -rules: - 'header-max-length': [2, 'always', 100] diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e52ddc27..db5df0a7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -41,10 +41,11 @@ jobs: if: needs.checkExecution.outputs.shouldExecute == 'true' strategy: matrix: - # Test with Node.js v20 and v22 + # Test with Node.js 22, 24 and v25 node: - - 20 - 22 + - 24 + - 25 name: Node.js v${{ matrix.node }} steps: # checkout branch @@ -69,6 +70,9 @@ jobs: run: npm run test:ci build: runs-on: ubuntu-latest + permissions: + contents: read + packages: write needs: [checkExecution, test] # only execute if not skipped by commit message if: needs.checkExecution.outputs.shouldExecute == 'true' @@ -112,4 +116,4 @@ jobs: env: GITHUB_CONTEXT: ${{ toJson(github) }} REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_TOKEN: ${{ secrets.GH_TOKEN_PUBLIC_REPO }} # necessary for publish-libs script + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # necessary for publish-libs script diff --git a/.lintstagedrc.yml b/.lintstagedrc.yml deleted file mode 100644 index 5c35b407..00000000 --- a/.lintstagedrc.yml +++ /dev/null @@ -1,5 +0,0 @@ -./package.json: - - npx sort-package-json - -'*': - - npm run format:staged diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 849ddff3..00000000 --- a/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -dist/ diff --git a/.prettierrc.yml b/.prettierrc.yml deleted file mode 100644 index d86a7056..00000000 --- a/.prettierrc.yml +++ /dev/null @@ -1,5 +0,0 @@ -# https://github.com/prettier/prettier/blob/master/docs/options.md -printWidth: 120 -singleQuote: true -semi: false -trailingComma: all diff --git a/README.md b/README.md index 1a0e7ee3..8d3ba9ae 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,43 @@ Public helper packages with commonly used utilities / helpers. +
+ shiftcode logo +
+ +> [![@shiftcode/airtable-mapper](https://img.shields.io/github/package-json/v/shiftcode/sc-commons-public?filename=packages%2Fairtable-mapper%2Fpackage.json&label=%40shiftcode%2Fairtable-mapper)](packages/airtable-mapper) \ +> interfaces and classes for airtable mapping + +> [![@shiftcode/airtable-syncer](https://img.shields.io/github/package-json/v/shiftcode/sc-commons-public?filename=packages%2Fairtable-syncer%2Fpackage.json&label=%40shiftcode%2Fairtable-syncer)](packages/airtable-syncer) \ +> base utils and services to export airtable and upload to S3 + > [![@shiftcode/branch-utilities](https://img.shields.io/github/package-json/v/shiftcode/sc-commons-public?filename=packages%2Fbranch-utilities%2Fpackage.json&label=%40shiftcode%2Fbranch-utilities)](packages/branch-utilities) \ > functions to read information about the current branch either locally or inside Github actions. +> [![@shiftcode/cdk-utilities](https://img.shields.io/github/package-json/v/shiftcode/sc-commons-public?filename=packages%2Fcdk-utilities%2Fpackage.json&label=%40shiftcode%2Fcdk-utilities)](packages/cdk-utilities) \ +> Constructs for iac with aws-cdk-lib + > [![@shiftcode/eslint-config-recommended](https://img.shields.io/github/package-json/v/shiftcode/sc-commons-public?filename=packages%2Feslint-config-recommended%2Fpackage.json&label=%40shiftcode%2Feslint-config-recommended)](packages/eslint-config-recommended) \ > Our recommended config for eslint. We provide two versions, one for usage in node projects and one for Angular. > [![@shiftcode/eslint-plugin-rules](https://img.shields.io/github/package-json/v/shiftcode/sc-commons-public?filename=packages%2Feslint-plugin-rules%2Fpackage.json&label=%40shiftcode%2Feslint-plugin-rules)](packages/eslint-plugin-rules) \ > Contains some custom es lint rules. Those are used in our recommended eslint config. +> [![@shiftcode/logger](https://img.shields.io/github/package-json/v/shiftcode/sc-commons-public?filename=packages%2Flogger%2Fpackage.json&label=%40shiftcode%2Flogger)](packages/logger)\ +> A logging library configurable with different/multiple transports for your needs. + +> [![@shiftcode/inversify-logger](https://img.shields.io/github/package-json/v/shiftcode/sc-commons-public?filename=packages%2Finversify-logger%2Fpackage.json&label=%40shiftcode%2Finversify-logger)](packages/inversify-logger)\ +> Inversify LogTransport to use with the @shiftcode/logger package. + +> [![@shiftcode/iac-utilities](https://img.shields.io/github/package-json/v/shiftcode/sc-commons-public?filename=packages%2Fiac-utilities%2Fpackage.json&label=%40shiftcode%2Fiac-utilities)](packages/iac-utilities)\ +> scripts and util functions for aws iac + +> [![@shiftcode/lambda-utilities](https://img.shields.io/github/package-json/v/shiftcode/sc-commons-public?filename=packages%2Flambda-utilities%2Fpackage.json&label=%40shiftcode%2Flambda-utilities)](packages/lambda-utilities)\ +> Utils for lambda functions + +> [![@shiftcode/nest-logger](https://img.shields.io/github/package-json/v/shiftcode/sc-commons-public?filename=packages%2Fnest-logger%2Fpackage.json&label=%40shiftcode%2Fnest-logger)](packages/nest-logger)\ +> NestJS LogTransport to use with the @shiftcode/logger package. + > [![@shiftcode/publish-helper](https://img.shields.io/github/package-json/v/shiftcode/sc-commons-public?filename=packages%2Fpublish-helper%2Fpackage.json&label=%40shiftcode%2Fpublish-helper)](packages/publish-helper)\ > scripts to prepare and publish libs inside mono-repos with lerna @@ -69,3 +97,11 @@ Polyfill can be found here: https://www.npmjs.com/package/regexp-match-indices. For modern browsers the latest fully supported version is `es2023` (see [can-i-use](https://caniuse.com/?search=es2023)) which therefore is the target for `@shiftcode/utilities` package (see [package README](./packages/utilities/README.md)). + +## Utility commands: + +Clean up all `dist` folders: + +```bash +find ./packages -type d -name "dist" -exec rm -rf {} + +``` diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 00000000..6c3657c9 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,12 @@ +/** + * @see https://commitlint.js.org/reference/configuration.html + * @type { import('@commitlint/types').UserConfig } + */ +const config = { + extends: ['@commitlint/config-conventional'], + rules: { + 'header-max-length': [2, 'always', 100], + }, +} + +export default config diff --git a/lint-staged.config.js b/lint-staged.config.js new file mode 100644 index 00000000..f984406f --- /dev/null +++ b/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/package-lock.json b/package-lock.json index 19010871..08ff734f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,43 +9,25 @@ "workspaces": [ "packages/*" ], - "dependencies": { - "lerna": "^9.0.3", - "tslib": "^2.3.0" - }, "devDependencies": { - "@commitlint/cli": "^19.3.0", - "@commitlint/config-angular": "^19.3.0", - "@commitlint/prompt-cli": "^19.3.1", - "@jest/globals": "^29.5.0", - "@types/jest": "^29.5.12", + "@commitlint/cli": "^20.4.1", + "@commitlint/config-conventional": "^20.4.1", + "@commitlint/prompt-cli": "^20.4.1", "@types/node": "^22.15.0", "eslint": "^9.36.0", "husky": "^9.0.11", - "jest": "^29.7.0", + "lerna": "^9.0.3", "lint-staged": "^15.2.7", "prettier": "^3.3.2", "sort-package-json": "^2.10.0", - "ts-jest": "^29.2.0", - "typescript": "^5.5.3" + "tslib": "^2.3.0", + "typescript": "^5.5.3", + "vitest": "^4.0.18" }, "engines": { "node": "^22.15.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@angular-devkit/architect": { "version": "0.2003.8", "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.8.tgz", @@ -408,532 +390,1523 @@ "typescript": "*" } }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "node_modules/@aws-cdk/asset-awscli-v1": { + "version": "2.2.263", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.263.tgz", + "integrity": "sha512-X9JvcJhYcb7PHs8R7m4zMablO5C9PGb/hYfLnxds9h/rKJu6l7MiXE/SabCibuehxPnuO/vk+sVVJiUWrccarQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@aws-cdk/asset-node-proxy-agent-v6": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.0.tgz", + "integrity": "sha512-7bY3J8GCVxLupn/kNmpPc5VJz8grx+4RKfnnJiO1LG+uxkZfANZG3RMHhE+qQxxwkyQ9/MfPtTpf748UhR425A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "48.20.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-48.20.0.tgz", + "integrity": "sha512-+eeiav9LY4wbF/EFuCt/vfvi/Zoxo8bf94PW5clbMraChEliq83w4TbRVy0jB9jE0v1ooFTtIjSQkowSPkfISg==", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "jsonschema": "~1.4.1", + "semver": "^7.7.2" }, "engines": { - "node": ">=6.9.0" + "node": ">= 18.0.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", - "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", + "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { + "version": "1.4.1", "dev": true, + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", - "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helpers": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": "*" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { + "version": "7.7.2", "dev": true, + "inBundle": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@babel/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "node_modules/@aws-crypto/crc32c": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@aws-crypto/sha1-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", - "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helpers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", - "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", - "dev": true, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1" + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/parser": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", - "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", - "dev": true, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.27.1" - }, - "bin": { - "parser": "bin/babel-parser.js" + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tslib": "^2.6.2" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "dev": true, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@aws-sdk/client-cloudformation": { + "version": "3.983.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.983.0.tgz", + "integrity": "sha512-zFdhkU24dqmFUL/fM+PhfQ8eWziMCVyHOQqFeJ1Kr20Yovl/h0CZoztNkdHVkGaXndMeHcMpsvb/pF1fAmW/ag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/credential-provider-node": "^3.972.5", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.983.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudfront": { + "version": "3.983.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudfront/-/client-cloudfront-3.983.0.tgz", + "integrity": "sha512-XrI3yyFrsRUMTsBGSxaATh9DQcoAtlt1i4EQLtkuxNVLKFOyyA3tvwf7hR2LKcgmwr5304/QBvgSQa5U+/4MKQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/credential-provider-node": "^3.972.5", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.983.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.983.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.983.0.tgz", + "integrity": "sha512-ZbDx0koMsnj6wDH1BGKcbsO5DB34XfJB8/u/WNIyqQp04LXqXTcLCV1TgflRIyJ6RwYxsssic2mQ8HfZPGRqEg==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/credential-provider-node": "^3.972.5", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.983.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.983.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.983.0.tgz", + "integrity": "sha512-V40PT2irPh3lj+Z95tZI6batVrjaTrWEOXRNVBuoZSgpM3Ak1jiE9ZXwVLkMcbb9/GH4xVpB3EsGM7gbxmgFLQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/credential-provider-node": "^3.972.5", + "@aws-sdk/middleware-bucket-endpoint": "^3.972.3", + "@aws-sdk/middleware-expect-continue": "^3.972.3", + "@aws-sdk/middleware-flexible-checksums": "^3.972.4", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-location-constraint": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-sdk-s3": "^3.972.6", + "@aws-sdk/middleware-ssec": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/signature-v4-multi-region": "3.983.0", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.983.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/eventstream-serde-browser": "^4.2.8", + "@smithy/eventstream-serde-config-resolver": "^4.3.8", + "@smithy/eventstream-serde-node": "^4.2.8", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-blob-browser": "^4.2.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/hash-stream-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/md5-js": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-sns": { + "version": "3.983.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sns/-/client-sns-3.983.0.tgz", + "integrity": "sha512-OdqioLVhV8mav8nj6eSbTeAySIHCEMKdq4O844UUbbQaOpTonfc+TwR3wr2lsRel7rdSEk42CK/CZrH8vtUVmg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/credential-provider-node": "^3.972.5", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.983.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm": { + "version": "3.983.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.983.0.tgz", + "integrity": "sha512-5EO2C6axdxWHbH+gxa4dw3Q2gWAxFDkrzW1tZ2r80uvXVPIiosaUjmhY+tkkVcNSGNtv1gDgXbtcXkUTQ8WcgA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/credential-provider-node": "^3.972.5", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.983.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.982.0.tgz", + "integrity": "sha512-qJrIiivmvujdGqJ0ldSUvhN3k3N7GtPesoOI1BSt0fNXovVnMz4C/JmnkhZihU7hJhDvxJaBROLYTU+lpild4w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.982.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-endpoints": { + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.982.0.tgz", + "integrity": "sha512-M27u8FJP7O0Of9hMWX5dipp//8iglmV9jr7R8SR8RveU+Z50/8TqH68Tu6wUWBGMfXjzbVwn1INIAO5lZrlxXQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, + "node_modules/@aws-sdk/core": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.6.tgz", + "integrity": "sha512-pz4ZOw3BLG0NdF25HoB9ymSYyPbMiIjwQJ2aROXRhAzt+b+EOxStfFv8s5iZyP6Kiw7aYhyWxj5G3NhmkoOTKw==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/xml-builder": "^3.972.4", + "@smithy/core": "^3.22.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "node_modules/@aws-sdk/crc64-nvme": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.0.tgz", + "integrity": "sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=20.0.0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.3.tgz", + "integrity": "sha512-dW/DqTk90XW7hIngqntAVtJJyrkS51wcLhGz39lOMe0TlSmZl+5R/UGnAZqNbXmWuJHLzxe+MLgagxH41aTsAQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@aws-sdk/client-cognito-identity": "3.980.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.980.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.980.0.tgz", + "integrity": "sha512-nLgMW2drTzv+dTo3ORCcotQPcrUaTQ+xoaDTdSaUXdZO7zbbVyk7ysE5GDTnJdZWcUjHOSB8xfNQhOTTNVPhFw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.5", + "@aws-sdk/credential-provider-node": "^3.972.4", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.5", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.980.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.3", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/util-endpoints": { + "version": "3.980.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.980.0.tgz", + "integrity": "sha512-AjKBNEc+rjOZQE1HwcD9aCELqg1GmUj1rtICKuY8cgwB73xJ4U/kNyqKKpN2k9emGqlfDY2D8itIp/vDc6OKpw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.4.tgz", + "integrity": "sha512-/8dnc7+XNMmViEom2xsNdArQxQPSgy4Z/lm6qaFPTrMFesT1bV3PsBhb19n09nmxHdrtQskYmViddUIjUQElXg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.6.tgz", + "integrity": "sha512-5ERWqRljiZv44AIdvIRQ3k+EAV0Sq2WeJHvXuK7gL7bovSxOf8Al7MLH7Eh3rdovH4KHFnlIty7J71mzvQBl5Q==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/types": "^3.973.1", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.4.tgz", + "integrity": "sha512-eRUg+3HaUKuXWn/lEMirdiA5HOKmEl8hEHVuszIDt2MMBUKgVX5XNGmb3XmbgU17h6DZ+RtjbxQpjhz3SbTjZg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/credential-provider-env": "^3.972.4", + "@aws-sdk/credential-provider-http": "^3.972.6", + "@aws-sdk/credential-provider-login": "^3.972.4", + "@aws-sdk/credential-provider-process": "^3.972.4", + "@aws-sdk/credential-provider-sso": "^3.972.4", + "@aws-sdk/credential-provider-web-identity": "^3.972.4", + "@aws-sdk/nested-clients": "3.982.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.4.tgz", + "integrity": "sha512-nLGjXuvWWDlQAp505xIONI7Gam0vw2p7Qu3P6on/W2q7rjJXtYjtpHbcsaOjJ/pAju3eTvEQuSuRedcRHVQIAQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/nested-clients": "3.982.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.5.tgz", + "integrity": "sha512-VWXKgSISQCI2GKN3zakTNHSiZ0+mux7v6YHmmbLQp/o3fvYUQJmKGcLZZzg2GFA+tGGBStplra9VFNf/WwxpYg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@aws-sdk/credential-provider-env": "^3.972.4", + "@aws-sdk/credential-provider-http": "^3.972.6", + "@aws-sdk/credential-provider-ini": "^3.972.4", + "@aws-sdk/credential-provider-process": "^3.972.4", + "@aws-sdk/credential-provider-sso": "^3.972.4", + "@aws-sdk/credential-provider-web-identity": "^3.972.4", + "@aws-sdk/types": "^3.973.1", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.4.tgz", + "integrity": "sha512-TCZpWUnBQN1YPk6grvd5x419OfXjHvhj5Oj44GYb84dOVChpg/+2VoEj+YVA4F4E/6huQPNnX7UYbTtxJqgihw==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=20.0.0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.4.tgz", + "integrity": "sha512-wzsGwv9mKlwJ3vHLyembBvGE/5nPUIwRR2I51B1cBV4Cb4ql9nIIfpmHzm050XYTY5fqTOKJQnhLj7zj89VG8g==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@aws-sdk/client-sso": "3.982.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/token-providers": "3.982.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=20.0.0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", - "dev": true, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.4.tgz", + "integrity": "sha512-hIzw2XzrG8jzsUSEatehmpkd5rWzASg5IHUfA+m01k/RtvfAML7ZJVVohuKdhAYx+wV2AThLiQJVzqn7F0khrw==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/nested-clients": "3.982.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=20.0.0" } }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "node_modules/@aws-sdk/credential-providers": { + "version": "3.983.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.983.0.tgz", + "integrity": "sha512-G2nmPoHdEhLJMae0Y4CpkR5OlsQKUXAi7LNLUOZfNMFCstPQfI6uEHqTmKT9EyrbQkD3Y+rAbRTxTt3FMm+B4A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.983.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/credential-provider-cognito-identity": "^3.972.3", + "@aws-sdk/credential-provider-env": "^3.972.4", + "@aws-sdk/credential-provider-http": "^3.972.6", + "@aws-sdk/credential-provider-ini": "^3.972.4", + "@aws-sdk/credential-provider-login": "^3.972.4", + "@aws-sdk/credential-provider-node": "^3.972.5", + "@aws-sdk/credential-provider-process": "^3.972.4", + "@aws-sdk/credential-provider-sso": "^3.972.4", + "@aws-sdk/credential-provider-web-identity": "^3.972.4", + "@aws-sdk/nested-clients": "3.983.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/nested-clients": { + "version": "3.983.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.983.0.tgz", + "integrity": "sha512-4bUzDkJlSPwfegO23ZSBrheuTI8UyAgNzptm1K6fZAIOIc1vnFl12TonecbssAfmM0/UdyTn5QDomwEfIdmJkQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.983.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.3.tgz", + "integrity": "sha512-fmbgWYirF67YF1GfD7cg5N6HHQ96EyRNx/rDIrTF277/zTWVuPI2qS/ZHgofwR1NZPe/NWvoppflQY01LrbVLg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-arn-parser": "^3.972.2", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=20.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.3.tgz", + "integrity": "sha512-4msC33RZsXQpUKR5QR4HnvBSNCPLGHmB55oDiROqqgyOc+TOfVu2xgi5goA7ms6MdZLeEh2905UfWMnMMF4mRg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@aws-sdk/types": "^3.973.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=20.0.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.972.4.tgz", + "integrity": "sha512-xOxsUkF3O3BtIe3tf54OpPo94eZepjFm3z0Dd2TZKbsPxMiRTFXurC04wJ58o/wPW9YHVO9VqZik3MfoPfrKlw==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/crc64-nvme": "3.972.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.3.tgz", + "integrity": "sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=4" + "node": ">=20.0.0" } }, - "node_modules/@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.3.tgz", + "integrity": "sha512-nIg64CVrsXp67vbK0U1/Is8rik3huS3QkRHn2DRDx4NldrEFMgdkZGI/+cZMKD9k4YOS110Dfu21KZLHrFA/1g==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=20.0.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@commitlint/cli": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.8.1.tgz", - "integrity": "sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==", - "dev": true, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.3.tgz", + "integrity": "sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/format": "^19.8.1", - "@commitlint/lint": "^19.8.1", - "@commitlint/load": "^19.8.1", - "@commitlint/read": "^19.8.1", - "@commitlint/types": "^19.8.1", - "tinyexec": "^1.0.0", - "yargs": "^17.0.0" + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "bin": { - "commitlint": "cli.js" + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.3.tgz", + "integrity": "sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=v18" + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.6.tgz", + "integrity": "sha512-Xq7wM6kbgJN1UO++8dvH/efPb1nTwWqFCpZCR7RCLOETP7xAUAhVo7JmsCnML5Di/iC4Oo5VrJ4QmkYcMZniLw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-arn-parser": "^3.972.2", + "@smithy/core": "^3.22.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.3.tgz", + "integrity": "sha512-dU6kDuULN3o3jEHcjm0c4zWJlY1zWVkjG9NPe9qxYLLpcbdj5kRYBS2DdWYD+1B9f910DezRuws7xDEqKkHQIg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.972.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.6.tgz", + "integrity": "sha512-TehLN8W/kivl0U9HcS+keryElEWORROpghDXZBLfnb40DXM7hx/i+7OOjkogXQOF3QtUraJVRkHQ07bPhrWKlw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.982.0", + "@smithy/core": "^3.22.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/util-endpoints": { + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.982.0.tgz", + "integrity": "sha512-M27u8FJP7O0Of9hMWX5dipp//8iglmV9jr7R8SR8RveU+Z50/8TqH68Tu6wUWBGMfXjzbVwn1INIAO5lZrlxXQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.982.0.tgz", + "integrity": "sha512-VVkaH27digrJfdVrT64rjkllvOp4oRiZuuJvrylLXAKl18ujToJR7AqpDldL/LS63RVne3QWIpkygIymxFtliQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/middleware-host-header": "^3.972.3", + "@aws-sdk/middleware-logger": "^3.972.3", + "@aws-sdk/middleware-recursion-detection": "^3.972.3", + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/region-config-resolver": "^3.972.3", + "@aws-sdk/types": "^3.973.1", + "@aws-sdk/util-endpoints": "3.982.0", + "@aws-sdk/util-user-agent-browser": "^3.972.3", + "@aws-sdk/util-user-agent-node": "^3.972.4", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.22.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.12", + "@smithy/middleware-retry": "^4.4.29", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.11.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.28", + "@smithy/util-defaults-mode-node": "^4.2.31", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-endpoints": { + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.982.0.tgz", + "integrity": "sha512-M27u8FJP7O0Of9hMWX5dipp//8iglmV9jr7R8SR8RveU+Z50/8TqH68Tu6wUWBGMfXjzbVwn1INIAO5lZrlxXQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.3.tgz", + "integrity": "sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.983.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.983.0.tgz", + "integrity": "sha512-11FCcxI/WKRufKDdPgKPXtrhjDArhkOPb4mf66rICZUnPHlD8Cb7cjZZS/eFC+iuwoHBosrxo0hYsvK3s7DxGw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "^3.972.6", + "@aws-sdk/types": "^3.973.1", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.982.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.982.0.tgz", + "integrity": "sha512-v3M0KYp2TVHYHNBT7jHD9lLTWAdS9CaWJ2jboRKt0WAB65bA7iUEpR+k4VqKYtpQN4+8kKSc4w+K6kUNZkHKQw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.6", + "@aws-sdk/nested-clients": "3.982.0", + "@aws-sdk/types": "^3.973.1", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.973.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz", + "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.972.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.2.tgz", + "integrity": "sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.983.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.983.0.tgz", + "integrity": "sha512-t/VbL2X3gvDEjC4gdySOeFFOZGQEBKwa23pRHeB7hBLBZ119BB/2OEFtTFWKyp3bnMQgxpeVeGS7/hxk6wpKJw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.4.tgz", + "integrity": "sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.3.tgz", + "integrity": "sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.1", + "@smithy/types": "^4.12.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.4.tgz", + "integrity": "sha512-3WFCBLiM8QiHDfosQq3Py+lIMgWlFWwFQliUHUqwEiRqLnKyhgbU3AKa7AWJF7lW2Oc/2kFNY4MlAYVnVc0i8A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "^3.972.6", + "@aws-sdk/types": "^3.973.1", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.4.tgz", + "integrity": "sha512-0zJ05ANfYqI6+rGqj8samZBFod0dPPousBjLEqg8WdxSgbMAkRgLyn81lP215Do0rFJ/17LIXwr7q0yK24mP6Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "fast-xml-parser": "5.3.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz", + "integrity": "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@borewit/text-codec": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.1.tgz", + "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/@commitlint/config-angular": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/config-angular/-/config-angular-19.8.1.tgz", - "integrity": "sha512-5OAVgqwg6m4iXP2FkrswKZjrgzyQetR5Jkyt5SajlxLfKzZOzdB3hSqVJQdtvF/AxiMwz9Ey5BIXTCfSIrvZGg==", + "node_modules/@commitlint/cli": { + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.4.1.tgz", + "integrity": "sha512-uuFKKpc7OtQM+6SRqT+a4kV818o1pS+uvv/gsRhyX7g4x495jg+Q7P0+O9VNGyLXBYP0syksS7gMRDJKcekr6A==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/config-angular-type-enum": "^19.8.1" + "@commitlint/format": "^20.4.0", + "@commitlint/lint": "^20.4.1", + "@commitlint/load": "^20.4.0", + "@commitlint/read": "^20.4.0", + "@commitlint/types": "^20.4.0", + "tinyexec": "^1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" }, "engines": { "node": ">=v18" } }, - "node_modules/@commitlint/config-angular-type-enum": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/config-angular-type-enum/-/config-angular-type-enum-19.8.1.tgz", - "integrity": "sha512-JKEINTDQcH5+qSq0Fcp/gzT7SQ3RvY74SNXiMABNTsseocB33TKMzPwDJHZbl/hyRemWEE97Qbxz+ILnJ+9AZQ==", + "node_modules/@commitlint/config-conventional": { + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-20.4.1.tgz", + "integrity": "sha512-0YUvIeBtpi86XriqrR+TCULVFiyYTIOEPjK7tTRMxjcBm1qlzb+kz7IF2WxL6Fq5DaundG8VO37BNgMkMTBwqA==", "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.4.0", + "conventional-changelog-conventionalcommits": "^9.1.0" + }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/config-validator": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.1.tgz", - "integrity": "sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==", + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-20.4.0.tgz", + "integrity": "sha512-zShmKTF+sqyNOfAE0vKcqnpvVpG0YX8F9G/ZIQHI2CoKyK+PSdladXMSns400aZ5/QZs+0fN75B//3Q5CHw++w==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/types": "^19.8.1", + "@commitlint/types": "^20.4.0", "ajv": "^8.11.0" }, "engines": { @@ -941,12 +1914,13 @@ } }, "node_modules/@commitlint/ensure": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.1.tgz", - "integrity": "sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==", + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-20.4.1.tgz", + "integrity": "sha512-WLQqaFx1pBooiVvBrA1YfJNFqZF8wS/YGOtr5RzApDbV9tQ52qT5VkTsY65hFTnXhW8PcDfZLaknfJTmPejmlw==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/types": "^19.8.1", + "@commitlint/types": "^20.4.0", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", @@ -958,34 +1932,37 @@ } }, "node_modules/@commitlint/execute-rule": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz", - "integrity": "sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-20.0.0.tgz", + "integrity": "sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=v18" } }, "node_modules/@commitlint/format": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.1.tgz", - "integrity": "sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==", + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-20.4.0.tgz", + "integrity": "sha512-i3ki3WR0rgolFVX6r64poBHXM1t8qlFel1G1eCBvVgntE3fCJitmzSvH5JD/KVJN/snz6TfaX2CLdON7+s4WVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/types": "^19.8.1", - "chalk": "^5.3.0" + "@commitlint/types": "^20.4.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/is-ignored": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.1.tgz", - "integrity": "sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==", + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-20.4.1.tgz", + "integrity": "sha512-In5EO4JR1lNsAv1oOBBO24V9ND1IqdAJDKZiEpdfjDl2HMasAcT7oA+5BKONv1pRoLG380DGPE2W2RIcUwdgLA==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/types": "^19.8.1", + "@commitlint/types": "^20.4.0", "semver": "^7.6.0" }, "engines": { @@ -993,87 +1970,105 @@ } }, "node_modules/@commitlint/lint": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.1.tgz", - "integrity": "sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==", + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-20.4.1.tgz", + "integrity": "sha512-g94LrGl/c6UhuhDQqNqU232aslLEN2vzc7MPfQTHzwzM4GHNnEAwVWWnh0zX8S5YXecuLXDwbCsoGwmpAgPWKA==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/is-ignored": "^19.8.1", - "@commitlint/parse": "^19.8.1", - "@commitlint/rules": "^19.8.1", - "@commitlint/types": "^19.8.1" + "@commitlint/is-ignored": "^20.4.1", + "@commitlint/parse": "^20.4.1", + "@commitlint/rules": "^20.4.1", + "@commitlint/types": "^20.4.0" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/load": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.1.tgz", - "integrity": "sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==", + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.4.0.tgz", + "integrity": "sha512-Dauup/GfjwffBXRJUdlX/YRKfSVXsXZLnINXKz0VZkXdKDcaEILAi9oflHGbfydonJnJAbXEbF3nXPm9rm3G6A==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/execute-rule": "^19.8.1", - "@commitlint/resolve-extends": "^19.8.1", - "@commitlint/types": "^19.8.1", - "chalk": "^5.3.0", + "@commitlint/config-validator": "^20.4.0", + "@commitlint/execute-rule": "^20.0.0", + "@commitlint/resolve-extends": "^20.4.0", + "@commitlint/types": "^20.4.0", "cosmiconfig": "^9.0.0", "cosmiconfig-typescript-loader": "^6.1.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0" + "is-plain-obj": "^4.1.0", + "lodash.mergewith": "^4.6.2", + "picocolors": "^1.1.1" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/message": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.1.tgz", - "integrity": "sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==", + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-20.4.0.tgz", + "integrity": "sha512-B5lGtvHgiLAIsK5nLINzVW0bN5hXv+EW35sKhYHE8F7V9Uz1fR4tx3wt7mobA5UNhZKUNgB/+ldVMQE6IHZRyA==", "dev": true, + "license": "MIT", "engines": { "node": ">=v18" } }, "node_modules/@commitlint/parse": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.1.tgz", - "integrity": "sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==", + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-20.4.1.tgz", + "integrity": "sha512-XNtZjeRcFuAfUnhYrCY02+mpxwY4OmnvD3ETbVPs25xJFFz1nRo/25nHj+5eM+zTeRFvWFwD4GXWU2JEtoK1/w==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/types": "^19.8.1", - "conventional-changelog-angular": "^7.0.0", - "conventional-commits-parser": "^5.0.0" + "@commitlint/types": "^20.4.0", + "conventional-changelog-angular": "^8.1.0", + "conventional-commits-parser": "^6.2.1" }, "engines": { "node": ">=v18" } }, + "node_modules/@commitlint/parse/node_modules/conventional-changelog-angular": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.1.0.tgz", + "integrity": "sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@commitlint/prompt": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/prompt/-/prompt-19.8.1.tgz", - "integrity": "sha512-IH3zJBJ2GSffgAJtW5EklK72skEAa3PZsbWQ5+Ybumd9QjKMnI9vagz5lprGRImdysaFREsMCOVpmcWjxpxPxg==", + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/@commitlint/prompt/-/prompt-20.4.1.tgz", + "integrity": "sha512-dLXTdNnXiWyYPHM9a5gMpZrDTbjrwoJJGICD1aS4eCviw9yc8vNKoTytxR+oNb3xXS9i/0b4Ajhr1ALy996dMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/ensure": "^19.8.1", - "@commitlint/load": "^19.8.1", - "@commitlint/types": "^19.8.1", - "chalk": "^5.3.0", - "inquirer": "^9.2.15" + "@commitlint/ensure": "^20.4.1", + "@commitlint/load": "^20.4.0", + "@commitlint/types": "^20.4.0", + "inquirer": "^9.2.15", + "picocolors": "^1.1.1" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/prompt-cli": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/prompt-cli/-/prompt-cli-19.8.1.tgz", - "integrity": "sha512-rK92LywMpGKpBg730sRVRujUF3yP+xSLdfYpYSPK6jCbhVvTRPcBYVi3plIBR1VETto97+hN1HHTTpZsN8jSUA==", + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/@commitlint/prompt-cli/-/prompt-cli-20.4.1.tgz", + "integrity": "sha512-5kivMX7Sq5PkxwTqhk/KmhKG52BHIoWvt2a6qY3g+9ZCls/lNjLw1HxMV+raeGk79K+eD/g/Tj+XWWkkzZkivA==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/prompt": "^19.8.1", + "@commitlint/prompt": "^20.4.1", "inquirer": "^9.2.15", "tinyexec": "^1.0.0" }, @@ -1085,13 +2080,14 @@ } }, "node_modules/@commitlint/read": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.1.tgz", - "integrity": "sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==", + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-20.4.0.tgz", + "integrity": "sha512-QfpFn6/I240ySEGv7YWqho4vxqtPpx40FS7kZZDjUJ+eHxu3azfhy7fFb5XzfTqVNp1hNoI3tEmiEPbDB44+cg==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/top-level": "^19.8.1", - "@commitlint/types": "^19.8.1", + "@commitlint/top-level": "^20.4.0", + "@commitlint/types": "^20.4.0", "git-raw-commits": "^4.0.0", "minimist": "^1.2.8", "tinyexec": "^1.0.0" @@ -1101,13 +2097,14 @@ } }, "node_modules/@commitlint/resolve-extends": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz", - "integrity": "sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==", + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.4.0.tgz", + "integrity": "sha512-ay1KM8q0t+/OnlpqXJ+7gEFQNlUtSU5Gxr8GEwnVf2TPN3+ywc5DzL3JCxmpucqxfHBTFwfRMXxPRRnR5Ki20g==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/types": "^19.8.1", + "@commitlint/config-validator": "^20.4.0", + "@commitlint/types": "^20.4.0", "global-directory": "^4.0.1", "import-meta-resolve": "^4.0.0", "lodash.mergewith": "^4.6.2", @@ -1118,49 +2115,53 @@ } }, "node_modules/@commitlint/rules": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.1.tgz", - "integrity": "sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==", + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.4.1.tgz", + "integrity": "sha512-WtqypKEPbQEuJwJS4aKs0OoJRBKz1HXPBC9wRtzVNH68FLhPWzxXlF09hpUXM9zdYTpm4vAdoTGkWiBgQ/vL0g==", "dev": true, + "license": "MIT", "dependencies": { - "@commitlint/ensure": "^19.8.1", - "@commitlint/message": "^19.8.1", - "@commitlint/to-lines": "^19.8.1", - "@commitlint/types": "^19.8.1" + "@commitlint/ensure": "^20.4.1", + "@commitlint/message": "^20.4.0", + "@commitlint/to-lines": "^20.0.0", + "@commitlint/types": "^20.4.0" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/to-lines": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.1.tgz", - "integrity": "sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-20.0.0.tgz", + "integrity": "sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==", "dev": true, + "license": "MIT", "engines": { "node": ">=v18" } }, "node_modules/@commitlint/top-level": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.1.tgz", - "integrity": "sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==", + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-20.4.0.tgz", + "integrity": "sha512-NDzq8Q6jmFaIIBC/GG6n1OQEaHdmaAAYdrZRlMgW6glYWGZ+IeuXmiymDvQNXPc82mVxq2KiE3RVpcs+1OeDeA==", "dev": true, + "license": "MIT", "dependencies": { - "find-up": "^7.0.0" + "escalade": "^3.2.0" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/types": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz", - "integrity": "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==", + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.4.0.tgz", + "integrity": "sha512-aO5l99BQJ0X34ft8b0h7QFkQlqxC6e7ZPVmBKz13xM9O8obDaM1Cld4sQlJDXXU/VFuUzQ30mVtHjVz74TuStw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/conventional-commits-parser": "^5.0.0", - "chalk": "^5.3.0" + "conventional-commits-parser": "^6.2.1", + "picocolors": "^1.1.1" }, "engines": { "node": ">=v18" @@ -1194,524 +2195,663 @@ "tslib": "^2.4.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", - "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.16.0" - }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", - "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/@eslint/js": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", - "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" + "node": ">=18" } }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "license": "Apache-2.0", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", - "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.16.0", - "levn": "^0.4.1" - }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "license": "Apache-2.0", + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.18.0" + "node": ">=18" } }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.18.0" + "node": ">=18" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "license": "Apache-2.0", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "node_modules/@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "license": "Apache-2.0", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@inquirer/ansi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", - "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" } }, - "node_modules/@inquirer/checkbox": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", - "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/confirm": { - "version": "5.1.21", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", - "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/core": { - "version": "10.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", - "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.3" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/core/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "license": "ISC", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=18" } }, - "node_modules/@inquirer/core/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18" } }, - "node_modules/@inquirer/editor": { - "version": "4.2.23", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", - "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/external-editor": "^1.0.3", - "@inquirer/type": "^3.0.10" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/expand": { - "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", - "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" - }, + "optional": true, + "os": [ + "openharmony" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "chardet": "^2.1.1", - "iconv-lite": "^0.7.0" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/external-editor/node_modules/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", - "license": "MIT" - }, - "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=18" } }, - "node_modules/@inquirer/figures": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", - "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=18" } }, - "node_modules/@inquirer/input": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", - "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/number": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", - "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "@types/node": ">=18" + "funding": { + "url": "https://opencollective.com/eslint" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@inquirer/password": { - "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", - "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.2", - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10" - }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@inquirer/prompts": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", - "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "node_modules/@eslint/config-helpers": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.3.2", - "@inquirer/confirm": "^5.1.21", - "@inquirer/editor": "^4.2.23", - "@inquirer/expand": "^4.0.23", - "@inquirer/input": "^4.3.1", - "@inquirer/number": "^3.0.23", - "@inquirer/password": "^4.0.23", - "@inquirer/rawlist": "^4.1.11", - "@inquirer/search": "^3.2.2", - "@inquirer/select": "^4.4.2" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@types/node": ">=18" + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", - "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/@eslint/js": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "license": "Apache-2.0", "dependencies": { - "@inquirer/core": "^10.3.2", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, - "peerDependencies": { - "@types/node": ">=18" + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@inquirer/search": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", - "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "license": "MIT", "dependencies": { + "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", @@ -1729,17 +2869,14 @@ } } }, - "node_modules/@inquirer/select": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", - "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", - "@inquirer/figures": "^1.0.15", - "@inquirer/type": "^3.0.10", - "yoctocolors-cjs": "^2.1.3" + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -1753,11 +2890,21 @@ } } }, - "node_modules/@inquirer/type": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", - "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, "engines": { "node": ">=18" }, @@ -1770,376 +2917,493 @@ } } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", + "node_modules/@inquirer/core/node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", "engines": { - "node": "20 || >=22" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", "engines": { - "node": "20 || >=22" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "license": "MIT", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, "engines": { - "node": ">=12" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, "engines": { - "node": ">=12" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "node_modules/@inquirer/external-editor/node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "license": "MIT" }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=12" + "node": ">=0.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { - "node": ">=12" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "license": "ISC", + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "license": "MIT", "dependencies": { - "minipass": "^7.0.4" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { - "node": ">=18.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", - "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", - "license": "ISC" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "node_modules/@inversifyjs/common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@inversifyjs/common/-/common-1.5.2.tgz", + "integrity": "sha512-WlzR9xGadABS9gtgZQ+luoZ8V6qm4Ii6RQfcfC9Ho2SOlE6ZuemFo7PKJvKI0ikm8cmKbU8hw5UK6E4qovH21w==", + "license": "MIT" + }, + "node_modules/@inversifyjs/container": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@inversifyjs/container/-/container-1.15.0.tgz", + "integrity": "sha512-U2xYsPrJTz5za2TExi5lg8qOWf8TEVBpN+pQM7B8BVA2rajtbRE9A66SLRHk8c1eGXmg+0K4Hdki6tWAsSQBUA==", + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "@inversifyjs/common": "1.5.2", + "@inversifyjs/core": "9.2.0", + "@inversifyjs/plugin": "0.2.0", + "@inversifyjs/reflect-metadata-utils": "1.4.1" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "reflect-metadata": "~0.2.2" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/@inversifyjs/core": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@inversifyjs/core/-/core-9.2.0.tgz", + "integrity": "sha512-Nm7BR6KmpgshIHpVQWuEDehqRVb6GBm8LFEuhc2s4kSZWrArZ15RmXQzROLk4m+hkj4kMXgvMm5Qbopot/D6Sg==", + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.2", + "@inversifyjs/prototype-utils": "0.1.3", + "@inversifyjs/reflect-metadata-utils": "1.4.1" } }, - "node_modules/@istanbuljs/schema": { + "node_modules/@inversifyjs/plugin": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@inversifyjs/plugin/-/plugin-0.2.0.tgz", + "integrity": "sha512-R/JAdkTSD819pV1zi0HP54mWHyX+H2m8SxldXRgPQarS3ySV4KPyRdosWcfB8Se0JJZWZLHYiUNiS6JvMWSPjw==", + "license": "MIT" + }, + "node_modules/@inversifyjs/prototype-utils": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, + "resolved": "https://registry.npmjs.org/@inversifyjs/prototype-utils/-/prototype-utils-0.1.3.tgz", + "integrity": "sha512-EzRamZzNgE9Sn3QtZ8NncNa2lpPMZfspqbK6BWFguWnOpK8ymp2TUuH46ruFHZhrHKnknPd7fG22ZV7iF517TQ==", + "license": "MIT", + "dependencies": { + "@inversifyjs/common": "1.5.2" + } + }, + "node_modules/@inversifyjs/reflect-metadata-utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@inversifyjs/reflect-metadata-utils/-/reflect-metadata-utils-1.4.1.tgz", + "integrity": "sha512-Cp77C4d2wLaHXiUB7iH6Cxb7i1lD/YDuTIHLTDzKINqGSz0DCSoL/Dg2wVkW/6Qx03r/yQMLJ+32Agl32N2X8g==", + "license": "MIT", + "peerDependencies": { + "reflect-metadata": "~0.2.2" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", "engines": { - "node": ">=8" + "node": "20 || >=22" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", + "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", + "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" + "@isaacs/balanced-match": "^4.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "20 || >=22" } }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", "dependencies": { - "color-convert": "^2.0.1" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">=12" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "minipass": "^7.0.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18.0.0" } }, + "node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", + "license": "ISC" + }, "node_modules/@jest/diff-sequences": { "version": "30.0.1", "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", @@ -2149,63 +3413,6 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/get-type": { "version": "30.1.0", "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", @@ -2215,256 +3422,6 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", @@ -2479,6 +3436,17 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -2498,10 +3466,11 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -2636,6 +3605,12 @@ } } }, + "node_modules/@lerna/create/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/@lerna/create/node_modules/execa": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", @@ -2750,6 +3725,34 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/@lerna/create/node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@lerna/create/node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@lerna/create/node_modules/picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", @@ -2824,6 +3827,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", @@ -2835,32 +3848,134 @@ "@tybys/wasm-util": "^0.9.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@nestjs/common": { + "version": "11.1.13", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.13.tgz", + "integrity": "sha512-ieqWtipT+VlyDWLz5Rvz0f3E5rXcVAnaAi+D53DEHLjc1kmFxCgZ62qVfTX2vwkywwqNkTNXvBgGR72hYqV//Q==", + "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "file-type": "21.3.0", + "iterare": "1.2.1", + "load-esm": "1.0.3", + "tslib": "2.8.1", + "uid": "2.0.2" }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@nestjs/core": { + "version": "11.1.13", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.13.tgz", + "integrity": "sha512-Tq9EIKiC30EBL8hLK93tNqaToy0hzbuVGYt29V8NhkVJUsDzlmiVf6c3hSPtzx2krIUVbTgQ2KFeaxr72rEyzQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", + "@nuxt/opencollective": "0.4.1", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "8.3.0", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "node_modules/@nestjs/testing": { + "version": "11.1.13", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.13.tgz", + "integrity": "sha512-bOWP8nLEZAOEEX8jAZGBCc1yU0+nv4g2ipc+QEzkVUe3eEEUKHKaeGafJ3GtDuGavlZKfkXEqflZuICdavu5dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + } + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { @@ -3062,9 +4177,9 @@ } }, "node_modules/@npmcli/arborist/node_modules/tar": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", - "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -3464,6 +4579,23 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/@nuxt/opencollective": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", + "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0", + "npm": ">=5.10.0" + } + }, "node_modules/@nx/devkit": { "version": "22.1.3", "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-22.1.3.tgz", @@ -3807,2141 +4939,2342 @@ "node": ">=14" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" - }, - "node_modules/@shiftcode/branch-utilities": { - "resolved": "packages/branch-utilities", - "link": true - }, - "node_modules/@shiftcode/eslint-config-recommended": { - "resolved": "packages/eslint-config-recommended", - "link": true - }, - "node_modules/@shiftcode/eslint-plugin-rules": { - "resolved": "packages/eslint-plugin-rules", - "link": true - }, - "node_modules/@shiftcode/logger": { - "resolved": "packages/logger", - "link": true - }, - "node_modules/@shiftcode/publish-helper": { - "resolved": "packages/publish-helper", - "link": true - }, - "node_modules/@shiftcode/utilities": { - "resolved": "packages/utilities", - "link": true - }, - "node_modules/@sigstore/bundle": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", - "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.5.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@sigstore/core": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.0.0.tgz", - "integrity": "sha512-NgbJ+aW9gQl/25+GIEGYcCyi8M+ng2/5X04BMuIgoDfgvp18vDcoNHOQjQsG9418HGNYRxG3vfEXaR1ayD37gg==", - "license": "Apache-2.0", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.0.tgz", - "integrity": "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==", - "license": "Apache-2.0", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.0.1.tgz", - "integrity": "sha512-KFNGy01gx9Y3IBPG/CergxR9RZpN43N+lt3EozEfeoyqm8vEiLxwRl3ZO5sPx3Obv1ix/p7FWOlPc2Jgwfp9PA==", - "license": "Apache-2.0", + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", - "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.2", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" }, "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.0.tgz", - "integrity": "sha512-0QFuWDHOQmz7t66gfpfNO6aEjoFrdhkJaej/AOqb4kqWZVbPWFZifXZzkxyQBB1OwTbkhdT3LNpMFxwkTvf+2w==", - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.5.0", - "tuf-js": "^4.0.0" + "node": ">=14.0.0" }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@sigstore/verify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.0.0.tgz", - "integrity": "sha512-moXtHH33AobOhTZF8xcX1MpOFqdvfCk7v6+teJL8zymBiDXwEsQH6XG9HGx2VIxnJZNm4cNSzflTLDnQLmIdmw==", - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", - "@sigstore/protobuf-specs": "^0.5.0" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } + "license": "MIT" }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", - "license": "MIT", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.0.0.tgz", - "integrity": "sha512-h5x5ga/hh82COe+GoD4+gKUeV4T3iaYOxqLt41GRKApinPI7DMidhCmNVTjKfhCWFJIGXaFJee07XczdT4jdZQ==", - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.5" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@types/conventional-commits-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz", - "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@types/node": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@types/node": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "license": "MIT" + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "license": "MIT" + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/node": { - "version": "22.15.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", - "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", - "devOptional": true, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT" + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz", - "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.0", - "@typescript-eslint/type-utils": "8.46.0", - "@typescript-eslint/utils": "8.46.0", - "@typescript-eslint/visitor-keys": "8.46.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.46.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", - "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", - "engines": { - "node": ">= 4" - } + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@typescript-eslint/parser": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz", - "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==", + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" + }, + "node_modules/@shiftcode/airtable-mapper": { + "resolved": "packages/airtable-mapper", + "link": true + }, + "node_modules/@shiftcode/airtable-syncer": { + "resolved": "packages/airtable-syncer", + "link": true + }, + "node_modules/@shiftcode/branch-utilities": { + "resolved": "packages/branch-utilities", + "link": true + }, + "node_modules/@shiftcode/cdk-utilities": { + "resolved": "packages/cdk-utilities", + "link": true + }, + "node_modules/@shiftcode/eslint-config-recommended": { + "resolved": "packages/eslint-config-recommended", + "link": true + }, + "node_modules/@shiftcode/eslint-plugin-rules": { + "resolved": "packages/eslint-plugin-rules", + "link": true + }, + "node_modules/@shiftcode/iac-utilities": { + "resolved": "packages/iac-utilities", + "link": true + }, + "node_modules/@shiftcode/inversify-logger": { + "resolved": "packages/inversify-logger", + "link": true + }, + "node_modules/@shiftcode/lambda-utilities": { + "resolved": "packages/lambda-utilities", + "link": true + }, + "node_modules/@shiftcode/logger": { + "resolved": "packages/logger", + "link": true + }, + "node_modules/@shiftcode/nest-logger": { + "resolved": "packages/nest-logger", + "link": true + }, + "node_modules/@shiftcode/publish-helper": { + "resolved": "packages/publish-helper", + "link": true + }, + "node_modules/@shiftcode/utilities": { + "resolved": "packages/utilities", + "link": true + }, + "node_modules/@sigstore/bundle": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", + "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/scope-manager": "8.46.0", - "@typescript-eslint/types": "8.46.0", - "@typescript-eslint/typescript-estree": "8.46.0", - "@typescript-eslint/visitor-keys": "8.46.0", - "debug": "^4.3.4" + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz", - "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.0", - "@typescript-eslint/types": "^8.46.0", - "debug": "^4.3.4" - }, + "node_modules/@sigstore/core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.0.0.tgz", + "integrity": "sha512-NgbJ+aW9gQl/25+GIEGYcCyi8M+ng2/5X04BMuIgoDfgvp18vDcoNHOQjQsG9418HGNYRxG3vfEXaR1ayD37gg==", + "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.0.tgz", + "integrity": "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==", + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@typescript-eslint/rule-tester": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/rule-tester/-/rule-tester-8.46.0.tgz", - "integrity": "sha512-cIz9Z9BeL8YHKPVAHaFoSX4H359UPtbl93kRVS+Kx94HtFP48JXKmmUOBGRT/WdRQtpliu7U9pKGbCXYjv2byg==", - "dev": true, - "license": "MIT", + "node_modules/@sigstore/sign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.0.1.tgz", + "integrity": "sha512-KFNGy01gx9Y3IBPG/CergxR9RZpN43N+lt3EozEfeoyqm8vEiLxwRl3ZO5sPx3Obv1ix/p7FWOlPc2Jgwfp9PA==", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/parser": "8.46.0", - "@typescript-eslint/typescript-estree": "8.46.0", - "@typescript-eslint/utils": "8.46.0", - "ajv": "^6.12.6", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "4.6.2", - "semver": "^7.6.0" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.0.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.2", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@typescript-eslint/rule-tester/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/@sigstore/tuf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.0.tgz", + "integrity": "sha512-0QFuWDHOQmz7t66gfpfNO6aEjoFrdhkJaej/AOqb4kqWZVbPWFZifXZzkxyQBB1OwTbkhdT3LNpMFxwkTvf+2w==", + "license": "Apache-2.0", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@typescript-eslint/rule-tester/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz", - "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==", - "license": "MIT", + "node_modules/@sigstore/verify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.0.0.tgz", + "integrity": "sha512-moXtHH33AobOhTZF8xcX1MpOFqdvfCk7v6+teJL8zymBiDXwEsQH6XG9HGx2VIxnJZNm4cNSzflTLDnQLmIdmw==", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/types": "8.46.0", - "@typescript-eslint/visitor-keys": "8.46.0" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.0.0", + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz", - "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==", - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node_modules/@smithy/abort-controller": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", + "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz", - "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==", - "license": "MIT", + "node_modules/@smithy/chunked-blob-reader": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", + "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/types": "8.46.0", - "@typescript-eslint/typescript-estree": "8.46.0", - "@typescript-eslint/utils": "8.46.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "tslib": "^2.6.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz", - "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==", - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", + "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz", - "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==", - "license": "MIT", + "node_modules/@smithy/config-resolver": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", + "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/project-service": "8.46.0", - "@typescript-eslint/tsconfig-utils": "8.46.0", - "@typescript-eslint/types": "8.46.0", - "@typescript-eslint/visitor-keys": "8.46.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", + "node_modules/@smithy/core": { + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.22.1.tgz", + "integrity": "sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==", + "license": "Apache-2.0", "dependencies": { - "balanced-match": "^1.0.0" + "@smithy/middleware-serde": "^4.2.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.11", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", + "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", + "license": "Apache-2.0", "dependencies": { - "brace-expansion": "^2.0.1" + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz", - "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==", - "license": "MIT", + "node_modules/@smithy/eventstream-codec": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.8.tgz", + "integrity": "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.0", - "@typescript-eslint/types": "8.46.0", - "@typescript-eslint/typescript-estree": "8.46.0" + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz", - "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==", - "license": "MIT", + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.8.tgz", + "integrity": "sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/types": "8.46.0", - "eslint-visitor-keys": "^4.2.1" + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=18.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.8.tgz", + "integrity": "sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==", + "dev": true, "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "license": "BSD-2-Clause" - }, - "node_modules/@yarnpkg/parsers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", - "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", - "license": "BSD-2-Clause", + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.8.tgz", + "integrity": "sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "js-yaml": "^3.10.0", - "tslib": "^2.4.0" + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18.12.0" + "node": ">=18.0.0" } }, - "node_modules/@yarnpkg/parsers/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.8.tgz", + "integrity": "sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "sprintf-js": "~1.0.2" + "@smithy/eventstream-codec": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "license": "MIT", + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", + "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", + "license": "Apache-2.0", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@zkochan/js-yaml": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", - "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", - "license": "MIT", + "node_modules/@smithy/hash-blob-browser": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.9.tgz", + "integrity": "sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "argparse": "^2.0.1" + "@smithy/chunked-blob-reader": "^5.2.0", + "@smithy/chunked-blob-reader-native": "^4.2.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", - "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=18.0.0" } }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "node_modules/@smithy/hash-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", + "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=0.4.0" + "node": ">=18.0.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node_modules/@smithy/hash-stream-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.8.tgz", + "integrity": "sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "license": "MIT" - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", + "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 14" + "node": ">=18.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/@smithy/md5-js": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.8.tgz", + "integrity": "sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "@smithy/types": "^4.12.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", + "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", + "license": "Apache-2.0", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "engines": { + "node": ">=18.0.0" } }, - "node_modules/angular-eslint": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-20.5.1.tgz", - "integrity": "sha512-7Vx2Vs4u5KO7Kxzo8kMAZnpubtHxK/wBWhBmHrKz/GRsrRQw2aIO13eCH6RU200EssNWpZ2OADIK0vlR9J0T0A==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/middleware-endpoint": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.13.tgz", + "integrity": "sha512-x6vn0PjYmGdNuKh/juUJJewZh7MoQ46jYaJ2mvekF4EesMuFfrl4LaW/k97Zjf8PTCPQmPgMvwewg7eNoH9n5w==", + "license": "Apache-2.0", "dependencies": { - "@angular-devkit/core": ">= 20.0.0 < 21.0.0", - "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", - "@angular-eslint/builder": "20.5.1", - "@angular-eslint/eslint-plugin": "20.5.1", - "@angular-eslint/eslint-plugin-template": "20.5.1", - "@angular-eslint/schematics": "20.5.1", - "@angular-eslint/template-parser": "20.5.1", - "@typescript-eslint/types": "^8.0.0", - "@typescript-eslint/utils": "^8.0.0" + "@smithy/core": "^3.22.1", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": "*", - "typescript-eslint": "^8.0.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "license": "MIT", + "node_modules/@smithy/middleware-retry": { + "version": "4.4.30", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.30.tgz", + "integrity": "sha512-CBGyFvN0f8hlnqKH/jckRDz78Snrp345+PVk8Ux7pnkUCW97Iinse59lY78hBt04h1GZ6hjBN94BRwZy1xC8Bg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/service-error-classification": "^4.2.8", + "@smithy/smithy-client": "^4.11.2", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6" + "node": ">=18.0.0" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, + "node_modules/@smithy/middleware-serde": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", + "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", + "license": "Apache-2.0", "dependencies": { - "type-fest": "^0.21.3" + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18.0.0" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" + "node_modules/@smithy/middleware-stack": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", + "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, + "node_modules/@smithy/node-http-handler": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.9.tgz", + "integrity": "sha512-KX5Wml5mF+luxm1szW4QDz32e3NObgJ4Fyw+irhph4I/2geXwUy4jkIMUs5ZPGflRBeR6BUkC2wqIab4Llgm3w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=10" + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, + "node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", + "license": "Apache-2.0", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 8" + "node": ">=18.0.0" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "license": "ISC" + "node_modules/@smithy/querystring-builder": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", + "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "node_modules/@smithy/querystring-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", + "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, + "node_modules/@smithy/service-error-classification": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", + "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=18.0.0" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", + "license": "Apache-2.0", "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18.0.0" } }, - "node_modules/array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", - "license": "MIT", + "node_modules/@smithy/signature-v4": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.8.tgz", + "integrity": "sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==" - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "license": "MIT", + "node_modules/@smithy/smithy-client": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.11.2.tgz", + "integrity": "sha512-SCkGmFak/xC1n7hKRsUr6wOnBTJ3L22Qd4e8H1fQIuKTAjntwgU8lrdMe7uHdiT2mJAOWA/60qaW9tiMu69n1A==", + "license": "Apache-2.0", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" + "@smithy/core": "^3.22.1", + "@smithy/middleware-endpoint": "^4.4.13", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.11", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18.0.0" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", + "node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "node_modules/@smithy/url-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", + "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", + "license": "Apache-2.0", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" + "@smithy/querystring-parser": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18.0.0" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18.0.0" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18.0.0" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18.0.0" } }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "license": "MIT", + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 0.4" + "node": ">=18.0.0" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.29.tgz", + "integrity": "sha512-nIGy3DNRmOjaYaaKcQDzmWsro9uxlaqUOhZDHQed9MW/GmkBZPtnU70Pu1+GT9IBmUXwRdDuiyaeiy9Xtpn3+Q==", + "license": "Apache-2.0", "dependencies": { - "possible-typed-array-names": "^1.0.0" + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.11.2", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18.0.0" } }, - "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", - "license": "MIT", + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.32", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.32.tgz", + "integrity": "sha512-7dtFff6pu5fsjqrVve0YMhrnzJtccCWDacNKOkiZjJ++fmjGExmmSu341x+WU6Oc1IccL7lDuaUj7SfrHpWc5Q==", + "license": "Apache-2.0", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" + "@smithy/config-resolver": "^4.4.6", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.11.2", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, + "node_modules/@smithy/util-endpoints": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", + "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 0.4" + "node": ">=18.0.0" } }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" + "node": ">=18.0.0" } }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", + "license": "Apache-2.0", "dependencies": { - "color-convert": "^2.0.1" + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=18.0.0" } }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/@smithy/util-retry": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", + "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@smithy/service-error-classification": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18.0.0" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, + "node_modules/@smithy/util-stream": { + "version": "4.5.11", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.11.tgz", + "integrity": "sha512-lKmZ0S/3Qj2OF5H1+VzvDLb6kRxGzZHq6f3rAsoSu5cTLGsn3v3VQBA8czkNNXlLjoFEtVu3OQT2jEeOtOE2CA==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.9", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "node_modules/@smithy/util-waiter": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.8.tgz", + "integrity": "sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" + "@smithy/abort-controller": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.0.0" } }, - "node_modules/babel-preset-current-node-syntax": { + "node_modules/@smithy/uuid": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "dev": true, + "license": "MIT" + }, + "node_modules/@swc/core": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.11.tgz", + "integrity": "sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.25" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.11", + "@swc/core-darwin-x64": "1.15.11", + "@swc/core-linux-arm-gnueabihf": "1.15.11", + "@swc/core-linux-arm64-gnu": "1.15.11", + "@swc/core-linux-arm64-musl": "1.15.11", + "@swc/core-linux-x64-gnu": "1.15.11", + "@swc/core-linux-x64-musl": "1.15.11", + "@swc/core-win32-arm64-msvc": "1.15.11", + "@swc/core-win32-ia32-msvc": "1.15.11", + "@swc/core-win32-x64-msvc": "1.15.11" }, "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true } - ] - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "license": "Apache-2.0" + } }, - "node_modules/bin-links": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-5.0.0.tgz", - "integrity": "sha512-sdleLVfCjBtgO5cNjA2HVRvWBJAHs4zwenaCPMNJAJU0yNxpzj80IpjOIimkpkr+mhlA+how5poQtt53PygbHA==", - "license": "ISC", - "dependencies": { - "cmd-shim": "^7.0.0", - "npm-normalize-package-bin": "^4.0.0", - "proc-log": "^5.0.0", - "read-cmd-shim": "^5.0.0", - "write-file-atomic": "^6.0.0" - }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.11.tgz", + "integrity": "sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=10" } }, - "node_modules/bin-links/node_modules/cmd-shim": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-7.0.0.tgz", - "integrity": "sha512-rtpaCbr164TPPh+zFdkWpCyZuKkjpAzODfaZCf/SVJZzJN+4bHQb/LP3Jzq5/+84um3XXY8r548XiWKSborwVw==", - "license": "ISC", + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.11.tgz", + "integrity": "sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=10" } }, - "node_modules/bin-links/node_modules/read-cmd-shim": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-5.0.0.tgz", - "integrity": "sha512-SEbJV7tohp3DAAILbEMPXavBjAnMN0tVnh4+9G8ihV4Pq3HYF9h8QNez9zkJ1ILkv9G2BjdzwctznGZXgu/HGw==", - "license": "ISC", + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.11.tgz", + "integrity": "sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=10" } }, - "node_modules/bin-links/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.11.tgz", + "integrity": "sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10" } }, - "node_modules/bin-links/node_modules/write-file-atomic": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz", - "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.11.tgz", + "integrity": "sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=10" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.11.tgz", + "integrity": "sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" } }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.11.tgz", + "integrity": "sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.11.tgz", + "integrity": "sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.11.tgz", + "integrity": "sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==", + "cpu": [ + "ia32" ], - "dependencies": { - "caniuse-lite": "^1.0.30001716", - "electron-to-chromium": "^1.5.149", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=10" } }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.11.tgz", + "integrity": "sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", + "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", + "devOptional": true, + "license": "Apache-2.0", "dependencies": { - "node-int64": "^0.4.0" + "@swc/counter": "^0.1.3" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/@tokenizer/inflate": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", + "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", + "dev": true, + "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "debug": "^4.4.3", + "token-types": "^6.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true, + "license": "MIT" }, - "node_modules/byte-size": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-8.1.1.tgz", - "integrity": "sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==", + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "license": "MIT", "engines": { - "node": ">=12.17" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/cacache": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.3.tgz", - "integrity": "sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==", - "license": "ISC", + "node_modules/@tufjs/models": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.0.0.tgz", + "integrity": "sha512-h5x5ga/hh82COe+GoD4+gKUeV4T3iaYOxqLt41GRKApinPI7DMidhCmNVTjKfhCWFJIGXaFJee07XczdT4jdZQ==", + "license": "MIT", "dependencies": { - "@npmcli/fs": "^5.0.0", - "fs-minipass": "^3.0.0", - "glob": "^13.0.0", - "lru-cache": "^11.1.0", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^13.0.0", - "unique-filename": "^5.0.0" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/cacache/node_modules/@npmcli/fs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", - "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", - "license": "ISC", + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "balanced-match": "^1.0.0" } }, - "node_modules/cacache/node_modules/glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", - "license": "BlueOak-1.0.0", + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "20 || >=22" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/cacache/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "license": "BlueOak-1.0.0", + "node_modules/@types/aws-lambda": { + "version": "8.10.160", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.160.tgz", + "integrity": "sha512-uoO4QVQNWFPJMh26pXtmtrRfGshPUSpMZGUyUQY20FhfHEElEBOPKgVmFs1z+kbpyBsRs2JnoOPT7++Z4GA9pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz", + "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/type-utils": "8.46.0", + "@typescript-eslint/utils": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "20 || >=22" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/cacache/node_modules/p-map": { + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz", + "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==", "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/cacache/node_modules/ssri": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.0.tgz", - "integrity": "sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==", - "license": "ISC", + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz", + "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==", + "license": "MIT", "dependencies": { - "minipass": "^7.0.3" + "@typescript-eslint/tsconfig-utils": "^8.46.0", + "@typescript-eslint/types": "^8.46.0", + "debug": "^4.3.4" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "node_modules/@typescript-eslint/rule-tester": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/rule-tester/-/rule-tester-8.46.0.tgz", + "integrity": "sha512-cIz9Z9BeL8YHKPVAHaFoSX4H359UPtbl93kRVS+Kx94HtFP48JXKmmUOBGRT/WdRQtpliu7U9pKGbCXYjv2byg==", + "dev": true, + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" + "@typescript-eslint/parser": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/utils": "8.46.0", + "ajv": "^6.12.6", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "4.6.2", + "semver": "^7.6.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/@typescript-eslint/rule-tester/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "node_modules/@typescript-eslint/rule-tester/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz", + "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==", + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz", + "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==", + "license": "MIT", "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz", + "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==", "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/utils": "8.46.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001718", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", - "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, + "node_modules/@typescript-eslint/types": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz", + "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==", + "license": "MIT", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz", + "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.0", + "@typescript-eslint/tsconfig-utils": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { - "restore-cursor": "^5.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=18" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "node_modules/@typescript-eslint/utils": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz", + "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0" + }, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz", + "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==", + "license": "MIT", "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" + "@typescript-eslint/types": "8.46.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/@vitest/expect": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", + "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", + "chai": "^6.2.1", + "tinyrainbow": "^3.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@vitest/mocker": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", + "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" + "@vitest/spy": "4.0.18", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "engines": { - "node": ">= 12" + "node_modules/@vitest/mocker/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/@vitest/pretty-format": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", + "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", + "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "tinyrainbow": "^3.0.3" }, - "engines": { - "node": ">=12" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@vitest/runner": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", + "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "@vitest/utils": "4.0.18", + "pathe": "^2.0.3" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://opencollective.com/vitest" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/@vitest/snapshot": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", + "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" + "@vitest/pretty-format": "4.0.18", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "engines": { - "node": ">=0.8" + "url": "https://opencollective.com/vitest" } }, - "node_modules/cmd-shim": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", - "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node_modules/@vitest/snapshot/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "node_modules/@vitest/spy": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", + "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@vitest/utils": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", + "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@vitest/pretty-format": "4.0.18", + "tinyrainbow": "^3.0.3" }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", - "bin": { - "color-support": "bin.js" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "license": "BSD-2-Clause" }, - "node_modules/columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", - "license": "MIT", + "node_modules/@yarnpkg/parsers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", + "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", + "license": "BSD-2-Clause", "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=18.12.0" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@yarnpkg/parsers/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", - "dev": true, - "engines": { - "node": ">=18" + "sprintf-js": "~1.0.2" } }, - "node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "license": "ISC" - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], + "node_modules/@zkochan/js-yaml": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", + "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, - "node_modules/conventional-changelog-angular": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", - "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", - "dependencies": { - "compare-func": "^2.0.0" - }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "license": "ISC", "engines": { - "node": ">=16" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/conventional-changelog-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-5.0.1.tgz", - "integrity": "sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==", + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", "dependencies": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^6.0.0", - "conventional-commits-parser": "^4.0.0", - "dateformat": "^3.0.3", - "get-pkg-repo": "^4.2.1", - "git-raw-commits": "^3.0.0", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^5.0.0", - "normalize-package-data": "^3.0.3", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0" + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=6.5" } }, - "node_modules/conventional-changelog-core/node_modules/conventional-commits-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz", - "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==", + "node_modules/abortcontroller-polyfill": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.8.tgz", + "integrity": "sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.3.5", - "meow": "^8.1.2", - "split2": "^3.2.2" - }, "bin": { - "conventional-commits-parser": "cli.js" + "acorn": "bin/acorn" }, "engines": { - "node": ">=14" + "node": ">=0.4.0" } }, - "node_modules/conventional-changelog-core/node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/conventional-changelog-core/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/conventional-changelog-core/node_modules/git-raw-commits": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz", - "integrity": "sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==", + "node_modules/airtable": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/airtable/-/airtable-0.12.2.tgz", + "integrity": "sha512-HS3VytUBTKj8A0vPl7DDr5p/w3IOGv6RXL0fv7eczOWAtj9Xe8ri4TAiZRXoOyo+Z/COADCj+oARFenbxhmkIg==", "license": "MIT", "dependencies": { - "dargs": "^7.0.0", - "meow": "^8.1.2", - "split2": "^3.2.2" - }, - "bin": { - "git-raw-commits": "cli.js" + "@types/node": ">=8.0.0 <15", + "abort-controller": "^3.0.0", + "abortcontroller-polyfill": "^1.4.0", + "lodash": "^4.17.21", + "node-fetch": "^2.6.7" }, "engines": { - "node": ">=14" + "node": ">=8.0.0" } }, - "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" + "node_modules/airtable/node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", + "license": "MIT" }, - "node_modules/conventional-changelog-core/node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, "license": "MIT", "dependencies": { - "text-extensions": "^1.0.0" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/conventional-changelog-core/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/angular-eslint": { + "version": "20.5.1", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-20.5.1.tgz", + "integrity": "sha512-7Vx2Vs4u5KO7Kxzo8kMAZnpubtHxK/wBWhBmHrKz/GRsrRQw2aIO13eCH6RU200EssNWpZ2OADIK0vlR9J0T0A==", + "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "@angular-devkit/core": ">= 20.0.0 < 21.0.0", + "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", + "@angular-eslint/builder": "20.5.1", + "@angular-eslint/eslint-plugin": "20.5.1", + "@angular-eslint/eslint-plugin-template": "20.5.1", + "@angular-eslint/schematics": "20.5.1", + "@angular-eslint/template-parser": "20.5.1", + "@typescript-eslint/types": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*", + "typescript-eslint": "^8.0.0" } }, - "node_modules/conventional-changelog-core/node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "type-fest": "^0.21.3" }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, "engines": { "node": ">=10" }, @@ -5949,1744 +7282,2113 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "license": "MIT", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "license": "ISC" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "license": "MIT", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-changelog-core/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dependencies": { - "p-try": "^2.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-changelog-core/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dependencies": { - "p-limit": "^2.2.0" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-changelog-core/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/conventional-changelog-core/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/conventional-changelog-core/node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "license": "ISC", - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/conventional-changelog-core/node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10" + "node": ">=12" } }, - "node_modules/conventional-changelog-core/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" }, - "node_modules/conventional-changelog-core/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/conventional-changelog-preset-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz", - "integrity": "sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==", - "license": "MIT", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { - "node": ">=14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/conventional-changelog-writer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz", - "integrity": "sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==", - "license": "MIT", + "node_modules/aws-cdk-lib": { + "version": "2.237.1", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.237.1.tgz", + "integrity": "sha512-RH8mWHLBtc14stkeUF0gFLaWdS5iS2AHUHnoT5B5LLZfEkYP9G43LjJs0AMmpdlQ5/ZQVvCZ+VB83Q9vLxILRw==", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "table", + "yaml", + "mime-types" + ], + "dev": true, + "license": "Apache-2.0", "dependencies": { - "conventional-commits-filter": "^3.0.0", - "dateformat": "^3.0.3", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "meow": "^8.1.2", - "semver": "^7.0.0", - "split": "^1.0.1" - }, - "bin": { - "conventional-changelog-writer": "cli.js" + "@aws-cdk/asset-awscli-v1": "2.2.263", + "@aws-cdk/asset-node-proxy-agent-v6": "^2.1.0", + "@aws-cdk/cloud-assembly-schema": "^48.20.0", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^11.3.3", + "ignore": "^5.3.2", + "jsonschema": "^1.5.0", + "mime-types": "^2.1.35", + "minimatch": "^3.1.2", + "punycode": "^2.3.1", + "semver": "^7.7.3", + "table": "^6.9.0", + "yaml": "1.10.2" }, "engines": { - "node": ">=14" + "node": ">= 18.0.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" } }, - "node_modules/conventional-changelog-writer/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/aws-cdk-lib/node_modules/ajv": { + "version": "8.17.1", + "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/conventional-changelog-writer/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/conventional-changelog-writer/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/aws-cdk-lib/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "inBundle": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { "node": ">=8" } }, - "node_modules/conventional-changelog-writer/node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "node_modules/aws-cdk-lib/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/conventional-changelog-writer/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/aws-cdk-lib/node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "inBundle": true, "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/conventional-changelog-writer/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/aws-cdk-lib/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/conventional-changelog-writer/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", + "node_modules/aws-cdk-lib/node_modules/case": { + "version": "1.6.3", + "dev": true, + "inBundle": true, + "license": "(MIT OR GPL-3.0-or-later)", "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/conventional-changelog-writer/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/aws-cdk-lib/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/conventional-changelog-writer/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/aws-cdk-lib/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-uri": { + "version": "3.1.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "11.3.3", + "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.14" } }, - "node_modules/conventional-changelog-writer/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/aws-cdk-lib/node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } + "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" }, - "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" + "node_modules/aws-cdk-lib/node_modules/jsonfile": { + "version": "6.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/conventional-changelog-writer/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "license": "(MIT OR CC0-1.0)", + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/conventional-changelog-writer/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", + "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { + "version": "4.4.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/conventional-commits-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz", - "integrity": "sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==", + "node_modules/aws-cdk-lib/node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.1" + "mime-db": "1.52.0" }, "engines": { - "node": ">=14" + "node": ">= 0.6" } }, - "node_modules/conventional-commits-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", - "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "node_modules/aws-cdk-lib/node_modules/minimatch": { + "version": "3.1.2", "dev": true, + "inBundle": true, + "license": "ISC", "dependencies": { - "is-text-path": "^2.0.0", - "JSONStream": "^1.3.5", - "meow": "^12.0.1", - "split2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.mjs" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16" + "node": "*" } }, - "node_modules/conventional-recommended-bump": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-7.0.1.tgz", - "integrity": "sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==", + "node_modules/aws-cdk-lib/node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "inBundle": true, "license": "MIT", - "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^3.0.0", - "conventional-commits-filter": "^3.0.0", - "conventional-commits-parser": "^4.0.0", - "git-raw-commits": "^3.0.0", - "git-semver-tags": "^5.0.0", - "meow": "^8.1.2" - }, + "engines": { + "node": ">=6" + } + }, + "node_modules/aws-cdk-lib/node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/semver": { + "version": "7.7.3", + "dev": true, + "inBundle": true, + "license": "ISC", "bin": { - "conventional-recommended-bump": "cli.js" + "semver": "bin/semver.js" }, "engines": { - "node": ">=14" + "node": ">=10" } }, - "node_modules/conventional-recommended-bump/node_modules/conventional-commits-parser": { + "node_modules/aws-cdk-lib/node_modules/slice-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz", - "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==", + "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.3.5", - "meow": "^8.1.2", - "split2": "^3.2.2" - }, - "bin": { - "conventional-commits-parser": "cli.js" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=14" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/conventional-recommended-bump/node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "node_modules/aws-cdk-lib/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "inBundle": true, "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/conventional-recommended-bump/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/aws-cdk-lib/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "inBundle": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/conventional-recommended-bump/node_modules/git-raw-commits": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz", - "integrity": "sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==", - "license": "MIT", + "node_modules/aws-cdk-lib/node_modules/table": { + "version": "6.9.0", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", "dependencies": { - "dargs": "^7.0.0", - "meow": "^8.1.2", - "split2": "^3.2.2" - }, - "bin": { - "git-raw-commits": "cli.js" + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=14" + "node": ">=10.0.0" } }, - "node_modules/conventional-recommended-bump/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" + "node_modules/aws-cdk-lib/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } }, - "node_modules/conventional-recommended-bump/node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "node_modules/aws-cdk-lib/node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", "dependencies": { - "text-extensions": "^1.0.0" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "license": "Apache-2.0" + }, + "node_modules/bin-links": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-5.0.0.tgz", + "integrity": "sha512-sdleLVfCjBtgO5cNjA2HVRvWBJAHs4zwenaCPMNJAJU0yNxpzj80IpjOIimkpkr+mhlA+how5poQtt53PygbHA==", + "license": "ISC", + "dependencies": { + "cmd-shim": "^7.0.0", + "npm-normalize-package-bin": "^4.0.0", + "proc-log": "^5.0.0", + "read-cmd-shim": "^5.0.0", + "write-file-atomic": "^6.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/conventional-recommended-bump/node_modules/locate-path": { + "node_modules/bin-links/node_modules/cmd-shim": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-7.0.0.tgz", + "integrity": "sha512-rtpaCbr164TPPh+zFdkWpCyZuKkjpAzODfaZCf/SVJZzJN+4bHQb/LP3Jzq5/+84um3XXY8r548XiWKSborwVw==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/bin-links/node_modules/read-cmd-shim": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-5.0.0.tgz", + "integrity": "sha512-SEbJV7tohp3DAAILbEMPXavBjAnMN0tVnh4+9G8ihV4Pq3HYF9h8QNez9zkJ1ILkv9G2BjdzwctznGZXgu/HGw==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/bin-links/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/bin-links/node_modules/write-file-atomic": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz", + "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==", + "license": "ISC", "dependencies": { - "p-locate": "^4.1.0" + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/conventional-recommended-bump/node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bowser": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", + "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/conventional-recommended-bump/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/byte-size": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-8.1.1.tgz", + "integrity": "sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==", "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.17" } }, - "node_modules/conventional-recommended-bump/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", + "node_modules/cacache": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.3.tgz", + "integrity": "sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==", + "license": "ISC", "dependencies": { - "p-limit": "^2.2.0" + "@npmcli/fs": "^5.0.0", + "fs-minipass": "^3.0.0", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^13.0.0", + "unique-filename": "^5.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/conventional-recommended-bump/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/conventional-recommended-bump/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "license": "MIT", + "node_modules/cacache/node_modules/@npmcli/fs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", + "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", + "license": "ISC", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "semver": "^7.3.5" }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/conventional-recommended-bump/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "license": "MIT", + "node_modules/cacache/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "license": "BlueOak-1.0.0", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" }, "engines": { - "node": ">=8" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/conventional-recommended-bump/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/cacache/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": "20 || >=22" } }, - "node_modules/conventional-recommended-bump/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", + "node_modules/cacache/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/conventional-recommended-bump/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", + "@isaacs/brace-expansion": "^5.0.0" + }, "engines": { - "node": ">=8" - } - }, - "node_modules/conventional-recommended-bump/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/conventional-recommended-bump/node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "license": "ISC", - "dependencies": { - "readable-stream": "^3.0.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/conventional-recommended-bump/node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "node_modules/cacache/node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "license": "MIT", "engines": { - "node": ">=0.10" - } - }, - "node_modules/conventional-recommended-bump/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conventional-recommended-bump/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/cacache/node_modules/ssri": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.0.tgz", + "integrity": "sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==", "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, "engines": { - "node": ">=10" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": ">= 0.4" } }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz", - "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==", - "dev": true, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dependencies": { - "jiti": "^2.4.1" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": ">=v18" + "node": ">= 0.4" }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=9", - "typescript": ">=5" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" } }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6" } }, - "node_modules/create-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/dargs": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", - "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/inspect-js" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "license": "MIT", + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": "*" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { - "ms": "^2.1.3" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6.0" + "node": ">=12" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "license": "MIT", + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "engines": { - "node": ">=0.10.0" + "node": ">= 12" } }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "license": "MIT", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "license": "MIT", + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, + "node_modules/cmd-shim": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", + "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "clone": "^1.0.2" + "color-name": "~1.1.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/define-data-property": { + "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, "engines": { - "node": ">=0.4.0" + "node": ">=18" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", "license": "ISC" }, - "node_modules/detect-indent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", - "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", - "dev": true, - "engines": { - "node": ">=12.20" + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "dev": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, + "node_modules/constructs": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.4.5.tgz", + "integrity": "sha512-fOoP70YLevMZr5avJHx2DU3LNYmC6wM8OwdrNewMZou1kZnPGOeVzBrRjZNgFDHUlulYUjkpFRSpTE3D+n+ZSg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", "dependencies": { - "is-obj": "^2.0.0" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" + "node": ">=16" } }, - "node_modules/dotenv-expand": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", - "license": "BSD-2-Clause", + "node_modules/conventional-changelog-conventionalcommits": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.1.0.tgz", + "integrity": "sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA==", + "dev": true, + "license": "ISC", "dependencies": { - "dotenv": "^16.4.5" + "compare-func": "^2.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" + "node": ">=18" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "node_modules/conventional-changelog-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-5.0.1.tgz", + "integrity": "sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==", + "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^6.0.0", + "conventional-commits-parser": "^4.0.0", + "dateformat": "^3.0.3", + "get-pkg-repo": "^4.2.1", + "git-raw-commits": "^3.0.0", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^5.0.0", + "normalize-package-data": "^3.0.3", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=14" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "node_modules/conventional-changelog-core/node_modules/conventional-commits-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz", + "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==", + "license": "MIT", "dependencies": { - "jake": "^10.8.5" + "is-text-path": "^1.0.1", + "JSONStream": "^1.3.5", + "meow": "^8.1.2", + "split2": "^3.2.2" }, "bin": { - "ejs": "bin/cli.js" + "conventional-commits-parser": "cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.152", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.152.tgz", - "integrity": "sha512-xBOfg/EBaIlVsHipHl2VdTPJRSvErNUaqW8ejTq5OlOlIYx1wOllCHsAvAIrr55jD1IYEfdR86miUEt8H5IeJg==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, + "node_modules/conventional-changelog-core/node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "node": ">=8" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "node_modules/conventional-changelog-core/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "license": "MIT", - "optional": true, "dependencies": { - "iconv-lite": "^0.6.2" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/conventional-changelog-core/node_modules/git-raw-commits": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz", + "integrity": "sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==", "license": "MIT", - "optional": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "dargs": "^7.0.0", + "meow": "^8.1.2", + "split2": "^3.2.2" + }, + "bin": { + "git-raw-commits": "cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "license": "ISC" + }, + "node_modules/conventional-changelog-core/node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "license": "MIT", "dependencies": { - "once": "^1.4.0" + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "node_modules/conventional-changelog-core/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.1" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=8.6" + "node": ">=8" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/conventional-changelog-core/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/envinfo": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", - "bin": { - "envinfo": "dist/cli.js" + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "license": "MIT" + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", "dependencies": { - "is-arrayish": "^0.2.1" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "node_modules/conventional-changelog-core/node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" + } + }, + "node_modules/conventional-changelog-core/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-core/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/conventional-changelog-core/node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/conventional-changelog-core/node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/conventional-changelog-core/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/conventional-changelog-core/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", "engines": { - "node": ">= 0.4" + "node": ">=10" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/conventional-changelog-preset-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz", + "integrity": "sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=14" } }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "node_modules/conventional-changelog-writer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz", + "integrity": "sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==", + "license": "MIT", "dependencies": { - "es-errors": "^1.3.0" + "conventional-commits-filter": "^3.0.0", + "dateformat": "^3.0.3", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "meow": "^8.1.2", + "semver": "^7.0.0", + "split": "^1.0.1" + }, + "bin": { + "conventional-changelog-writer": "cli.js" }, "engines": { - "node": ">= 0.4" + "node": ">=14" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "node_modules/conventional-changelog-writer/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "node_modules/conventional-changelog-writer/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "license": "ISC" + }, + "node_modules/conventional-changelog-writer/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "node_modules/conventional-changelog-writer/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "license": "MIT", "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/conventional-changelog-writer/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", - "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", + "node_modules/conventional-changelog-writer/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.4.0", - "@eslint/core": "^0.16.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.37.0", - "@eslint/plugin-kit": "^0.4.0", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" + "p-limit": "^2.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" + "node": ">=8" + } + }, + "node_modules/conventional-changelog-writer/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-writer/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "node_modules/conventional-changelog-writer/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, - "funding": { - "url": "https://opencollective.com/eslint-config-prettier" + "engines": { + "node": ">=8" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "node_modules/conventional-changelog-writer/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", "dependencies": { - "ms": "^2.1.1" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, + "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/conventional-changelog-writer/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/conventional-changelog-writer/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "node_modules/conventional-changelog-writer/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" } }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "node_modules/conventional-commits-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz", + "integrity": "sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==", "license": "MIT", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.1" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + "node": ">=14" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/conventional-commits-parser": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.1.tgz", + "integrity": "sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==", + "dev": true, + "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "meow": "^13.0.0" + }, + "bin": { + "conventional-commits-parser": "dist/cli/index.js" + }, + "engines": { + "node": ">=18" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/conventional-recommended-bump": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-7.0.1.tgz", + "integrity": "sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^3.0.0", + "conventional-commits-filter": "^3.0.0", + "conventional-commits-parser": "^4.0.0", + "git-raw-commits": "^3.0.0", + "git-semver-tags": "^5.0.0", + "meow": "^8.1.2" + }, + "bin": { + "conventional-recommended-bump": "cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, - "node_modules/eslint-plugin-import/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/conventional-recommended-bump/node_modules/conventional-commits-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz", + "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==", + "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "is-text-path": "^1.0.1", + "JSONStream": "^1.3.5", + "meow": "^8.1.2", + "split2": "^3.2.2" }, "bin": { - "json5": "lib/cli.js" + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=14" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" + "node_modules/conventional-recommended-bump/node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/eslint-plugin-import/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/conventional-recommended-bump/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "node_modules/conventional-recommended-bump/node_modules/git-raw-commits": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz", + "integrity": "sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==", + "license": "MIT", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "dargs": "^7.0.0", + "meow": "^8.1.2", + "split2": "^3.2.2" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=14" } }, - "node_modules/eslint-plugin-simple-import-sort": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", - "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", + "node_modules/conventional-recommended-bump/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "license": "ISC" + }, + "node_modules/conventional-recommended-bump/node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "license": "MIT", - "peerDependencies": { - "eslint": ">=5.0.0" + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-unused-imports": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.2.0.tgz", - "integrity": "sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==", + "node_modules/conventional-recommended-bump/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "license": "MIT", - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", - "eslint": "^9.0.0 || ^8.0.0" + "dependencies": { + "p-locate": "^4.1.0" }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "license": "BSD-2-Clause", + "node_modules/conventional-recommended-bump/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/conventional-recommended-bump/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/conventional-recommended-bump/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "p-limit": "^2.2.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=8" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/conventional-recommended-bump/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-recommended-bump/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/conventional-recommended-bump/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "license": "Apache-2.0", + "node_modules/conventional-recommended-bump/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/conventional-recommended-bump/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/conventional-recommended-bump/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "node_modules/conventional-recommended-bump/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/conventional-recommended-bump/node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "license": "ISC", "dependencies": { - "p-locate": "^5.0.0" - }, + "readable-stream": "^3.0.0" + } + }, + "node_modules/conventional-recommended-bump/node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, + "node_modules/conventional-recommended-bump/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -7694,527 +9396,527 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/conventional-recommended-bump/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "license": "BSD-2-Clause", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=14" }, "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "url": "https://github.com/sponsors/d-fischer" }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "peerDependencies": { + "typescript": ">=4.9.5" }, - "engines": { - "node": ">=4" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "node_modules/cosmiconfig-typescript-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.2.0.tgz", + "integrity": "sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==", + "dev": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" + "jiti": "^2.6.1" }, "engines": { - "node": ">=0.10" + "node": ">=v18" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=9", + "typescript": ">=5" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { - "estraverse": "^5.2.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=4.0" + "node": ">= 8" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, "engines": { - "node": ">=4.0" + "node": ">=4" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/dargs": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" } }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "license": "Apache-2.0" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "license": "MIT", "engines": { - "node": ">=8.6.0" + "node": "*" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "ms": "^2.1.3" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } - ] - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dependencies": { - "reusify": "^1.0.4" } }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, - "node_modules/filelist": { + "node_modules/defaults": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dependencies": { - "balanced-match": "^1.0.0" + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "brace-expansion": "^2.0.1" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/find-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", - "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", - "dev": true, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { - "locate-path": "^7.2.0", - "path-exists": "^5.0.0", - "unicorn-magic": "^0.1.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, "engines": { - "node": ">=16" + "node": ">=0.4.0" } }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", + "node_modules/detect-indent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", + "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", + "dev": true, "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=12.20" } }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dependencies": { - "is-callable": "^1.2.7" + "is-obj": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://dotenvx.com" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "license": "BSD-2-Clause", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "dotenv": "^16.4.5" }, "engines": { - "node": ">=14" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://dotenvx.com" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 0.4" } }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/front-matter": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", - "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", + "optional": true, "dependencies": { - "js-yaml": "^3.13.1" + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/front-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "once": "^1.4.0" } }, - "node_modules/front-matter/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "ansi-colors": "^4.1.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "engines": { - "node": ">=14.14" + "node": ">=6" } }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" + "node_modules/envinfo": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "bin": { + "envinfo": "dist/cli.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "license": "MIT", "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -8223,58 +9925,73 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">= 0.4" } }, - "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "dev": true, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, "engines": { - "node": ">=18" + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dependencies": { + "hasown": "^2.0.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.4" } }, - "node_modules/get-intrinsic": { + "node_modules/es-to-primitive": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -8283,308 +10000,390 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=8.0.0" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" } }, - "node_modules/get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", "license": "MIT", "dependencies": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" }, "bin": { - "get-pkg-repo": "src/cli.js" + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/get-pkg-repo/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "bin": { + "eslint-config-prettier": "bin/cli.js" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/get-pkg-repo/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/get-pkg-repo/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "license": "ISC", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" + "ms": "^2.1.1" } }, - "node_modules/get-pkg-repo/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "debug": "^3.2.7" }, "engines": { - "node": ">=10" + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/get-pkg-repo/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "ms": "^2.1.1" } }, - "node_modules/get-pkg-repo/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/get-pkg-repo/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "license": "MIT", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/get-pkg-repo/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", - "dev": true, - "engines": { - "node": ">=12" + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/git-hooks-list": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-3.2.0.tgz", - "integrity": "sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==", - "dev": true, - "funding": { - "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + "node_modules/eslint-plugin-simple-import-sort": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", + "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", + "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" } }, - "node_modules/git-raw-commits": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", - "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", - "dev": true, - "dependencies": { - "dargs": "^8.0.0", - "meow": "^12.0.1", - "split2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.mjs" + "node_modules/eslint-plugin-unused-imports": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.2.0.tgz", + "integrity": "sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==", + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^9.0.0 || ^8.0.0" }, - "engines": { - "node": ">=16" + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } } }, - "node_modules/git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", - "license": "MIT", + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "license": "BSD-2-Clause", "dependencies": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/git-remote-origin-url/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "engines": { - "node": ">=0.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/git-semver-tags": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-5.0.1.tgz", - "integrity": "sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==", - "license": "MIT", + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { - "meow": "^8.1.2", - "semver": "^7.0.0" - }, - "bin": { - "git-semver-tags": "cli.js" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=14" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/git-semver-tags/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/git-semver-tags/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC" - }, - "node_modules/git-semver-tags/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "p-locate": "^4.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/git-semver-tags/node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "license": "MIT", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=10" @@ -8593,354 +10392,404 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/git-semver-tags/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { - "p-try": "^2.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/git-semver-tags/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/git-semver-tags/node_modules/path-exists": { + "node_modules/eslint/node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/git-semver-tags/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "license": "MIT", + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "license": "BSD-2-Clause", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/git-semver-tags/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/git-semver-tags/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "license": "BSD-2-Clause", + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, - "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "license": "(MIT OR CC0-1.0)", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/git-semver-tags/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" } }, - "node_modules/git-semver-tags/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" + "engines": { + "node": ">=6" } }, - "node_modules/git-url-parse": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz", - "integrity": "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==", - "license": "MIT", + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "license": "Apache-2.0" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dependencies": { - "git-up": "^7.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" } }, - "node_modules/gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "license": "BSD", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { - "ini": "^1.3.2" + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/gitconfiglocal/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fast-xml-parser": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.4.tgz", + "integrity": "sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "strnum": "^2.1.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "bin": { + "fxparser": "src/cli/cli.js" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "reusify": "^1.0.4" } }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "dev": true, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", "dependencies": { - "ini": "4.1.1" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16.0.0" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/file-type": { + "version": "21.3.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.0.tgz", + "integrity": "sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tokenizer/inflate": "^0.4.1", + "strtok3": "^10.3.4", + "token-types": "^6.1.1", + "uint8array-extras": "^1.4.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "license": "MIT", + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "minimatch": "^5.0.1" } }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "engines": { - "node": ">= 0.4" + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" } }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.0" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=4.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dependencies": { - "has-symbols": "^1.0.3" + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -8949,362 +10798,371 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", - "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", "dependencies": { - "lru-cache": "^11.1.0" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", - "license": "BlueOak-1.0.0", + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", "engines": { - "node": "20 || >=22" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 14" + "node": ">= 6" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" + "js-yaml": "^3.13.1" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" + "node_modules/front-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "node_modules/husky": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", - "dev": true, - "bin": { - "husky": "bin.js" - }, - "engines": { - "node": ">=18" + "node_modules/front-matter/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/typicode" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": ">= 4" + "node": ">=14.14" } }, - "node_modules/ignore-walk": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", - "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "license": "ISC", "dependencies": { - "minimatch": "^10.0.3" + "minipass": "^7.0.3" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "20 || >=22" - }, + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { - "node": ">=4" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "dev": true, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "license": "MIT", + "dependencies": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "get-pkg-repo": "src/cli.js" + }, "engines": { - "node": ">=0.8.19" + "node": ">=6.9.0" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/get-pkg-repo/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, + "node_modules/get-pkg-repo/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, + "node_modules/get-pkg-repo/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/init-package-json": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-8.2.2.tgz", - "integrity": "sha512-pXVMn67Jdw2hPKLCuJZj62NC9B2OIDd1R3JwZXTHXuEnfN3Uq5kJbKOSld6YEU+KOGfMD82EzxFTYz5o0SSJoA==", + "node_modules/get-pkg-repo/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "license": "ISC", "dependencies": { - "@npmcli/package-json": "^7.0.0", - "npm-package-arg": "^13.0.0", - "promzard": "^2.0.0", - "read": "^4.0.0", - "semver": "^7.7.2", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^6.0.2" + "yallist": "^4.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=10" } }, - "node_modules/inquirer": { - "version": "9.3.8", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.8.tgz", - "integrity": "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==", - "dev": true, + "node_modules/get-pkg-repo/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { - "@inquirer/external-editor": "^1.0.2", - "@inquirer/figures": "^1.0.3", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "node_modules/get-pkg-repo/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/get-pkg-repo/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">= 0.4" + "node": ">=10" } }, - "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", - "license": "MIT", + "node_modules/get-pkg-repo/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", "engines": { - "node": ">= 12" + "node": ">=10" } }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-bigint": { + "node_modules/get-symbol-description": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dependencies": { - "has-bigints": "^1.0.2" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -9313,319 +11171,348 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "node_modules/git-hooks-list": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-3.2.0.tgz", + "integrity": "sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==", + "dev": true, + "funding": { + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + } + }, + "node_modules/git-raw-commits": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "dev": true, + "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.mjs" }, "engines": { - "node": ">= 0.4" + "node": ">=16" + } + }, + "node_modules/git-raw-commits/node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "license": "MIT", + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=4" + } + }, + "node_modules/git-remote-origin-url/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-semver-tags": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-5.0.1.tgz", + "integrity": "sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==", + "license": "MIT", + "dependencies": { + "meow": "^8.1.2", + "semver": "^7.0.0" + }, + "bin": { + "git-semver-tags": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=14" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "node_modules/git-semver-tags/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "license": "MIT", "dependencies": { - "ci-info": "^3.2.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, - "bin": { - "is-ci": "bin.js" + "engines": { + "node": ">=8" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/git-semver-tags/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "license": "ISC" + }, + "node_modules/git-semver-tags/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "node_modules/git-semver-tags/node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "node_modules/git-semver-tags/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" + "p-try": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "node_modules/git-semver-tags/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "license": "MIT", - "bin": { - "is-docker": "cli.js" + "dependencies": { + "p-limit": "^2.2.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/git-semver-tags/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "node_modules/git-semver-tags/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, + "node_modules/git-semver-tags/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, + "node_modules/git-semver-tags/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" + "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "node_modules/git-semver-tags/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "node_modules/git-semver-tags/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "license": "MIT", + "node_modules/git-semver-tags/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/is-number": { + "node_modules/git-up": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "license": "MIT", + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" + "node_modules/git-url-parse": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz", + "integrity": "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==", + "license": "MIT", + "dependencies": { + "git-up": "^7.0.0" } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", + "license": "BSD", + "dependencies": { + "ini": "^1.3.2" } }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "node_modules/gitconfiglocal/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "is-glob": "^4.0.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10.13.0" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "ini": "4.1.1" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-ssh": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", - "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "license": "MIT", - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -9634,15 +11521,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "engines": { "node": ">= 0.4" }, @@ -9650,47 +11532,50 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-text-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", - "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", - "dev": true, - "dependencies": { - "text-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.16" + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" }, "engines": { - "node": ">= 0.4" + "node": ">=0.4.7" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "engines": { "node": ">= 0.4" }, @@ -9698,27 +11583,31 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dependencies": { - "call-bound": "^1.0.3" - }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">= 0.4" + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "dunder-proto": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9727,1089 +11616,822 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, + "node_modules/hosted-git-info": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", + "license": "ISC", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "lru-cache": "^11.1.0" }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, "engines": { "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=10" + "node": ">= 14" } }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 14" } }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=10.17.0" } }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, "bin": { - "jest": "bin/jest.js" + "husky": "bin.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">=18" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 4" } }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, + "node_modules/ignore-walk": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", + "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", + "license": "ISC", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "minimatch": "^10.0.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "color-convert": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=4" } }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "license": "ISC", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, + "node_modules/init-package-json": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-8.2.2.tgz", + "integrity": "sha512-pXVMn67Jdw2hPKLCuJZj62NC9B2OIDd1R3JwZXTHXuEnfN3Uq5kJbKOSld6YEU+KOGfMD82EzxFTYz5o0SSJoA==", + "license": "ISC", "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "@npmcli/package-json": "^7.0.0", + "npm-package-arg": "^13.0.0", + "promzard": "^2.0.0", + "read": "^4.0.0", + "semver": "^7.7.2", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^6.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/inquirer": { + "version": "9.3.8", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.8.tgz", + "integrity": "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@inquirer/external-editor": "^1.0.2", + "@inquirer/figures": "^1.0.3", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=18" } }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, + "node_modules/inversify": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-7.11.0.tgz", + "integrity": "sha512-yZDprSSr8TyVeMGI/AOV4ws6gwjX22hj9Z8/oHAVpJORY6WRFTcUzhnZtibBUHEw2U8ArvHcR+i863DplQ3Cwg==", + "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, + "@inversifyjs/common": "1.5.2", + "@inversifyjs/container": "1.15.0", + "@inversifyjs/core": "9.2.0" + } + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 12" } }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dependencies": { - "color-convert": "^2.0.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dependencies": { - "detect-newline": "^3.0.0" + "has-bigints": "^1.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "node": ">= 0.4" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dependencies": { - "color-convert": "^2.0.1" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "ci-info": "^3.2.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "bin": { + "is-ci": "bin.js" } }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" + "hasown": "^2.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "node": ">= 0.4" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dependencies": { - "color-convert": "^2.0.1" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dependencies": { - "color-convert": "^2.0.1" + "call-bound": "^1.0.3" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "node": ">=8" } }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.12.0" } }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dependencies": { - "color-convert": "^2.0.1" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dependencies": { - "color-convert": "^2.0.1" + "call-bound": "^1.0.3" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/is-ssh": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", + "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "protocols": "^2.0.1" } }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dependencies": { - "color-convert": "^2.0.1" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "which-typed-array": "^1.1.16" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bound": "^1.0.3" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "is-docker": "^2.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/iterare": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", "dev": true, + "license": "ISC", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=10" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/jest-watcher/node_modules/ansi-styles": { + "node_modules/jake/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -10820,11 +12442,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-watcher/node_modules/chalk": { + "node_modules/jake/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10836,41 +12457,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "devOptional": true, + "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -10892,18 +12484,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -10928,8 +12508,7 @@ "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -11015,6 +12594,18 @@ "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", "license": "MIT" }, + "node_modules/just-pascal-case": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/just-pascal-case/-/just-pascal-case-3.2.0.tgz", + "integrity": "sha512-B0PW5mgJrsGmXdvDLxC2Kdfyie74m+mRO+iCjJ+Es0Jl5kcQwVfB0qb/qiDOCE3m0XUOo1SdZBWzUlNCO9zreg==", + "license": "MIT" + }, + "node_modules/just-snake-case": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/just-snake-case/-/just-snake-case-3.2.0.tgz", + "integrity": "sha512-iugHP9bSE0jOq3BzN0W0rdu/OOkFirPe8FtUw6v9y37UlbUDgJ1x4xiGNfUhI6mV9dc/paaifyiyn+F+mrm8gw==", + "license": "MIT" + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -11033,15 +12624,6 @@ "node": ">=0.10.0" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/lerna": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/lerna/-/lerna-9.0.3.tgz", @@ -11193,6 +12775,12 @@ } } }, + "node_modules/lerna/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/lerna/node_modules/execa": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", @@ -11351,6 +12939,34 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/lerna/node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lerna/node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/lerna/node_modules/picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", @@ -11449,15 +13065,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -11795,6 +13402,26 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/load-esm": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz", + "integrity": "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + }, + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/borewit" + } + ], + "license": "MIT", + "engines": { + "node": ">=13.2.0" + } + }, "node_modules/load-json-file": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", @@ -11810,26 +13437,28 @@ "node": ">=8" } }, - "node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.ismatch": { "version": "4.4.0", @@ -11837,23 +13466,12 @@ "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "license": "MIT" }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, "node_modules/lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -11864,31 +13482,29 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.startcase": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.upperfirst": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", @@ -12078,15 +13694,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", @@ -12111,12 +13718,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, "node_modules/make-fetch-happen": { "version": "15.0.2", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.2.tgz", @@ -12139,15 +13740,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -12169,12 +13761,13 @@ } }, "node_modules/meow": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", - "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16.10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -12205,6 +13798,21 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", + "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -12495,10 +14103,30 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -12519,6 +14147,26 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "license": "MIT" }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-gyp": { "version": "11.5.0", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", @@ -12716,9 +14364,9 @@ } }, "node_modules/node-gyp/node_modules/tar": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", - "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -12779,24 +14427,12 @@ "node": ">=18" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, "node_modules/node-machine-id": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", "license": "MIT" }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true - }, "node_modules/nopt": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", @@ -12857,15 +14493,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-bundled": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", @@ -13338,6 +14965,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -13398,6 +15036,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -13421,6 +15060,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -13436,6 +15076,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13452,6 +15093,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -13464,6 +15106,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -13511,48 +15154,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate/node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -13589,27 +15190,21 @@ } }, "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.0.tgz", + "integrity": "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==", "license": "MIT", "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" + "eventemitter3": "^5.0.1", + "p-timeout": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue/node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, "node_modules/p-reduce": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", @@ -13619,15 +15214,15 @@ } }, "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, "engines": { - "node": ">=8" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -13796,9 +15391,9 @@ } }, "node_modules/pacote/node_modules/tar": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", - "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -13914,24 +15509,6 @@ "parse-path": "^7.0.0" } }, - "node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -13970,6 +15547,17 @@ "node": "20 || >=22" } }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -13991,6 +15579,13 @@ "node": ">=4" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -14031,15 +15626,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -14115,6 +15701,35 @@ "node": ">= 0.4" } }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/postcss-selector-parser": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", @@ -14151,20 +15766,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/proc-log": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", @@ -14220,19 +15821,6 @@ "node": ">=10" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/promzard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/promzard/-/promzard-2.0.0.tgz", @@ -14265,22 +15853,6 @@ "node": ">=6" } }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -14537,6 +16109,12 @@ "node": ">=8" } }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -14589,7 +16167,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -14807,11 +16384,57 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, "node_modules/run-async": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -15077,6 +16700,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -15099,12 +16729,6 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -15245,14 +16869,14 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, "node_modules/spdx-correct": { @@ -15304,6 +16928,7 @@ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 10.x" } @@ -15326,26 +16951,19 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } + "license": "MIT" }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/stdin-discarder": { "version": "0.2.2", @@ -15385,22 +17003,9 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, + "dev": true, "engines": { - "node": ">=10" + "node": ">=0.6.19" } }, "node_modules/string-width": { @@ -15564,6 +17169,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", + "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/strtok3": { + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", + "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -15692,32 +17326,6 @@ "node": ">=4" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-extensions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", - "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -15763,19 +17371,31 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, "node_modules/tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -15785,9 +17405,13 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -15798,9 +17422,10 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -15808,11 +17433,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true + "node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -15825,6 +17454,31 @@ "node": ">=8.0" } }, + "node_modules/token-types": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", + "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@borewit/text-codec": "^0.2.1", + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -15863,67 +17517,6 @@ "typescript": ">=4.8.4" } }, - "node_modules/ts-jest": { - "version": "29.3.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.2.tgz", - "integrity": "sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==", - "dev": true, - "dependencies": { - "bs-logger": "^0.2.6", - "ejs": "^3.1.10", - "fast-json-stable-stringify": "^2.1.0", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.7.1", - "type-fest": "^4.39.1", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -15977,15 +17570,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", @@ -16119,6 +17703,32 @@ "node": ">=0.8.0" } }, + "node_modules/uid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", + "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lukeed/csprng": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -16143,18 +17753,6 @@ "devOptional": true, "license": "MIT" }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/unique-filename": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-5.0.0.tgz", @@ -16194,6 +17792,50 @@ "node": ">= 10.0.0" } }, + "node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-swc": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/unplugin-swc/-/unplugin-swc-1.5.9.tgz", + "integrity": "sha512-RKwK3yf0M+MN17xZfF14bdKqfx0zMXYdtOdxLiE6jHAoidupKq3jGdJYANyIM1X/VmABhh1WpdO+/f4+Ol89+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.3.0", + "load-tsconfig": "^0.2.5", + "unplugin": "^2.3.11" + }, + "peerDependencies": { + "@swc/core": "^1.2.108" + } + }, + "node_modules/unplugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/upath": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", @@ -16204,93 +17846,256 @@ "yarn": "*" } }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", + "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "terser": { + "optional": true }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } - ], - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" + "node_modules/vitest": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", + "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.18", + "@vitest/mocker": "4.0.18", + "@vitest/pretty-format": "4.0.18", + "@vitest/runner": "4.0.18", + "@vitest/snapshot": "4.0.18", + "@vitest/spy": "4.0.18", + "@vitest/utils": "4.0.18", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" }, "engines": { - "node": ">=10.12.0" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.18", + "@vitest/browser-preview": "4.0.18", + "@vitest/browser-webdriverio": "4.0.18", + "@vitest/ui": "4.0.18", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "license": "Apache-2.0", + "node_modules/vitest/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/validate-npm-package-name": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", - "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", - "license": "ISC", + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/walk-up-path": { @@ -16302,15 +18107,6 @@ "node": "20 || >=22" } }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -16319,6 +18115,29 @@ "defaults": "^1.0.3" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -16419,6 +18238,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -16507,19 +18343,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/write-json-file": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", @@ -16628,12 +18451,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/yaml": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", @@ -16693,24 +18510,86 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/airtable-mapper": { + "name": "@shiftcode/airtable-mapper", + "version": "1.0.0-pr254.4", + "license": "MIT", + "engines": { + "node": ">=22.10.2" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "packages/airtable-syncer": { + "name": "@shiftcode/airtable-syncer", + "version": "1.0.0-pr254.4", + "license": "MIT", + "dependencies": { + "airtable": "^0.12.2", + "p-queue": "^9.0.1" + }, + "devDependencies": { + "@shiftcode/airtable-mapper": "^1.0.0-pr254.4", + "@shiftcode/inversify-logger": "^1.0.0-pr254.4", + "@shiftcode/lambda-utilities": "^1.0.0-pr254.4", + "@shiftcode/logger": "^5.0.0-pr254.7", + "@swc/core": "^1.15.11", + "unplugin-swc": "^1.5.9" + }, + "engines": { + "node": ">=22.10.2" + }, + "peerDependencies": { + "@aws-sdk/client-sns": "^3.188.0", + "@shiftcode/airtable-mapper": "^1.0.0 || ^1.0.0-pr254", + "@shiftcode/inversify-logger": "^1.0.0 || ^1.0.0-pr254", + "@shiftcode/lambda-utilities": "^1.0.0 || ^1.0.0-pr254", + "@shiftcode/logger": "^5.0.0 || 5.0.0-pr254", + "date-fns": "^4.0.0", + "inversify": "^7.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "tslib": "^2.3.0" + } + }, "packages/branch-utilities": { "name": "@shiftcode/branch-utilities", - "version": "5.1.1", + "version": "6.0.0-pr254.7", + "license": "MIT", + "engines": { + "node": ">=22.10.2" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "packages/cdk-utilities": { + "name": "@shiftcode/cdk-utilities", + "version": "1.0.0-pr254.4", "license": "MIT", + "dependencies": { + "just-pascal-case": "^3.2.0" + }, + "devDependencies": { + "aws-cdk-lib": "^2.3.0", + "constructs": "^10.0.0" + }, "engines": { - "node": "^20.0.0 || ^22.0.0" + "node": ">=22.10.2" }, "peerDependencies": { + "aws-cdk-lib": "^2.3.0", + "constructs": "^10.0.0", "tslib": "^2.3.0" } }, "packages/eslint-config-recommended": { "name": "@shiftcode/eslint-config-recommended", - "version": "6.1.0", - "license": "UNLICENSED", + "version": "7.0.0-pr254.7", + "license": "MIT", "dependencies": { "@eslint/js": "^9.37.0", - "@shiftcode/eslint-plugin-rules": "^5.0.1", + "@shiftcode/eslint-plugin-rules": "^6.0.0-pr254.7", "eslint": "^9.37.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", @@ -16722,7 +18601,7 @@ "angular-eslint": "^20.5.1" }, "engines": { - "node": "^20.0.0 || ^22.0.0" + "node": ">=22.10.2" }, "peerDependencies": { "angular-eslint": "^20.5.1 || ^21.0.0" @@ -16735,8 +18614,8 @@ }, "packages/eslint-plugin-rules": { "name": "@shiftcode/eslint-plugin-rules", - "version": "5.0.1", - "license": "UNLICENSED", + "version": "6.0.0-pr254.7", + "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^8.46.0" }, @@ -16745,29 +18624,188 @@ "@typescript-eslint/rule-tester": "^8.46.0" }, "engines": { - "node": "^20.0.0 || ^22.0.0" + "node": ">=22.10.2" }, "peerDependencies": { "eslint": "^9.37.0" } }, + "packages/iac-utilities": { + "name": "@shiftcode/iac-utilities", + "version": "1.0.0-pr254.4", + "license": "MIT", + "dependencies": { + "ajv": "^8.16.0", + "fast-glob": "^3.2.10", + "just-snake-case": "^3.2.0", + "mime": "^4.0.4", + "yargs": "^17.2.1" + }, + "bin": { + "aws-env-vars": "dist/aws-env-vars.js", + "aws-sso-configure-profiles": "dist/aws-sso-configure-profiles.js", + "credentials-helper": "dist/credentials-helper.js", + "export-base-runtime-config": "dist/export-base-runtime-config.js", + "export-stack-outputs": "dist/export-stack-outputs.js", + "export-stage-info": "dist/export-stage-info.js", + "fetch-client-config": "dist/fetch-client-config.js", + "invalidate-cf-cache": "dist/invalidate-cf-cache.js", + "publish-client-to-s3": "dist/upload-to-s3.js", + "stage-info": "dist/stage-info.js", + "stage-override-to-pr-base": "dist/stage-override-to-pr-base.js", + "upload-to-s3": "dist/upload-to-s3.js" + }, + "devDependencies": { + "@aws-sdk/client-cloudformation": "^3.204.0", + "@aws-sdk/client-cloudfront": "^3.204.0", + "@aws-sdk/client-s3": "^3.204.0", + "@aws-sdk/credential-providers": "^3.204.0", + "@aws-sdk/types": "^3.201.0", + "@shiftcode/branch-utilities": "^6.0.0-pr254.7", + "@shiftcode/lambda-utilities": "^1.0.0-pr254.4", + "@types/yargs": "^17.0.5" + }, + "engines": { + "node": ">=22.10.2" + }, + "peerDependencies": { + "@aws-sdk/client-cloudformation": "^3.204.0", + "@aws-sdk/client-cloudfront": "^3.204.0", + "@aws-sdk/client-s3": "^3.204.0", + "@aws-sdk/credential-providers": "^3.204.0", + "@aws-sdk/types": "^3.201.0", + "@shiftcode/branch-utilities": "^6.0.0 || ^6.0.0-pr254", + "@shiftcode/lambda-utilities": "^1.0.0 || ^1.0.0-pr254", + "tslib": "^2.3.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-cloudformation": { + "optional": true + }, + "@aws-sdk/client-cloudfront": { + "optional": true + }, + "@aws-sdk/client-s3": { + "optional": true + }, + "@aws-sdk/credential-providers": { + "optional": true + }, + "@aws-sdk/types": { + "optional": true + }, + "@shiftcode/branch-utilities": { + "optional": true + } + } + }, + "packages/inversify-logger": { + "name": "@shiftcode/inversify-logger", + "version": "1.0.0-pr254.4", + "license": "MIT", + "devDependencies": { + "@shiftcode/logger": "^5.0.0-pr254.7", + "inversify": "^7.0.0", + "reflect-metadata": "^0.2.0" + }, + "engines": { + "node": ">=22.10.2" + }, + "peerDependencies": { + "@shiftcode/logger": "^5.0.0 || ^5.0.0-pr254", + "inversify": "^7.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0" + } + }, + "packages/lambda-utilities": { + "name": "@shiftcode/lambda-utilities", + "version": "1.0.0-pr254.4", + "license": "MIT", + "devDependencies": { + "@aws-sdk/client-s3": "^3.204.0", + "@aws-sdk/client-ssm": "^3.204.0", + "@shiftcode/inversify-logger": "^1.0.0-pr254.4", + "@shiftcode/logger": "^5.0.0-pr254.7", + "@shiftcode/utilities": "^5.0.0-pr254.7", + "@types/aws-lambda": "^8.10.89", + "inversify": "^7.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0" + }, + "engines": { + "node": ">=22.10.2" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.204.0", + "@aws-sdk/client-ssm": "^3.204.0", + "@shiftcode/inversify-logger": "^1.0.0 || 1.0.0-pr254", + "@shiftcode/logger": "^5.0.0 || ^5.0.0-pr254", + "@shiftcode/utilities": "^5.0.0 || ^5.0.0-pr254", + "@types/aws-lambda": "^8.10.89", + "inversify": "^7.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "tslib": "^2.3.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-s3": { + "optional": true + }, + "@aws-sdk/client-ssm": { + "optional": true + }, + "@shiftcode/inversify-logger": { + "optional": true + }, + "@shiftcode/logger": { + "optional": true + }, + "inversify": { + "optional": true + }, + "reflect-metadata": { + "optional": true + } + } + }, "packages/logger": { "name": "@shiftcode/logger", - "version": "4.0.0", - "license": "UNLICENSED", + "version": "5.0.0-pr254.7", + "license": "MIT", + "devDependencies": { + "@shiftcode/utilities": "^5.0.0-pr254.7" + }, + "engines": { + "node": ">=22.10.2" + }, + "peerDependencies": { + "@shiftcode/utilities": "^5.0.0 || ^5.0.0-pr254" + } + }, + "packages/nest-logger": { + "name": "@shiftcode/nest-logger", + "version": "1.0.0-pr254.4", + "license": "MIT", "devDependencies": { - "@shiftcode/utilities": "^4.3.1" + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/testing": "^11.0.0", + "@shiftcode/logger": "^5.0.0-pr254.7", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "rxjs": "^7.1.0" }, "engines": { - "node": "^22.0.0 || ^24.0.0" + "node": ">=22.10.2" }, "peerDependencies": { - "@shiftcode/utilities": "^4.0.0" + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@shiftcode/logger": "^5.0.0 || ^5.0.0-pr254", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "rxjs": "^7.1.0" } }, "packages/publish-helper": { "name": "@shiftcode/publish-helper", - "version": "5.0.0", + "version": "6.0.0-pr254.7", "license": "MIT", "dependencies": { "conventional-changelog-angular": "^8.0.0", @@ -16778,14 +18816,14 @@ "publish-lib": "dist/publish-lib.js" }, "devDependencies": { - "@shiftcode/branch-utilities": "^5.1.1", + "@shiftcode/branch-utilities": "^6.0.0-pr254.7", "@types/yargs": "^17.0.32" }, "engines": { - "node": "^20.0.0 || ^22.0.0" + "node": ">=22.10.2" }, "peerDependencies": { - "@shiftcode/branch-utilities": "^5.1.1", + "@shiftcode/branch-utilities": "^6.0.0 || ^6.0.0-pr254", "lerna": "^9.0.3", "tslib": "^2.3.0" } @@ -16803,10 +18841,10 @@ }, "packages/utilities": { "name": "@shiftcode/utilities", - "version": "4.3.1", + "version": "5.0.0-pr254.7", "license": "MIT", "engines": { - "node": "^20.0.0 || ^22.0.0" + "node": ">=22.10.2" }, "peerDependencies": { "tslib": "^2.3.0" diff --git a/package.json b/package.json index 2ab73176..c68d0aa9 100644 --- a/package.json +++ b/package.json @@ -13,31 +13,25 @@ "build:lint:ci": "lerna run build --scope @shiftcode/eslint-plugin-rules && lerna run build --scope @shiftcode/eslint-config-recommended", "format": "prettier --write .", "format:ci": "prettier --check .", - "format:staged": "prettier --write --ignore-unknown", "lint:ci": "lerna run lint:ci", "prepare": "husky", "publish-libs": "node packages/publish-helper/dist/publish-lib", "test:ci": "lerna run test:ci" }, - "dependencies": { - "lerna": "^9.0.3", - "tslib": "^2.3.0" - }, "devDependencies": { - "@commitlint/cli": "^19.3.0", - "@commitlint/config-angular": "^19.3.0", - "@commitlint/prompt-cli": "^19.3.1", - "@jest/globals": "^29.5.0", - "@types/jest": "^29.5.12", + "@commitlint/cli": "^20.4.1", + "@commitlint/config-conventional": "^20.4.1", + "@commitlint/prompt-cli": "^20.4.1", "@types/node": "^22.15.0", "eslint": "^9.36.0", "husky": "^9.0.11", - "jest": "^29.7.0", + "lerna": "^9.0.3", "lint-staged": "^15.2.7", "prettier": "^3.3.2", "sort-package-json": "^2.10.0", - "ts-jest": "^29.2.0", - "typescript": "^5.5.3" + "tslib": "^2.3.0", + "typescript": "^5.5.3", + "vitest": "^4.0.18" }, "engines": { "node": "^22.15.0" diff --git a/packages/airtable-mapper/CHANGELOG.md b/packages/airtable-mapper/CHANGELOG.md new file mode 100644 index 00000000..2795a69a --- /dev/null +++ b/packages/airtable-mapper/CHANGELOG.md @@ -0,0 +1,199 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [8.0.2](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-mapping@8.0.1...@shiftcode/airtable-mapping@8.0.2) (2025-03-06) + +### Bug Fixes + +- update engines definition (left over from node 22 upgrade) ([f5428ae](https://github.com/shiftcode/sc-commons/commit/f5428ae64c45567912887b8bab1e881c4312669f)) + +## [8.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-mapping@8.0.0...@shiftcode/airtable-mapping@8.0.1) (2025-03-04) + +**Note:** Version bump only for package @shiftcode/airtable-mapping + +# [8.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-mapping@7.0.0...@shiftcode/airtable-mapping@8.0.0) (2024-07-13) + +### Build System + +- **node:** upgrade to node 20 ([2899d0d](https://github.com/shiftcode/sc-commons/commit/2899d0d41ece080b276e7bf84915d4849da81a29)) + +### BREAKING CHANGES + +- **node:** Minimum required node version is 20.11.1. In general speaking the runtime (Node or Browser) must support all es2023 features. + +# [7.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-mapping@6.3.0...@shiftcode/airtable-mapping@7.0.0) (2024-07-08) + +### Features + +- **airtable-mapping:** remove obsolete constructor argument ([a528743](https://github.com/shiftcode/sc-commons/commit/a5287436ba0913c61122b0c8a330856a741cd0d5)) + +### BREAKING CHANGES + +- **airtable-mapping:** The AirtableMapping constructor does no longer accept two arguments. Instead we assume the modelName and tableName are equal. + +# [6.3.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-mapping@6.2.1...@shiftcode/airtable-mapping@6.3.0) (2023-12-18) + +### Features + +- **eslint-config:** disabled mt-specific config and added curly, eqeqeq ([9b2c7a0](https://github.com/shiftcode/sc-commons/commit/9b2c7a0e668949c022d8338e619fda09615c0dad)) + +## [6.2.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-mapping@6.2.0...@shiftcode/airtable-mapping@6.2.1) (2023-10-18) + +**Note:** Version bump only for package @shiftcode/airtable-mapping + +# [6.2.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-mapping@6.1.1...@shiftcode/airtable-mapping@6.2.0) (2023-07-27) + +### Bug Fixes + +- **airtable-mapping:** mark the KeyValue mapping with a symbol ([72ff48f](https://github.com/shiftcode/sc-commons/commit/72ff48fae8788ae8c8e7d37062fcf9ced4bf49ed)) + +### Features + +- **airtable-mapping:** add types & module field to package.json ([a6bb32a](https://github.com/shiftcode/sc-commons/commit/a6bb32a7c0a6e75ccb7bad9bf1f4f40a11cdcb22)) + +## [6.1.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-mapping@6.1.0...@shiftcode/airtable-mapping@6.1.1) (2023-06-01) + +**Note:** Version bump only for package @shiftcode/airtable-mapping + +# [6.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-mapping@6.0.0...@shiftcode/airtable-mapping@6.1.0) (2023-06-01) + +### Features + +- **eslint-config:** add eslint-disable comments ([3716577](https://github.com/shiftcode/sc-commons/commit/37165771b8ac0e94bdcc7f90b55e41d358db9d65)) + +# [6.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-mapping@5.1.0...@shiftcode/airtable-mapping@6.0.0) (2023-05-15) + +### Features + +- **airtable-mapping:** migrate to ESM (different related changes) ([9a24a58](https://github.com/shiftcode/sc-commons/commit/9a24a58ebfeecff7b3025f8d8e85e9379e1980df)) + +### BREAKING CHANGES + +- **airtable-mapping:** only supported in projects using ESM + +# [5.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-mapping@5.0.0...@shiftcode/airtable-mapping@5.1.0) (2023-03-17) + +### Features + +- **eslint-plugin:** introduce tests to verify correct implementation of plugins ([76d5b2f](https://github.com/shiftcode/sc-commons/commit/76d5b2f2bea5a3f4450e7ce43153fc2ddba832c1)) + +# [5.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-mapping@4.0.1...@shiftcode/airtable-mapping@5.0.0) (2023-03-16) + +### Build System + +- **tsconfig:** build for es2021 target ([3b01b71](https://github.com/shiftcode/sc-commons/commit/3b01b712e88dc88a4033e770fb1fe0527a0f78cf)) + +### BREAKING CHANGES + +- **tsconfig:** requires ES2021 support + +## 4.0.1 (2022-01-11) + +- build(release): next version [skip_build] ([911da02](https://github.com/shiftcode/sc-commons/commit/911da02)) +- build(release): next version [skip_build] ([199066e](https://github.com/shiftcode/sc-commons/commit/199066e)) +- build(release): next version [skip_build] ([0c839e4](https://github.com/shiftcode/sc-commons/commit/0c839e4)) +- build(release): next version [skip_build] ([2722982](https://github.com/shiftcode/sc-commons/commit/2722982)) +- build(release): next version [skip_build] ([a0e996a](https://github.com/shiftcode/sc-commons/commit/a0e996a)) +- build(release): next version [skip_build] ([8d72402](https://github.com/shiftcode/sc-commons/commit/8d72402)) +- build(release): next version [skip_build] ([7bca45d](https://github.com/shiftcode/sc-commons/commit/7bca45d)) +- build(release): next version [skip_build] ([82c65ba](https://github.com/shiftcode/sc-commons/commit/82c65ba)) +- build(release): next version [skip_build] ([8589cd3](https://github.com/shiftcode/sc-commons/commit/8589cd3)) +- build(release): next version [skip_build] ([aaebf67](https://github.com/shiftcode/sc-commons/commit/aaebf67)) +- build(release): next version [skip_build] ([e38c9a6](https://github.com/shiftcode/sc-commons/commit/e38c9a6)) +- build(release): next version [skip_build] ([9470e94](https://github.com/shiftcode/sc-commons/commit/9470e94)) +- build(release): next version [skip_build] ([7a83884](https://github.com/shiftcode/sc-commons/commit/7a83884)) +- build(release): next version [skip_build] ([0ca65a3](https://github.com/shiftcode/sc-commons/commit/0ca65a3)) +- build(scripts): use rm -rf instead of rimraf ([de45957](https://github.com/shiftcode/sc-commons/commit/de45957)) +- chore(jest.config): fix import of utils ([29cab2c](https://github.com/shiftcode/sc-commons/commit/29cab2c)) + +## 4.0.0 (2021-12-23) + +- build(release): next version [skip ci] ([d3b33ba](https://github.com/shiftcode/sc-commons/commit/d3b33ba)) +- build(release): next version [skip ci] ([87c30b4](https://github.com/shiftcode/sc-commons/commit/87c30b4)) +- build(release): next version [skip ci] ([16d5995](https://github.com/shiftcode/sc-commons/commit/16d5995)) +- build(release): next version [skip ci] ([d7b6d61](https://github.com/shiftcode/sc-commons/commit/d7b6d61)) +- build(release): next version [skip ci] ([76a41a6](https://github.com/shiftcode/sc-commons/commit/76a41a6)) +- build(release): next version [skip ci] ([44d8085](https://github.com/shiftcode/sc-commons/commit/44d8085)) +- build(release): next version [skip ci] ([4a2a73d](https://github.com/shiftcode/sc-commons/commit/4a2a73d)) +- build(release): next version [skip ci] ([ac3ac7f](https://github.com/shiftcode/sc-commons/commit/ac3ac7f)) +- build(release): next version [skip ci] ([14622a2](https://github.com/shiftcode/sc-commons/commit/14622a2)) +- build(release): next version [skip ci] ([3199b0c](https://github.com/shiftcode/sc-commons/commit/3199b0c)) +- build(release): next version [skip ci] ([652b10b](https://github.com/shiftcode/sc-commons/commit/652b10b)) +- build(release): next version [skip ci] ([78e4b60](https://github.com/shiftcode/sc-commons/commit/78e4b60)) +- build(release): next version [skip ci] ([006c0be](https://github.com/shiftcode/sc-commons/commit/006c0be)) +- build(release): next version [skip ci] ([6285743](https://github.com/shiftcode/sc-commons/commit/6285743)) +- build(release): next version [skip ci] ([2e01006](https://github.com/shiftcode/sc-commons/commit/2e01006)) +- build(release): next version [skip ci] ([f66b3c3](https://github.com/shiftcode/sc-commons/commit/f66b3c3)) +- build(release): next version [skip ci] ([69cc0f4](https://github.com/shiftcode/sc-commons/commit/69cc0f4)) +- build(release): next version [skip ci] ([921f9f0](https://github.com/shiftcode/sc-commons/commit/921f9f0)) +- build(release): next version [skip ci] ([25993ec](https://github.com/shiftcode/sc-commons/commit/25993ec)) +- build(release): next version [skip ci] ([1fed9a1](https://github.com/shiftcode/sc-commons/commit/1fed9a1)) +- build(release): next version [skip ci] ([cd44cac](https://github.com/shiftcode/sc-commons/commit/cd44cac)) +- refactor(\*): replace npm run with yarn ([238adbc](https://github.com/shiftcode/sc-commons/commit/238adbc)) +- refactor(\*): replace yarn run with yarn ([ef0d2f7](https://github.com/shiftcode/sc-commons/commit/ef0d2f7)) +- refactor(\*): unify READMEs title ([b779764](https://github.com/shiftcode/sc-commons/commit/b779764)) +- revert(version): back to pr ([daf8058](https://github.com/shiftcode/sc-commons/commit/daf8058)) +- fix(package.json): author ([67db3f3](https://github.com/shiftcode/sc-commons/commit/67db3f3)) +- fix(package.json): correctly set sideEffects property ([11e30b5](https://github.com/shiftcode/sc-commons/commit/11e30b5)) +- style(specs): fix various lint stuff ([c8b1d06](https://github.com/shiftcode/sc-commons/commit/c8b1d06)) +- test(jest): update rename tsconfig.spec and update jest ([30a28ff](https://github.com/shiftcode/sc-commons/commit/30a28ff)) +- feat(typescript): use typescript 4.4 and require tslib ^2.3 ([3524ecd](https://github.com/shiftcode/sc-commons/commit/3524ecd)) + +### BREAKING CHANGE + +- requires tslib ^2.3 + +## 3.0.1 (2020-10-06) + +- chore(lint-staged): update all configuration files ([ac86637](https://github.com/shiftcode/sc-commons/commit/ac86637)) + +## 3.0.0 (2020-05-19) + +- feat(typescript): update to typescript 3.9 ([1dc45f5](https://github.com/shiftcode/sc-commons/commit/1dc45f5)) + +### BREAKING CHANGE + +- tslib 2.0.0 required for typescript update + +## 2.0.3 (2019-12-04) + +- chore(deps): bumb a few dev dependencies ([16781af](https://github.com/shiftcode/sc-commons/commit/16781af)) + +## 2.0.2 (2019-12-04) + +**Note:** Version bump only for package @shiftcode/airtable-mapping + +## 2.0.1 (2019-12-04) + +- build(\*): update tsconfig and doc ([71c35a8](https://github.com/shiftcode/sc-commons/commit/71c35a8)) +- build(tsconfig): remove unnecesarry lib declaration ([9894dc1](https://github.com/shiftcode/sc-commons/commit/9894dc1)) +- build(yarn): migrate to yarn workspace ([8811814](https://github.com/shiftcode/sc-commons/commit/8811814)) + +# [2.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-mapping@1.0.0...@shiftcode/airtable-mapping@2.0.0) (2019-11-07) + +### Bug Fixes + +- **airtable-sync:** typings, tests ([4160976](https://github.com/shiftcode/sc-commons/commit/4160976cd61a64418a645dc1cd9bda7da5f8b70e)) + +### Features + +- **airtable-mapping:** export by language ([4031c94](https://github.com/shiftcode/sc-commons/commit/4031c945452cbdbc1adfcb19d4ff25f971887145)) + +### BREAKING CHANGES + +- **airtable-mapping:** - its now necessary to specify the supported languages in AirtableSyncConfig + +* json files will always receive a `_{lang}.json` suffix in name +* you need to use the exported keyValueMapping for `addMapping(...)` (and use the marker type `KeyValueString` in the model for such types) + +# 1.0.0 (2019-10-24) + +### Code Refactoring + +- **airtable:** fix stuff, split into 2 packages ([345f57b](https://github.com/shiftcode/sc-commons/commit/345f57bc86f2cd587b9da1a521cc724b3eb9d6f2)) + +### BREAKING CHANGES + +- **airtable:** - two packages diff --git a/packages/airtable-mapper/README.md b/packages/airtable-mapper/README.md new file mode 100644 index 00000000..bc69a6b2 --- /dev/null +++ b/packages/airtable-mapper/README.md @@ -0,0 +1,8 @@ +# airtable-mapper + +> 🎯 Target runtime: es2023 ([Browser](https://caniuse.com/?search=es2023) & ([Node >= 20](https://node.green/#ES2023)) + +Module to create the airtable models and their mapping + +Is a zero dependency package, so we can use it in the client\ +(if combining with airtable-syncer package, we're no longer able to use actual models in client code) diff --git a/packages/branch-utilities/eslint.config.mjs b/packages/airtable-mapper/eslint.config.js similarity index 100% rename from packages/branch-utilities/eslint.config.mjs rename to packages/airtable-mapper/eslint.config.js diff --git a/packages/airtable-mapper/lint-staged.config.js b/packages/airtable-mapper/lint-staged.config.js new file mode 100644 index 00000000..165242df --- /dev/null +++ b/packages/airtable-mapper/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['eslint --fix --cache', 'npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/packages/airtable-mapper/package.json b/packages/airtable-mapper/package.json new file mode 100644 index 00000000..36cedaa8 --- /dev/null +++ b/packages/airtable-mapper/package.json @@ -0,0 +1,35 @@ +{ + "name": "@shiftcode/airtable-mapper", + "version": "1.0.0-pr254.4", + "description": "interfaces and classes for airtable mapping", + "repository": "https://github.com/shiftcode/sc-commons-public", + "license": "MIT", + "author": "shiftcode GmbH ", + "sideEffects": false, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "scripts": { + "build": "rm -rf ./dist && tsc", + "format": "prettier --write .", + "lint": "eslint --fix --cache .", + "lint:ci": "eslint .", + "prepublish": "node ../publish-helper/dist/prepare-dist.js", + "test": "vitest --cache --run", + "test:ci": "vitest --no-cache --run && tsc -p ./tsconfig.spec.json", + "test:watch": "vitest --cache" + }, + "peerDependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=22.10.2" + }, + "publishConfig": { + "directory": "dist" + } +} diff --git a/packages/airtable-mapper/src/converters/boolean-converter.function.ts b/packages/airtable-mapper/src/converters/boolean-converter.function.ts new file mode 100644 index 00000000..2c02d5fb --- /dev/null +++ b/packages/airtable-mapper/src/converters/boolean-converter.function.ts @@ -0,0 +1,6 @@ +export function booleanConverter(value: boolean | undefined) { + if (value === undefined) { + return false + } + return value +} diff --git a/packages/airtable-mapper/src/index.ts b/packages/airtable-mapper/src/index.ts new file mode 100644 index 00000000..d2d4e52a --- /dev/null +++ b/packages/airtable-mapper/src/index.ts @@ -0,0 +1,7 @@ +export * from './converters/boolean-converter.function.js' +export * from './key-value/key-value.mapping.js' +export * from './mapping/airtable-mapping.model.js' +export * from './model/airtable-attachment.model.js' +export * from './model/airtable-id.model.js' +export * from './model/attachment.model.js' +export * from './static/airtable-record-default-keys.const.js' diff --git a/packages/airtable-mapper/src/key-value/key-value.mapping.ts b/packages/airtable-mapper/src/key-value/key-value.mapping.ts new file mode 100644 index 00000000..81ce747f --- /dev/null +++ b/packages/airtable-mapper/src/key-value/key-value.mapping.ts @@ -0,0 +1,32 @@ +import { AirtableMapping, AirtableModelMapping } from '../mapping/airtable-mapping.model.js' + +/** + * used to mark a {@link AirtableMapping} as a KeyValueMapping, this information is later used by the airtable-fetcher + * {@link AirtableFetcher#fetchInternal} to fetch the fields specified in {@link AirtableSyncConfig#supportedLanguages + */ +// eslint-disable-next-line @typescript-eslint/naming-convention +export const MAPPING_MARKER__KEY_VALUE = Symbol.for('SC_AIRTABLE_MAPPING__MAPPING_MARKER__KEY_VALUE') + +/** + * special symbol which marks a {@link AirtableMapping} as a dedicated type + */ +export const MAPPING_MARKER = Symbol.for('SC_AIRTABLE_MAPPING__MAPPING_MARKER') + +/** + * TODO: desc + * fetches the fields specified in {@link AirtableSyncConfig#supportedLanguages} from airtable + */ +const kvMapping = new AirtableMapping('KeyValue') + +// mark the mapping to later be used as identifier by airtable-fetcher + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-expect-error +kvMapping[MAPPING_MARKER] = MAPPING_MARKER__KEY_VALUE + +export const keyValueMapping: AirtableModelMapping = kvMapping + +/** + * TODO: desc + */ +export type KeyValueString = string diff --git a/packages/airtable-mapper/src/key-value/key-value.model.ts b/packages/airtable-mapper/src/key-value/key-value.model.ts new file mode 100644 index 00000000..01518474 --- /dev/null +++ b/packages/airtable-mapper/src/key-value/key-value.model.ts @@ -0,0 +1,8 @@ +import { AirtableId } from '../model/airtable-id.model.js' + +// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents +export type KeyValueLanguageKeys = 'de' | 'en' | 'fr' | 'it' | 'nl' | string + +export type KeyValuePerLanguage = { [key in KeyValueLanguageKeys]: string } + +export type KeyValue = AirtableId & KeyValuePerLanguage diff --git a/packages/airtable-mapper/src/mapping/airtable-mapping.model.spec.ts b/packages/airtable-mapper/src/mapping/airtable-mapping.model.spec.ts new file mode 100644 index 00000000..4d386e4e --- /dev/null +++ b/packages/airtable-mapper/src/mapping/airtable-mapping.model.spec.ts @@ -0,0 +1,40 @@ +import { describe, expect, test } from 'vitest' + +import { AirtableMapping } from './airtable-mapping.model.js' + +class A { + static _mapping = new AirtableMapping('table-a').addFields(['name']) + + constructor( + public key: string, + public name: string, + ) {} +} + +class B { + static _mapping = new AirtableMapping('table-b').addMapping('a', A._mapping, true).addFields(['name']) + + constructor( + public key: string, + public name: string, + public a: A, + ) {} +} + +describe('set data', () => { + test('tableName', () => { + expect(A._mapping.tableName).toEqual('table-a') + }) + test('fields', () => { + expect(A._mapping.fields).toEqual(['name']) + }) + test('mapping', () => { + expect(B._mapping.mappings).toEqual( + new Map().set('a', { + fieldMapping: A._mapping, + single: true, + converter: undefined, + }), + ) + }) +}) diff --git a/packages/airtable-mapper/src/mapping/airtable-mapping.model.ts b/packages/airtable-mapper/src/mapping/airtable-mapping.model.ts new file mode 100644 index 00000000..ee1394b5 --- /dev/null +++ b/packages/airtable-mapper/src/mapping/airtable-mapping.model.ts @@ -0,0 +1,46 @@ +type ActualMappingType = T extends Array ? NonNullable : NonNullable + +export interface AirtablePropertyMapping { + single: boolean + fieldMapping: AirtableModelMapping | null + converter?: (value: any) => any +} + +export interface AirtableModelMapping { + mappings: Map + tableName: string + fields: Array +} + +export class AirtableMapping implements AirtableModelMapping { + readonly tableName: string + protected _mappings: Map = new Map() + protected _fields: Array = [] + + constructor(tableName: string) { + this.tableName = tableName + } + + addMapping( + property: K, + mapping: AirtableModelMapping> | null, + single = true, + converter?: (value: any) => any, + ): this { + this._mappings.set(property, { single, fieldMapping: mapping, converter }) + return this + } + + addFields(fields: Array): this { + this._fields = [...this._fields, ...fields] + return this + } + + get mappings() { + return this._mappings + } + + get fields() { + return [...this._fields, ...Array.from(this.mappings.keys())] + } +} diff --git a/packages/airtable-mapper/src/model/airtable-attachment.model.ts b/packages/airtable-mapper/src/model/airtable-attachment.model.ts new file mode 100644 index 00000000..e934b5ed --- /dev/null +++ b/packages/airtable-mapper/src/model/airtable-attachment.model.ts @@ -0,0 +1,32 @@ +export interface AirtableThumbnail { + url: string + width: number + height: number +} + +export interface AirtableThumbnails { + full: AirtableThumbnail + small: AirtableThumbnail + large: AirtableThumbnail +} + +/** + * properties always available on an attachment + */ +export interface AirtableAttachmentProps { + id: string + url: string + filename: string + type: string // content type, e.g. "image/jpeg" + size: number +} + +/** + * properties available on an attachment if image + */ +export interface AirtableImageAttachmentProps { + thumbnails: AirtableThumbnails +} + +export type AirtableAttachment = AirtableAttachmentProps & Partial +export type AirtableImageAttachment = AirtableAttachmentProps & AirtableImageAttachmentProps diff --git a/packages/airtable-mapper/src/model/airtable-id.model.ts b/packages/airtable-mapper/src/model/airtable-id.model.ts new file mode 100644 index 00000000..25bbefe2 --- /dev/null +++ b/packages/airtable-mapper/src/model/airtable-id.model.ts @@ -0,0 +1,9 @@ +/** + * every item type to fetch needs to extend AirtableId. + */ +export abstract class AirtableId { + /* eslint-disable @typescript-eslint/naming-convention */ + AIRTABLE_ID: string + AIRTABLE_TABLE: string + /* eslint-enable @typescript-eslint/naming-convention */ +} diff --git a/packages/airtable-mapper/src/model/attachment.model.ts b/packages/airtable-mapper/src/model/attachment.model.ts new file mode 100644 index 00000000..c866956f --- /dev/null +++ b/packages/airtable-mapper/src/model/attachment.model.ts @@ -0,0 +1,9 @@ +export interface Attachment { + id: string + url: string + type: string +} + +export interface ImageAttachment extends Attachment { + ratio: number +} diff --git a/packages/airtable-mapper/src/static/airtable-record-default-keys.const.ts b/packages/airtable-mapper/src/static/airtable-record-default-keys.const.ts new file mode 100644 index 00000000..1636a142 --- /dev/null +++ b/packages/airtable-mapper/src/static/airtable-record-default-keys.const.ts @@ -0,0 +1,3 @@ +import { AirtableId } from '../model/airtable-id.model.js' + +export const airtableRecordDefaultKeys: Array = ['AIRTABLE_ID', 'AIRTABLE_TABLE'] diff --git a/packages/airtable-mapper/tsconfig.json b/packages/airtable-mapper/tsconfig.json new file mode 100644 index 00000000..f7608d2c --- /dev/null +++ b/packages/airtable-mapper/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "target": "es2021", + "strictPropertyInitialization": false + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/airtable-mapper/tsconfig.lint.json b/packages/airtable-mapper/tsconfig.lint.json new file mode 100644 index 00000000..1386dd51 --- /dev/null +++ b/packages/airtable-mapper/tsconfig.lint.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.lint.json", + "compilerOptions": { "baseUrl": "." }, + "include": ["**/*.ts"] +} diff --git a/packages/branch-utilities/tsconfig.jest.json b/packages/airtable-mapper/tsconfig.spec.json similarity index 57% rename from packages/branch-utilities/tsconfig.jest.json rename to packages/airtable-mapper/tsconfig.spec.json index d40fa1e2..cd684dcb 100644 --- a/packages/branch-utilities/tsconfig.jest.json +++ b/packages/airtable-mapper/tsconfig.spec.json @@ -1,7 +1,7 @@ { - "extends": "../../tsconfig.jest.json", + "extends": "../../tsconfig.spec.json", "compilerOptions": { - "baseUrl": "./" + "baseUrl": "." }, "include": ["src/**/*.spec.ts", "test/**/*.ts"] } diff --git a/packages/airtable-mapper/vitest.config.js b/packages/airtable-mapper/vitest.config.js new file mode 100644 index 00000000..ec160f83 --- /dev/null +++ b/packages/airtable-mapper/vitest.config.js @@ -0,0 +1,3 @@ +import CONFIG from '../../vitest.config.js' + +export default CONFIG diff --git a/packages/airtable-syncer/CHANGELOG.md b/packages/airtable-syncer/CHANGELOG.md new file mode 100644 index 00000000..020a44ee --- /dev/null +++ b/packages/airtable-syncer/CHANGELOG.md @@ -0,0 +1,395 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [12.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@12.0.2...@shiftcode/airtable-sync@12.1.0) (2026-01-14) + +### Bug Fixes + +- **airtable-sync:** throw underlying error instead of misleading error ([66e9a3c](https://github.com/shiftcode/sc-commons/commit/66e9a3c64d2838664e4545e4f0a6bff8b4bfc622)) + +### Features + +- **airtable-sync:** reduce concurrent s3 uploads from 500 to 50 ([b6d184a](https://github.com/shiftcode/sc-commons/commit/b6d184a5e93440e6434e60e431085ebb8c22b9ee)) + +## [12.0.2](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@12.0.1...@shiftcode/airtable-sync@12.0.2) (2026-01-09) + +### Bug Fixes + +- **airtable-sync:** add try catch for sns sending ([5ea001d](https://github.com/shiftcode/sc-commons/commit/5ea001ddf1d6e9ae5188337b3af610a0c87cd03a)) +- **airtable-sync:** make sure throttle does not drop calls ([a586d73](https://github.com/shiftcode/sc-commons/commit/a586d737a43935ac6723f50976a33e906e16f123)) + +## [12.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@12.0.0...@shiftcode/airtable-sync@12.0.1) (2025-05-23) + +### Bug Fixes + +- **airtable-sync:** resolve typing issues with the new airtable version ([7b20082](https://github.com/shiftcode/sc-commons/commit/7b200828cfa19507dca100d427e030e8feb63d1d)) +- **airtable-sync:** update airtable dep to get rid of outdated libs downstream ([7e72159](https://github.com/shiftcode/sc-commons/commit/7e72159ca32fb582c27a58cfcba2e70c6ec6e055)) + +# [12.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@11.0.1...@shiftcode/airtable-sync@12.0.0) (2025-05-19) + +### Features + +- **airtable-sync:** replace @shiftcode/lambda-logger with @shiftcode/logger ([a121d36](https://github.com/shiftcode/sc-commons/commit/a121d360bc16c275a153c5df9cdf70c80971384d)) +- update @shiftcode/logger to version ^3.0.0 and @shiftcode/utilities to version ^4.0.0 ([2e5f2d1](https://github.com/shiftcode/sc-commons/commit/2e5f2d1a78882b8885aacd7bab56b8733a13b7d6)) + +### BREAKING CHANGES + +- requires @shiftcode/logger ^3.0.0, + requires @shiftcode/utilities ^4.0.0 + +## [11.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@11.0.0...@shiftcode/airtable-sync@11.0.1) (2025-05-15) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +# [11.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@10.2.3...@shiftcode/airtable-sync@11.0.0) (2025-05-01) + +### Bug Fixes + +- **airtable-sync:** replace Logger with injectable token LoggerService ([2967875](https://github.com/shiftcode/sc-commons/commit/2967875ec44be12a790464b2e0bca108b2d84254)) +- **airtable-sync:** resolve issues related to inversify^7.0.0 update ([a7d3d49](https://github.com/shiftcode/sc-commons/commit/a7d3d49be99434a78b135f5b835dd38c8008e586)) + +### Features + +- **airtable-sync:** change how the config is provided ([ca9ed7a](https://github.com/shiftcode/sc-commons/commit/ca9ed7ae9aa05fffa63be2beeadcda6e3705d2c7)) +- **airtable-sync:** update to date-fns^4.0.0 ([d554600](https://github.com/shiftcode/sc-commons/commit/d55460037834c20edda1816d02de55fe7c744394)) +- update to inversify^7.0.0 ([c6807d6](https://github.com/shiftcode/sc-commons/commit/c6807d6c21110c820f489020d41c1cbad3a2b2f6)) + +### BREAKING CHANGES + +- **airtable-sync:** The configuration for airtable-sync must now be provided using a dedicated inversify symbol (AIRTABLE_SYNC_CONFIG) and config type (AirtableSyncConfig) +- requires inversify^7.0.0 as a peer dependency +- **airtable-sync:** requires date-fns^4.0.0 as a peer dependency + +## [10.2.3](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@10.2.2...@shiftcode/airtable-sync@10.2.3) (2025-03-06) + +### Bug Fixes + +- update engines definition (left over from node 22 upgrade) ([f5428ae](https://github.com/shiftcode/sc-commons/commit/f5428ae64c45567912887b8bab1e881c4312669f)) +- update version range for reflect-metadata ([9b7b0d1](https://github.com/shiftcode/sc-commons/commit/9b7b0d1056a9f47476e1ddb1ac58335094e2185f)) + +## [10.2.2](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@10.2.1...@shiftcode/airtable-sync@10.2.2) (2025-03-04) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +## [10.2.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@10.2.0...@shiftcode/airtable-sync@10.2.1) (2024-08-02) + +### Bug Fixes + +- **airtable-sync:** fix issue with unwrapped results ([43800f0](https://github.com/shiftcode/sc-commons/commit/43800f0201ed29403111909c370468648b18dc18)) + +# [10.2.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@10.1.0...@shiftcode/airtable-sync@10.2.0) (2024-07-31) + +### Features + +- move start indication log to lambda-utils ([f88359e](https://github.com/shiftcode/sc-commons/commit/f88359e692fce5aaaee7ebc57d22eb22051a2923)) + +# [10.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@10.0.1...@shiftcode/airtable-sync@10.1.0) (2024-07-30) + +### Bug Fixes + +- **airtable-sync:** fix typo ([2296176](https://github.com/shiftcode/sc-commons/commit/22961763a636f2cbb5d1be28ebe291c291e6da15)) +- **airtable-sync:** implement real batching ([62c02cc](https://github.com/shiftcode/sc-commons/commit/62c02cca0b937a181eded643ab29ca9a6e5a389a)) +- **airtable-sync:** import path ([236bfe8](https://github.com/shiftcode/sc-commons/commit/236bfe86cf10837d27a6220283f81e7e16bcf1f0)) +- **airtable-sync:** move batch execution to correct place ([302b474](https://github.com/shiftcode/sc-commons/commit/302b474342d3b95d5d40e2a8571959c57fcfe961)) + +### Features + +- **airtable-sync:** split upload into chunks ([19bf084](https://github.com/shiftcode/sc-commons/commit/19bf08484b073ae8d82556ee9e57ea4e6e3304f8)) +- **batch-executor:** use generator ([739ade7](https://github.com/shiftcode/sc-commons/commit/739ade717711168830c87b079df70ff8ce59c3e6)) +- **batch-executor:** use settled ([7895295](https://github.com/shiftcode/sc-commons/commit/78952950e40108f786537ecde212d8261d022427)) + +## [10.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@10.0.0...@shiftcode/airtable-sync@10.0.1) (2024-07-29) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +# [10.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@9.0.0...@shiftcode/airtable-sync@10.0.0) (2024-07-13) + +### Build System + +- **airtable-sync:** upgrade date-fns ([9403c78](https://github.com/shiftcode/sc-commons/commit/9403c7837b13c24e46ef4fb8121f3bb6c1d8b0b1)) +- **node:** upgrade to node 20 ([2899d0d](https://github.com/shiftcode/sc-commons/commit/2899d0d41ece080b276e7bf84915d4849da81a29)) + +### Reverts + +- Revert "build(airtable-sync): upgrade airtable dependency" ([35403a9](https://github.com/shiftcode/sc-commons/commit/35403a93bc7a00a489eb5430d15f16e4a5384904)) + +### BREAKING CHANGES + +- **airtable-sync:** minimum version date-fns@^3.0.0 is required as peer dependency +- **node:** Minimum required node version is 20.11.1. In general speaking the runtime (Node or Browser) must support all es2023 features. + +# [9.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@8.0.6...@shiftcode/airtable-sync@9.0.0) (2024-07-08) + +### Features + +- **airtable-mapping:** remove obsolete constructor argument ([a528743](https://github.com/shiftcode/sc-commons/commit/a5287436ba0913c61122b0c8a330856a741cd0d5)) + +### BREAKING CHANGES + +- **airtable-mapping:** The AirtableMapping constructor does no longer accept two arguments. Instead we assume the modelName and tableName are equal. + +## [8.0.6](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@8.0.5...@shiftcode/airtable-sync@8.0.6) (2024-01-25) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +## [8.0.5](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@8.0.4...@shiftcode/airtable-sync@8.0.5) (2023-12-18) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +## [8.0.4](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@8.0.3...@shiftcode/airtable-sync@8.0.4) (2023-10-18) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +## [8.0.3](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@8.0.2...@shiftcode/airtable-sync@8.0.3) (2023-07-27) + +### Bug Fixes + +- **airtable-sync:** add support for version deployed in lambda runtime (node18) ([b2be98d](https://github.com/shiftcode/sc-commons/commit/b2be98dfde69d9e5ff1d55fee5e7fde058c46c69)) +- **airtable-sync:** use Promise.allSettled and await in smaller batches ([e4611fc](https://github.com/shiftcode/sc-commons/commit/e4611fc385a9007afbe3d5534979b031139c39a3)) +- **airtable-sync:** use symbol to identify KeyValue mapping ([541d794](https://github.com/shiftcode/sc-commons/commit/541d79467e685d655490d2cf465b2add9662a482)) + +## [8.0.2](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@8.0.1...@shiftcode/airtable-sync@8.0.2) (2023-06-01) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +## [8.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@8.0.0...@shiftcode/airtable-sync@8.0.1) (2023-06-01) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +# [8.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@7.1.0...@shiftcode/airtable-sync@8.0.0) (2023-05-15) + +### Features + +- **airtable-sync:** inline sns publisher functionality ([080a1e2](https://github.com/shiftcode/sc-commons/commit/080a1e24a4d0991e9e2be4b433b1c759cc197364)) +- **airtable-sync:** migrate to ESM (different related changes) ([8593e0a](https://github.com/shiftcode/sc-commons/commit/8593e0a8eb4da2bf3734c1ee02024be1ca2d7ec1)) + +### BREAKING CHANGES + +- **airtable-sync:** only supported in projects using ESM + +# [7.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@7.0.0...@shiftcode/airtable-sync@7.1.0) (2023-03-17) + +### Features + +- **eslint-plugin:** introduce tests to verify correct implementation of plugins ([76d5b2f](https://github.com/shiftcode/sc-commons/commit/76d5b2f2bea5a3f4450e7ce43153fc2ddba832c1)) + +# [7.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@6.0.1...@shiftcode/airtable-sync@7.0.0) (2023-03-16) + +### Build System + +- **tsconfig:** build for es2022 target ([c75651b](https://github.com/shiftcode/sc-commons/commit/c75651b2b2ca6338e71b6538616d5b0e9bbb40cc)) + +### BREAKING CHANGES + +- **tsconfig:** requires ES2022 support (node@18) + +## [6.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@6.0.0...@shiftcode/airtable-sync@6.0.1) (2022-01-17) + +### Bug Fixes + +- **dependency:** require lambda-utils@7 ([20a97a5](https://github.com/shiftcode/sc-commons/commit/20a97a51b0b1542ff837f4303b37592802a06944)) + +## 6.0.0 (2022-01-11) + +- build(release): next version [skip ci] ([7fb99e3](https://github.com/shiftcode/sc-commons/commit/7fb99e3)) +- build(release): next version [skip ci] ([69f8e36](https://github.com/shiftcode/sc-commons/commit/69f8e36)) +- build(release): next version [skip ci] ([6658958](https://github.com/shiftcode/sc-commons/commit/6658958)) +- build(release): next version [skip_build] ([911da02](https://github.com/shiftcode/sc-commons/commit/911da02)) +- build(release): next version [skip_build] ([199066e](https://github.com/shiftcode/sc-commons/commit/199066e)) +- build(release): next version [skip_build] ([0c839e4](https://github.com/shiftcode/sc-commons/commit/0c839e4)) +- build(release): next version [skip_build] ([2722982](https://github.com/shiftcode/sc-commons/commit/2722982)) +- build(release): next version [skip_build] ([a0e996a](https://github.com/shiftcode/sc-commons/commit/a0e996a)) +- build(release): next version [skip_build] ([8d72402](https://github.com/shiftcode/sc-commons/commit/8d72402)) +- build(release): next version [skip_build] ([7bca45d](https://github.com/shiftcode/sc-commons/commit/7bca45d)) +- build(release): next version [skip_build] ([82c65ba](https://github.com/shiftcode/sc-commons/commit/82c65ba)) +- build(release): next version [skip_build] ([8589cd3](https://github.com/shiftcode/sc-commons/commit/8589cd3)) +- build(release): next version [skip_build] ([aaebf67](https://github.com/shiftcode/sc-commons/commit/aaebf67)) +- build(release): next version [skip_build] ([e38c9a6](https://github.com/shiftcode/sc-commons/commit/e38c9a6)) +- build(release): next version [skip_build] ([9470e94](https://github.com/shiftcode/sc-commons/commit/9470e94)) +- build(release): next version [skip_build] ([7a83884](https://github.com/shiftcode/sc-commons/commit/7a83884)) +- build(release): next version [skip_build] ([0ca65a3](https://github.com/shiftcode/sc-commons/commit/0ca65a3)) +- build(release): next version [skip_build] ([b9614a4](https://github.com/shiftcode/sc-commons/commit/b9614a4)) +- build(release): next version [skip_build] ([1483216](https://github.com/shiftcode/sc-commons/commit/1483216)) +- build(release): next version [skip_build] ([5e2b455](https://github.com/shiftcode/sc-commons/commit/5e2b455)) +- build(release): next version [skip_build] ([7470c7d](https://github.com/shiftcode/sc-commons/commit/7470c7d)) +- build(release): next version [skip_build] ([bf316bd](https://github.com/shiftcode/sc-commons/commit/bf316bd)) +- build(release): next version [skip_workflow] ([04eb9bc](https://github.com/shiftcode/sc-commons/commit/04eb9bc)) +- build(scripts): use rm -rf instead of rimraf ([de45957](https://github.com/shiftcode/sc-commons/commit/de45957)) +- build(tsconfig.spec): remove unnecessary path ([af1b707](https://github.com/shiftcode/sc-commons/commit/af1b707)) +- chore(aws-sdk): use same version in all packages ([08ac152](https://github.com/shiftcode/sc-commons/commit/08ac152)) +- chore(jest.config): fix import of utils ([29cab2c](https://github.com/shiftcode/sc-commons/commit/29cab2c)) +- chore(peer-deps): remove pr version ([ef34bce](https://github.com/shiftcode/sc-commons/commit/ef34bce)) +- fix(peer-dependencies): correct version ([99aa21e](https://github.com/shiftcode/sc-commons/commit/99aa21e)) +- fix(peer-dependencies): update versions ([9aac1ed](https://github.com/shiftcode/sc-commons/commit/9aac1ed)) +- feat(deps): update dependencies ([5a41426](https://github.com/shiftcode/sc-commons/commit/5a41426)) +- feat(deps): update dependencies ([ce9c2d5](https://github.com/shiftcode/sc-commons/commit/ce9c2d5)) + +### BREAKING CHANGE + +- date-fns@^2.28.0 now required as peer dependency +- inversify@^6.0.1 required + +## 5.0.0 (2021-12-23) + +- build(release): next version [skip ci] ([d3b33ba](https://github.com/shiftcode/sc-commons/commit/d3b33ba)) +- build(release): next version [skip ci] ([87c30b4](https://github.com/shiftcode/sc-commons/commit/87c30b4)) +- build(release): next version [skip ci] ([16d5995](https://github.com/shiftcode/sc-commons/commit/16d5995)) +- build(release): next version [skip ci] ([d7b6d61](https://github.com/shiftcode/sc-commons/commit/d7b6d61)) +- build(release): next version [skip ci] ([76a41a6](https://github.com/shiftcode/sc-commons/commit/76a41a6)) +- build(release): next version [skip ci] ([44d8085](https://github.com/shiftcode/sc-commons/commit/44d8085)) +- build(release): next version [skip ci] ([4a2a73d](https://github.com/shiftcode/sc-commons/commit/4a2a73d)) +- build(release): next version [skip ci] ([ac3ac7f](https://github.com/shiftcode/sc-commons/commit/ac3ac7f)) +- build(release): next version [skip ci] ([14622a2](https://github.com/shiftcode/sc-commons/commit/14622a2)) +- build(release): next version [skip ci] ([3199b0c](https://github.com/shiftcode/sc-commons/commit/3199b0c)) +- build(release): next version [skip ci] ([652b10b](https://github.com/shiftcode/sc-commons/commit/652b10b)) +- build(release): next version [skip ci] ([78e4b60](https://github.com/shiftcode/sc-commons/commit/78e4b60)) +- build(release): next version [skip ci] ([006c0be](https://github.com/shiftcode/sc-commons/commit/006c0be)) +- build(release): next version [skip ci] ([6285743](https://github.com/shiftcode/sc-commons/commit/6285743)) +- build(release): next version [skip ci] ([2e01006](https://github.com/shiftcode/sc-commons/commit/2e01006)) +- build(release): next version [skip ci] ([f66b3c3](https://github.com/shiftcode/sc-commons/commit/f66b3c3)) +- build(release): next version [skip ci] ([69cc0f4](https://github.com/shiftcode/sc-commons/commit/69cc0f4)) +- build(release): next version [skip ci] ([921f9f0](https://github.com/shiftcode/sc-commons/commit/921f9f0)) +- build(release): next version [skip ci] ([25993ec](https://github.com/shiftcode/sc-commons/commit/25993ec)) +- build(release): next version [skip ci] ([1fed9a1](https://github.com/shiftcode/sc-commons/commit/1fed9a1)) +- build(release): next version [skip ci] ([cd44cac](https://github.com/shiftcode/sc-commons/commit/cd44cac)) +- refactor(\*): replace npm run with yarn ([238adbc](https://github.com/shiftcode/sc-commons/commit/238adbc)) +- refactor(\*): unify READMEs title ([b779764](https://github.com/shiftcode/sc-commons/commit/b779764)) +- revert(version): back to pr ([daf8058](https://github.com/shiftcode/sc-commons/commit/daf8058)) +- fix(package.json): author ([67db3f3](https://github.com/shiftcode/sc-commons/commit/67db3f3)) +- fix(package.json): correctly set sideEffects property ([11e30b5](https://github.com/shiftcode/sc-commons/commit/11e30b5)) +- fix(peer-dependencies): depend on pr93 versions ([b36c70b](https://github.com/shiftcode/sc-commons/commit/b36c70b)) +- style(prettier): update to 2.5 and prettify ([47be5f1](https://github.com/shiftcode/sc-commons/commit/47be5f1)) +- test(jest): update rename tsconfig.spec and update jest ([30a28ff](https://github.com/shiftcode/sc-commons/commit/30a28ff)) +- feat(typescript): use typescript 4.4 and require tslib ^2.3 ([3524ecd](https://github.com/shiftcode/sc-commons/commit/3524ecd)) + +### BREAKING CHANGE + +- requires tslib ^2.3 + +## 4.0.3 (2021-11-09) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +## 4.0.2 (2021-11-08) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +## 4.0.1 (2021-01-22) + +- test(tsconfig.jest): add paths ([af64719](https://github.com/shiftcode/sc-commons/commit/af64719)) +- chore(package.json): use \* version for dev-deps to peer packages ([a13d261](https://github.com/shiftcode/sc-commons/commit/a13d261)) + +## 4.0.0 (2020-10-06) + +- Merge branch 'master' into #77-reusable-utils ([baa4f26](https://github.com/shiftcode/sc-commons/commit/baa4f26)), closes [#77](https://github.com/shiftcode/sc-commons/issues/77) +- chore(lint-staged): update all configuration files ([ac86637](https://github.com/shiftcode/sc-commons/commit/ac86637)) +- refactor(s3-helper): rename method ([3c2a04c](https://github.com/shiftcode/sc-commons/commit/3c2a04c)) +- fix(airtable-sync): s3Helper usage ([4f5c5c2](https://github.com/shiftcode/sc-commons/commit/4f5c5c2)) + +### BREAKING CHANGE + +- - s3Helper method uploadDataJson renamed to uploadJson() + +## 3.0.2 (2020-06-14) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +## 3.0.1 (2020-05-19) + +- fix(peerdeps): version of peer deps update ([9dd641d](https://github.com/shiftcode/sc-commons/commit/9dd641d)) + +## 3.0.0 (2020-05-19) + +- feat(typescript): update to typescript 3.9 ([1dc45f5](https://github.com/shiftcode/sc-commons/commit/1dc45f5)) + +### BREAKING CHANGE + +- tslib 2.0.0 required for typescript update + +## 2.0.8 (2020-05-09) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +## 2.0.7 (2020-04-09) + +- style(prettier): prettify all files ([a9552d0](https://github.com/shiftcode/sc-commons/commit/a9552d0)) + +## 2.0.6 (2019-12-19) + +- fix(airtable-fetcher): ensure ids is an Array ([bf9812b](https://github.com/shiftcode/sc-commons/commit/bf9812b)) + +## 2.0.5 (2019-12-04) + +- chore(deps): bumb a few dev dependencies ([16781af](https://github.com/shiftcode/sc-commons/commit/16781af)) + +## 2.0.4 (2019-12-04) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +## 2.0.3 (2019-12-04) + +- chore(ts-config): activate the esModuleInterop flag and refactor imports ([25625df](https://github.com/shiftcode/sc-commons/commit/25625df)) +- build(\*): update tsconfig and doc ([71c35a8](https://github.com/shiftcode/sc-commons/commit/71c35a8)) +- build(tsconfig): remove unnecesarry lib declaration ([9894dc1](https://github.com/shiftcode/sc-commons/commit/9894dc1)) +- build(yarn): migrate to yarn workspace ([8811814](https://github.com/shiftcode/sc-commons/commit/8811814)) + +## 2.0.2 (2019-11-15) + +- fix(deps): update version range for @shiftcode/lambda-utils ([fd852a2](https://github.com/shiftcode/sc-commons/commit/fd852a2)) + +## 2.0.1 (2019-11-14) + +**Note:** Version bump only for package @shiftcode/airtable-sync + +# [2.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/airtable-sync@1.0.0...@shiftcode/airtable-sync@2.0.0) (2019-11-07) + +### Bug Fixes + +- **airtable-sync:** required peer-dependency ([092291b](https://github.com/shiftcode/sc-commons/commit/092291b11eef8708d3d4fb6b03d7635ebd092f8c)) +- **airtable-sync:** typings, tests ([4160976](https://github.com/shiftcode/sc-commons/commit/4160976cd61a64418a645dc1cd9bda7da5f8b70e)) + +### Features + +- **airtable-mapping:** export by language ([4031c94](https://github.com/shiftcode/sc-commons/commit/4031c945452cbdbc1adfcb19d4ff25f971887145)) +- **airtable-sync:** fallaback if keyvalue translations are missing ([7a883f5](https://github.com/shiftcode/sc-commons/commit/7a883f5555276eddd22b7c3d7e7089c4e037936a)) + +### BREAKING CHANGES + +- **airtable-mapping:** - its now necessary to specify the supported languages in AirtableSyncConfig + +* json files will always receive a `_{lang}.json` suffix in name +* you need to use the exported keyValueMapping for `addMapping(...)` (and use the marker type `KeyValueString` in the model for such types) + +# [1.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcoders/airtable-sync@0.1.1...@shiftcoders/airtable-sync@1.0.0) (2019-10-24) + +### Bug Fixes + +- **airtable-fetcher:** refactor log statements ([ab015b5](https://github.com/shiftcode/sc-commons/commit/ab015b5af03e74eb0b3041dd2585558284f91232)) +- **airtable-sync:** fix tests (work with new airtable-mapping package) ([c804d5f](https://github.com/shiftcode/sc-commons/commit/c804d5ffa38ab7ca8dd748e1f8cb13e27c53f170)) +- **airtable-sync:** remove super verbose logs ([3754e57](https://github.com/shiftcode/sc-commons/commit/3754e57721ded586543c86df1660bb0f4a92a3a4)) +- **airtable.api:** log airtable select options when fetching ([36d15f4](https://github.com/shiftcode/sc-commons/commit/36d15f44a3f7fda387211b747ea01a860228a2fb)) +- **airtable.api:** log select options on error ([c6904a6](https://github.com/shiftcode/sc-commons/commit/c6904a6e45c422c3c2a9cff432bdff31a1ce9d7a)) + +### Code Refactoring + +- **airtable:** fix stuff, split into 2 packages ([345f57b](https://github.com/shiftcode/sc-commons/commit/345f57bc86f2cd587b9da1a521cc724b3eb9d6f2)) + +### Features + +- **lambda-logger:** provide inversify module ([b12d7cf](https://github.com/shiftcode/sc-commons/commit/b12d7cfc045c5db9d2cf61284bd39f4d414d7fdb)) + +### BREAKING CHANGES + +- **airtable:** - two packages + +## [0.1.1](https://github.com/shiftcode/sc-commons/compare/@shiftcoders/airtable-sync@0.1.0...@shiftcoders/airtable-sync@0.1.1) (2019-10-16) + +**Note:** Version bump only for package @shiftcoders/airtable-sync + +# 0.1.0 (2019-10-11) + +### Features + +- **airtable-sync:** new package ([7aa2209](https://github.com/shiftcode/sc-commons/commit/7aa22090171980066fb58a1d1389a5cbaaa5010a)) diff --git a/packages/airtable-syncer/README.md b/packages/airtable-syncer/README.md new file mode 100644 index 00000000..29898c05 --- /dev/null +++ b/packages/airtable-syncer/README.md @@ -0,0 +1,29 @@ +# airtable-syncer + +> 🎯 Target runtime: es2023 ([Node >= 20](https://node.green/#ES2023)) + +Module to sync airtable data to S3 and publish SNS events for all attachments found and not yet synced to S3. Usually +those events are consumed by a lambda function creating different sizes of the images and storing them in S3. + +## Usage + +- provide `AirtableSyncConfig` bound to the `AIRTABLE_SYNC_CONFIG` symbol +- provide an implementation for the AttachmentUrlResolver + +```typescript +import { AttachmentUrlResolver, AIRTABLE_SYNC_CONFIG, AirtableSyncConfig } from '@shiftcode/airtable-syncer' +import { Container } from 'inversify' +import { configCreaterFn, ServiceConfig } from './config.js' +import { ServiceAttachmentUrlResolver } from './attachment-url-resolver.service.js' + +const con = new Container({ + defaultScope: 'Singleton', + autoBindInjectable: true, +}) + +con.bind(AIRTABLE_SYNC_CONFIG).toDynamicValue(configCreaterFn).inSingletonScope() + +con.bind(AttachmentUrlResolver).to(ServiceAttachmentUrlResolver).inSingletonScope() +``` + +- define the sns event and function in serverless.yml to download attachments from airtable and upload them to s3 diff --git a/packages/airtable-syncer/eslint.config.js b/packages/airtable-syncer/eslint.config.js new file mode 100644 index 00000000..f0e13a35 --- /dev/null +++ b/packages/airtable-syncer/eslint.config.js @@ -0,0 +1,15 @@ +import { defineScTsConfig } from '@shiftcode/eslint-config-recommended' + +export default defineScTsConfig( + { + languageOptions: { parserOptions: { project: ['./tsconfig.lint.json'] } }, + }, + { + files: ['**/*.ts'], + rules: { + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + }, + }, +) diff --git a/packages/airtable-syncer/lint-staged.config.js b/packages/airtable-syncer/lint-staged.config.js new file mode 100644 index 00000000..165242df --- /dev/null +++ b/packages/airtable-syncer/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['eslint --fix --cache', 'npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/packages/airtable-syncer/package.json b/packages/airtable-syncer/package.json new file mode 100644 index 00000000..bb5dfdf3 --- /dev/null +++ b/packages/airtable-syncer/package.json @@ -0,0 +1,55 @@ +{ + "name": "@shiftcode/airtable-syncer", + "version": "1.0.0-pr254.4", + "description": "base utils and services to export airtable and upload to S3", + "repository": "https://github.com/shiftcode/sc-commons-public", + "license": "MIT", + "author": "shiftcode GmbH ", + "sideEffects": false, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "scripts": { + "build": "rm -rf ./dist && tsc", + "format": "prettier --write .", + "lint": "eslint --fix --cache .", + "lint:ci": "eslint .", + "prepublish": "node ../publish-helper/dist/prepare-dist.js", + "test": "vitest --cache --run", + "test:ci": "vitest --no-cache --run && tsc -p ./tsconfig.spec.json", + "test:watch": "vitest --cache" + }, + "dependencies": { + "airtable": "^0.12.2", + "p-queue": "^9.0.1" + }, + "devDependencies": { + "@shiftcode/airtable-mapper": "^1.0.0-pr254.4", + "@shiftcode/inversify-logger": "^1.0.0-pr254.4", + "@shiftcode/lambda-utilities": "^1.0.0-pr254.4", + "@shiftcode/logger": "^5.0.0-pr254.7", + "@swc/core": "^1.15.11", + "unplugin-swc": "^1.5.9" + }, + "peerDependencies": { + "@aws-sdk/client-sns": "^3.188.0", + "@shiftcode/airtable-mapper": "^1.0.0 || ^1.0.0-pr254", + "@shiftcode/inversify-logger": "^1.0.0 || ^1.0.0-pr254", + "@shiftcode/lambda-utilities": "^1.0.0 || ^1.0.0-pr254", + "@shiftcode/logger": "^5.0.0 || 5.0.0-pr254", + "date-fns": "^4.0.0", + "inversify": "^7.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=22.10.2" + }, + "publishConfig": { + "directory": "dist" + } +} diff --git a/packages/airtable-syncer/src/config/airtable-config.model.ts b/packages/airtable-syncer/src/config/airtable-config.model.ts new file mode 100644 index 00000000..2130a560 --- /dev/null +++ b/packages/airtable-syncer/src/config/airtable-config.model.ts @@ -0,0 +1,26 @@ +export interface AirtableSyncConfig { + airtableSync: { + /** airtable api key */ + apiKey: string + + /** bucket to store attachments in */ + atBucketName: string + + /** + * sns topic to publish for an attachment to download + * part after region, will be joined to `arn:aws:sns:$[sc:region]:` + */ + downloadTopic: string + + /** + * comma separated string of language keys in KeyValue model in airtable + * e.g. 'de, en, fr' + */ + supportedLanguages: string + + /** + * AWS region of the sns topic used to publish attachment download messages + */ + snsTopicRegion: string + } +} diff --git a/packages/airtable-syncer/src/config/index.ts b/packages/airtable-syncer/src/config/index.ts new file mode 100644 index 00000000..3f69c38c --- /dev/null +++ b/packages/airtable-syncer/src/config/index.ts @@ -0,0 +1 @@ +export * from './airtable-config.model.js' diff --git a/packages/airtable-syncer/src/index.ts b/packages/airtable-syncer/src/index.ts new file mode 100644 index 00000000..10596fae --- /dev/null +++ b/packages/airtable-syncer/src/index.ts @@ -0,0 +1,9 @@ +export * from './config/airtable-config.model.js' +export * from './model/airtable-id-record.model.js' +export * from './module/airtable.module.js' +export * from './module/airtable-sync-config.symbol.js' +export * from './services/airtable.api.js' +export * from './services/airtable-fetcher.service.js' +export * from './services/airtable-sync.service.js' +export * from './services/attachment-url-resolver.service.js' +export * from './static/airtable-record-default-keys.const.js' diff --git a/packages/airtable-syncer/src/model/airtable-id-record.model.ts b/packages/airtable-syncer/src/model/airtable-id-record.model.ts new file mode 100644 index 00000000..80bb556a --- /dev/null +++ b/packages/airtable-syncer/src/model/airtable-id-record.model.ts @@ -0,0 +1,8 @@ +import { AirtableId } from '@shiftcode/airtable-mapper' + +/** + * Airtable Record Model with known and unknown properties + */ +export interface AirtableIdRecord extends AirtableId { + [key: string]: any +} diff --git a/packages/airtable-syncer/src/model/airtable-record.model.ts b/packages/airtable-syncer/src/model/airtable-record.model.ts new file mode 100644 index 00000000..3dc64b16 --- /dev/null +++ b/packages/airtable-syncer/src/model/airtable-record.model.ts @@ -0,0 +1,11 @@ +/** + * actual returned record type - unfortunately missing in @types/airtable + */ +export interface AirtableRecord { + id: string + fields: T + + getId(): string + + get(columnName: keyof T | string): any +} diff --git a/packages/airtable-syncer/src/model/key-value.symbol.ts b/packages/airtable-syncer/src/model/key-value.symbol.ts new file mode 100644 index 00000000..8503e0f5 --- /dev/null +++ b/packages/airtable-syncer/src/model/key-value.symbol.ts @@ -0,0 +1 @@ +export const KEY_VALUE_SYMBOL = Symbol.for('KEY_VALUE') diff --git a/packages/airtable-syncer/src/module/airtable-sync-config.symbol.ts b/packages/airtable-syncer/src/module/airtable-sync-config.symbol.ts new file mode 100644 index 00000000..edcc61b9 --- /dev/null +++ b/packages/airtable-syncer/src/module/airtable-sync-config.symbol.ts @@ -0,0 +1 @@ +export const AIRTABLE_SYNC_CONFIG = Symbol.for('AIRTABLE_SYNC_CONFIG') diff --git a/packages/airtable-syncer/src/module/airtable.module.spec.ts b/packages/airtable-syncer/src/module/airtable.module.spec.ts new file mode 100644 index 00000000..9d4b8635 --- /dev/null +++ b/packages/airtable-syncer/src/module/airtable.module.spec.ts @@ -0,0 +1,63 @@ +import { S3Helper } from '@shiftcode/lambda-utilities/s3' +import { Container } from 'inversify' +import { describe, expect, test } from 'vitest' + +import { bindLoggerToContainer } from '../../test/add-logger-to-container.function.js' +import { S3HelperMock } from '../../test/s3-helper.mock.js' +import { SnsPublisherMock } from '../../test/sns-publisher.mock.js' +import { AirtableSyncConfig } from '../config/airtable-config.model.js' +import { AirtableApi } from '../services/airtable.api.js' +import { AirtableFetcher } from '../services/airtable-fetcher.service.js' +import { AirtableSync } from '../services/airtable-sync.service.js' +import { SnsPublisher } from '../services/sns-publisher.service.js' +import { airtableModule } from './airtable.module.js' +import { AIRTABLE_SYNC_CONFIG } from './airtable-sync-config.symbol.js' + +const config: AirtableSyncConfig = { + airtableSync: { + apiKey: 'NOT_DEFINED_API_KEY', + atBucketName: 'NOT_DEFINED_AT_BUCKET_NAME', + downloadTopic: 'downloadAttachments-xx1', + supportedLanguages: 'de,en', + snsTopicRegion: 'sns-topic-region', + }, +} + +describe('airtable inversify module', () => { + describe('binds all services when loading module only', () => { + const con = new Container() + void con.load(airtableModule) + + test('S3Helper', () => expect(con.isBound(S3Helper)).toBeTruthy()) + test('SnsPublisher', () => expect(con.isBound(SnsPublisher)).toBeTruthy()) + test('AirtableApi', () => expect(con.isBound(AirtableApi)).toBeTruthy()) + test('AirtableFetcher', () => expect(con.isBound(AirtableFetcher)).toBeTruthy()) + test('AirtableSync', () => expect(con.isBound(AirtableSync)).toBeTruthy()) + }) + describe('binds all services when loading S3 or SNS are already bound', () => { + const con = new Container() + con.bind(AIRTABLE_SYNC_CONFIG).toConstantValue(config) + bindLoggerToContainer(con) + con + .bind(S3Helper) + .to(S3HelperMock) + .inSingletonScope() + con + .bind(SnsPublisher) + .to(SnsPublisherMock) + .inSingletonScope() + void con.load(airtableModule) + + test('S3Helper bound to Mock', () => { + expect(con.isBound(S3Helper)).toBeTruthy() + expect(con.get(S3Helper)).toBeInstanceOf(S3HelperMock) + }) + test('SnsPublisher bound to Mock', () => { + expect(con.isBound(SnsPublisher)).toBeTruthy() + expect(con.get(SnsPublisher)).toBeInstanceOf(SnsPublisherMock) + }) + test('AirtableApi', () => expect(con.isBound(AirtableApi)).toBeTruthy()) + test('AirtableFetcher', () => expect(con.isBound(AirtableFetcher)).toBeTruthy()) + test('AirtableSync', () => expect(con.isBound(AirtableSync)).toBeTruthy()) + }) +}) diff --git a/packages/airtable-syncer/src/module/airtable.module.ts b/packages/airtable-syncer/src/module/airtable.module.ts new file mode 100644 index 00000000..98a9b5ed --- /dev/null +++ b/packages/airtable-syncer/src/module/airtable.module.ts @@ -0,0 +1,24 @@ +import { S3Helper } from '@shiftcode/lambda-utilities/s3' +import { ContainerModule } from 'inversify' + +import { AirtableApi } from '../services/airtable.api.js' +import { AirtableFetcher } from '../services/airtable-fetcher.service.js' +import { AirtableSync } from '../services/airtable-sync.service.js' +import { SnsPublisher } from '../services/sns-publisher.service.js' + +/** + * binds airtable services and - if not already bound - S3Helper and SnsPublisher + */ +export const airtableModule = new ContainerModule(({ bind, isBound }) => { + bind(AirtableFetcher).toSelf().inSingletonScope() + bind(AirtableSync).toSelf().inSingletonScope() + bind(AirtableApi).toSelf().inSingletonScope() + + if (!isBound(S3Helper)) { + bind(SnsPublisher).toSelf().inSingletonScope() + } + + if (!isBound(S3Helper)) { + bind(S3Helper).toSelf().inSingletonScope() + } +}) diff --git a/packages/airtable-syncer/src/services/airtable-fetcher.service.spec.ts b/packages/airtable-syncer/src/services/airtable-fetcher.service.spec.ts new file mode 100644 index 00000000..87e08df5 --- /dev/null +++ b/packages/airtable-syncer/src/services/airtable-fetcher.service.spec.ts @@ -0,0 +1,143 @@ +import { keyValueMapping } from '@shiftcode/airtable-mapper' +import { S3Helper } from '@shiftcode/lambda-utilities/s3' +import { Container } from 'inversify' +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' + +import { bindLoggerToContainer } from '../../test/add-logger-to-container.function.js' +import { AirtableApiMock } from '../../test/airtable.api.mock.js' +import { ComplexModel } from '../../test/models/complex.model.js' +import { SimpleModel } from '../../test/models/simple.model.js' +import { S3HelperMock } from '../../test/s3-helper.mock.js' +import { SnsPublisherMock } from '../../test/sns-publisher.mock.js' +import { + airtableImgAtt, + cmItemId, + complexRecord, + kvItemId, + kvRecord, + smItemId, + smRecord, +} from '../../test/some-items.js' +import { TEST_ASSET_PREFIX, TestAttachmentUrlResolverService } from '../../test/test-attachment-url-resolver.service.js' +import { AirtableSyncConfig } from '../config/airtable-config.model.js' +import { KEY_VALUE_SYMBOL } from '../model/key-value.symbol.js' +import { AIRTABLE_SYNC_CONFIG } from '../module/airtable-sync-config.symbol.js' +import { AirtableApi } from './airtable.api.js' +import { AirtableFetcher } from './airtable-fetcher.service.js' +import { AttachmentUrlResolver } from './attachment-url-resolver.service.js' +import { SnsPublisher } from './sns-publisher.service.js' + +const aBase = 'MyBase' + +describe('airtable-fetcher', () => { + const config: AirtableSyncConfig = { + airtableSync: { + apiKey: 'NOT_DEFINED_API_KEY', + atBucketName: 'NOT_DEFINED_AT_BUCKET_NAME', + downloadTopic: 'downloadAttachments-xx1', + supportedLanguages: 'de,en', + snsTopicRegion: 'sns-topic-region', + }, + } + let container: Container + let airtableFetcher: AirtableFetcher + let apiMock: AirtableApiMock + let snsMock: SnsPublisherMock + let attachmentUrlResolver: AttachmentUrlResolver + + beforeEach(() => { + container = bindLoggerToContainer( + new Container({ + autobind: true, + defaultScope: 'Singleton', + }), + ) + container.bind(AIRTABLE_SYNC_CONFIG).toConstantValue(config) + container.bind(AttachmentUrlResolver).to(TestAttachmentUrlResolverService).inSingletonScope() + container + .bind(S3Helper) + .to(S3HelperMock) + .inSingletonScope() + container + .bind(SnsPublisher) + .to(SnsPublisherMock) + .inSingletonScope() + container + .bind(AirtableApi) + .to(AirtableApiMock) + .inSingletonScope() + + apiMock = container.get(AirtableApi) + snsMock = container.get(SnsPublisher) + airtableFetcher = container.get(AirtableFetcher) + attachmentUrlResolver = container.get(AttachmentUrlResolver) + }) + afterEach(() => container.unbindAll()) + + test('can be injected', () => { + expect(airtableFetcher).toBeDefined() + }) + + test('init load s3 files according to prefix', async () => { + await airtableFetcher.init(aBase, TEST_ASSET_PREFIX) + const s3mock: S3HelperMock = container.get(S3Helper) + expect(s3mock.listAll).toHaveBeenCalledWith(TEST_ASSET_PREFIX) + }) + + test('throws if not initialized', () => { + expect.assertions(1) + return airtableFetcher.fetchAll(keyValueMapping).catch((e: any) => expect(e).toBeDefined()) + }) + + test('maps items of requested table [no nested | no converters]', async () => { + apiMock.fetchAllByTable = vi.fn().mockReturnValue([smRecord]) + + await airtableFetcher.init(aBase, TEST_ASSET_PREFIX) + const res = await airtableFetcher.fetchAll(SimpleModel._mapping) + expect(apiMock.fetchAllByTable).toHaveBeenCalledWith( + SimpleModel._mapping.tableName, + SimpleModel._mapping.fields, + '', + ) + expect(res).toEqual([ + { + AIRTABLE_ID: smItemId, + AIRTABLE_TABLE: SimpleModel._mapping.tableName, + ...smRecord.fields, + }, + ]) + }) + + test('maps items of requested table [with nested | with converter | with attachment]', async () => { + apiMock.fetchAllByTable = vi.fn().mockReturnValueOnce([complexRecord]).mockReturnValueOnce([kvRecord]) + + await airtableFetcher.init(aBase, TEST_ASSET_PREFIX) + const res = await airtableFetcher.fetchAll(ComplexModel._mapping) + + expect(apiMock.fetchAllByTable).toHaveBeenCalledTimes(2) + expect(snsMock.publishMessageToTopic).toHaveBeenCalledTimes(1) + expect(snsMock.calls[0][0]).toEqual(config.airtableSync.downloadTopic) + expect(snsMock.calls[0][1]).toEqual(airtableImgAtt) + + expect(res).toEqual([ + { + AIRTABLE_ID: cmItemId, + AIRTABLE_TABLE: ComplexModel._mapping.tableName, + ...complexRecord.fields, + active: false, + title: { + [KEY_VALUE_SYMBOL]: true, + AIRTABLE_ID: kvItemId, + AIRTABLE_TABLE: keyValueMapping.tableName, + ...kvRecord.fields, + }, + image: { + id: airtableImgAtt.id, + ratio: (airtableImgAtt.thumbnails.large.height / airtableImgAtt.thumbnails.large.width) * 100, + type: airtableImgAtt.type, + url: attachmentUrlResolver.createUrl(airtableImgAtt.id, airtableImgAtt.filename), + }, + }, + ]) + }) +}) diff --git a/packages/airtable-syncer/src/services/airtable-fetcher.service.ts b/packages/airtable-syncer/src/services/airtable-fetcher.service.ts new file mode 100644 index 00000000..4cfa3543 --- /dev/null +++ b/packages/airtable-syncer/src/services/airtable-fetcher.service.ts @@ -0,0 +1,220 @@ +import { AirtableModelMapping, MAPPING_MARKER, MAPPING_MARKER__KEY_VALUE } from '@shiftcode/airtable-mapper' +import { LoggerService } from '@shiftcode/inversify-logger' +import { S3Helper } from '@shiftcode/lambda-utilities/s3' +import { Logger } from '@shiftcode/logger' +import { differenceInSeconds } from 'date-fns' +import { inject, injectable } from 'inversify' + +import { AirtableSyncConfig } from '../config/airtable-config.model.js' +import { AirtableIdRecord } from '../model/airtable-id-record.model.js' +import { KEY_VALUE_SYMBOL } from '../model/key-value.symbol.js' +import { AIRTABLE_SYNC_CONFIG } from '../module/airtable-sync-config.symbol.js' +import { isAirtableAttachment } from '../static/is-airtable-attachment.function.js' +import { isAirtableImage } from '../static/is-airtable-image.function.js' +import { supportedLanguagesToArray } from '../static/supported-languages-to-array.functions.js' +import { AirtableApi } from './airtable.api.js' +import { AttachmentUrlResolver } from './attachment-url-resolver.service.js' +import { SnsPublisher } from './sns-publisher.service.js' + +export interface TableCache { + lastUpdated: Date + items: Map +} + +// TODO: 26.05.19 - change logic to handle new airtable updated timestamp + +@injectable() +export class AirtableFetcher { + private static readonly FIELDS_TO_REMOVE_PREFIX = '_' + + // simple cache which stores all records for a table to minimize network calls + private readonly cache = new Map() + + // s3 keys + private s3Keys: Set = new Set() + + // flag + private initialized = false + + // supported languages + private readonly languageFields: string[] + private readonly logger: Logger + + constructor( + @inject(AIRTABLE_SYNC_CONFIG) private readonly config: AirtableSyncConfig, + private attachmentUrlResolver: AttachmentUrlResolver, + private s3Helper: S3Helper, + private airtableApi: AirtableApi, + private snsPublisher: SnsPublisher, + loggerService: LoggerService, + ) { + this.s3Helper.init(this.config.airtableSync.atBucketName) + this.languageFields = supportedLanguagesToArray(this.config.airtableSync.supportedLanguages) + this.logger = loggerService.getInstance('AirtableFetcher') + } + + clearCache() { + this.cache.clear() + } + + async init(base: string, s3AssetPrefix: string) { + this.logger.info(`init(base=${base}, s3AssetPrefix=${s3AssetPrefix})`) + this.airtableApi.setBase(base) + const result = await this.s3Helper.listAll(s3AssetPrefix) + this.s3Keys = new Set(Array.from(result.keys()).map((k) => this.attachmentUrlResolver.getId(k))) + this.initialized = true + } + + async fetchAll(map: AirtableModelMapping, ids: string[] = [], filterByFormula = ''): Promise { + if (!this.initialized) { + throw new Error( + `service was not initialized. first call "await airtableFetcher.init('YourBase', 'YourS3AssetsPrefix')" --> make sure to await the promise`, + ) + } + const res: AirtableIdRecord[] = await this.fetchInternal(map, ids, filterByFormula) + for (const record of res) { + for (const [k, mapping] of map.mappings) { + const key = k // cast keyof T to string + // applying possible converters also for undefined values + if (mapping.converter) { + record[key] = mapping.converter(record[key]) + } else if (record[key] !== undefined) { + const refs: string[] = record[key] + // possibility for unmapped wrapped types (for instance Attachments) + const fieldRecords = + mapping.fieldMapping !== null ? await this.fetchAll(mapping.fieldMapping, refs) : record[key] + record[key] = mapping.single ? fieldRecords[0] : fieldRecords.reverse() + } + } + // AirtableIdRecord is now actual T (except for KeyValue items which are reduced to a single string later + } + return (res) + } + + private async fetchInternal( + map: AirtableModelMapping, + ids: string[], + filterByFormula: string, + ): Promise { + // check if the mapping is marked to be a key value mapping, using symbols here to avoid issues when two different + // versions of the airtable-mapper package are used + const isKeyValueMapping = (map as any)[MAPPING_MARKER] === MAPPING_MARKER__KEY_VALUE + const fields = isKeyValueMapping ? this.languageFields : (map.fields as string[]) + + if (!this.cache.has(map.tableName)) { + this.logger.debug(`fetchInternal::no cache found for TABLE ${map.tableName}`) + const records = await this.airtableApi.fetchAllByTable(map.tableName, fields, filterByFormula) + + const recordsMap = new Map() + for (const r of records) { + // remove incoming refs and send sns event for attachments to initiate download to S3 + for (const field of Object.keys(r.fields)) { + if (field.startsWith(AirtableFetcher.FIELDS_TO_REMOVE_PREFIX)) { + delete r.fields[field] + } + await this.checkForAttachment(r.fields[field]) + } + /** + * adding symbol to indicate + * we use this in {@link reduceObjForLang} as a safe way to know which items to reduce + */ + if (isKeyValueMapping) { + r.fields[KEY_VALUE_SYMBOL] = true + } + r.fields.AIRTABLE_ID = r.getId() + r.fields.AIRTABLE_TABLE = map.tableName + recordsMap.set(r.getId(), r.fields) + } + + this.logger.info(`fetchInternal() fetched ${records.length} records -> adding to cache`) + this.cache.set(map.tableName, { lastUpdated: new Date(), items: recordsMap }) + } else { + // FIXME: implement working cache or remove it (see FL project too) + + const cache = this.cache.get(map.tableName)! // eslint-disable-line @typescript-eslint/no-non-null-assertion + const diff = differenceInSeconds(new Date(), cache.lastUpdated) + + this.logger.debug(`fetchInternal::reading from cache for TABLE ${map.tableName}. differenceInSeconds: ${diff}`) + } + + /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */ + const cachedRecordsMap: Map = this.cache.get(map.tableName)!.items + + if (ids && Array.isArray(ids) && ids.length) { + // filter only required ids + return ids.map((id) => { + if (cachedRecordsMap.has(id)) { + // create a copy + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return { ...cachedRecordsMap.get(id)! } + } else { + // it's possible that the cache is stalled, we don't try to refresh it + // TODO: Maybe we have to handle it, but it should only happen if a record gets deleted (not only changed or added) while we're importing (rare case) + // TODO: It's not possible to add a ref to a none existing record (inside airtable) + // TODO can also happen if there are filters accidentaly applied to the default «scView» + // todo: if table was fetched with a formula, not all (later requested) records might be in the cache. + // --> fix: store how the records were fetched, if with formula, fetch single record from airtable + this.logger.error( + `fetchInternal() ERROR -> A Record with ID: ${id} for TABLE:${map.tableName} is missing in cache`, + ) + throw new Error(`fetchInternal() Record with ID: ${id} for table ${map.tableName} is missing in cache`) + } + }) + } else { + // create a copy + return Array.from(cachedRecordsMap.values()).map((a) => ({ ...a })) + } + } + + private async checkForAttachment(attachment: any[]) { + if (Array.isArray(attachment)) { + for (const possibleAtt of attachment) { + if (isAirtableAttachment(possibleAtt)) { + // if attachment is not yet on s3 send sns event to initiate download + if (!this.s3Keys.has(possibleAtt.id)) { + try { + const msgId = await this.snsPublisher.publishMessageToTopic(this.config.airtableSync.downloadTopic, { + ...possibleAtt, + }) + this.logger.debug(`sent sns request with id: ${msgId} for: ${possibleAtt.id}'`) + } catch (e) { + try { + const str = JSON.stringify(possibleAtt) + if (e instanceof Error) { + this.logger.error(`failed to send sns request (${str}) for: ${possibleAtt?.id} (${e.name})`, e) + } else { + this.logger.error(`failed to send sns request (${str}) for: ${possibleAtt?.id}`, e) + } + } catch (e) { + this.logger.error(`failed to send sns request (can't JSON.stringify) for: ${possibleAtt?.id}`, e) + } + } + } else { + this.logger.debug(`attachment ${possibleAtt.id} is already on S3`) + } + // rewrite URL + possibleAtt.url = this.attachmentUrlResolver.createUrl(possibleAtt.id, possibleAtt.filename) + // add metadata + if (isAirtableImage(possibleAtt)) { + /* eslint-disable @typescript-eslint/ban-ts-comment */ + + /** add info to fulfill the {@link ImageAttachment} type */ + // @ts-ignore + possibleAtt.ratio = (possibleAtt.thumbnails.large.height / possibleAtt.thumbnails.large.width) * 100 + // fixme + // @ts-ignore + delete possibleAtt.thumbnails + } + // fixme + // @ts-ignore + delete possibleAtt.filename + // fixme + // @ts-ignore + delete possibleAtt.size + + /* eslint-enable @typescript-eslint/ban-ts-comment */ + } + } + } + } +} diff --git a/packages/airtable-syncer/src/services/airtable-sync.service.spec.ts b/packages/airtable-syncer/src/services/airtable-sync.service.spec.ts new file mode 100644 index 00000000..420f231a --- /dev/null +++ b/packages/airtable-syncer/src/services/airtable-sync.service.spec.ts @@ -0,0 +1,108 @@ +import { keyValueMapping } from '@shiftcode/airtable-mapper' +import { S3Helper } from '@shiftcode/lambda-utilities/s3' +import { Container } from 'inversify' +import { beforeEach, describe, expect, test, vi } from 'vitest' + +import { bindLoggerToContainer } from '../../test/add-logger-to-container.function.js' +import { AirtableFetcherMock } from '../../test/airtable-fetcher.mock.js' +import { ComplexModel } from '../../test/models/complex.model.js' +import { S3HelperMock } from '../../test/s3-helper.mock.js' +import { airtableImgAtt, cmItemId, complexRecord, kvItemId, kvRecord } from '../../test/some-items.js' +import { TestAttachmentUrlResolverService } from '../../test/test-attachment-url-resolver.service.js' +import { AirtableSyncConfig } from '../config/airtable-config.model.js' +import { KEY_VALUE_SYMBOL } from '../model/key-value.symbol.js' +import { AIRTABLE_SYNC_CONFIG } from '../module/airtable-sync-config.symbol.js' +import { AirtableFetcher } from './airtable-fetcher.service.js' +import { AirtableSync } from './airtable-sync.service.js' +import { AttachmentUrlResolver } from './attachment-url-resolver.service.js' + +const ASSET_PREFIX = 'test-assets/' +const DATA_PREFIX = 'test-data/' +const CONTENT_PREFIX = 'content/' +const AT_BASE = 'test-base' +const A_NAME = 'test-name' + +describe('Airtable Sync', () => { + let con: Container + let sync: AirtableSync + let attResolver: AttachmentUrlResolver + let s3Mock: S3HelperMock + let fetcherMock: AirtableFetcherMock + beforeEach(() => { + con = bindLoggerToContainer(new Container({ autobind: true, defaultScope: 'Singleton' })) + con.bind(AIRTABLE_SYNC_CONFIG).toConstantValue({ + airtableSync: { + atBucketName: 'bucket-name', + supportedLanguages: 'de, en', + apiKey: 'api-key', + downloadTopic: 'download-topic', + snsTopicRegion: 'sns-topic-region', + }, + } satisfies AirtableSyncConfig) + con + .bind(S3Helper) + .to(S3HelperMock) + .inSingletonScope() + con.bind(AttachmentUrlResolver).to(TestAttachmentUrlResolverService).inSingletonScope() + con + .bind(AirtableFetcher) + .to(AirtableFetcherMock) + .inSingletonScope() + attResolver = con.get(AttachmentUrlResolver) + s3Mock = con.get(S3Helper) + fetcherMock = con.get(AirtableFetcher) + sync = con.get(AirtableSync) + }) + + test('reduces key-values for all languages', async () => { + fetcherMock.fetchAll = vi.fn().mockReturnValue([ + { + AIRTABLE_ID: cmItemId, + AIRTABLE_TABLE: ComplexModel._mapping.tableName, + ...complexRecord.fields, + active: false, + title: { + [KEY_VALUE_SYMBOL]: true, + AIRTABLE_ID: kvItemId, + AIRTABLE_TABLE: keyValueMapping.tableName, + ...kvRecord.fields, + }, + image: { + id: airtableImgAtt.id, + ratio: (airtableImgAtt.thumbnails.large.height / airtableImgAtt.thumbnails.large.width) * 100, + type: airtableImgAtt.type, + url: attResolver.createUrl(airtableImgAtt.id, airtableImgAtt.filename), + }, + }, + ]) + sync.init(ASSET_PREFIX, DATA_PREFIX) + const resultPromise = sync.syncModels( + AT_BASE, + [ + { + s3KeyOrPrefix: A_NAME, + mapping: [ComplexModel._mapping], + }, + ], + CONTENT_PREFIX, + ) + + expect(resultPromise).toBeInstanceOf(Promise) + await resultPromise + + expect(fetcherMock.clearCache).toBeCalledTimes(1) + expect(fetcherMock.init).toBeCalledWith(AT_BASE, ASSET_PREFIX) + expect(fetcherMock.fetchAll).toBeCalledWith(ComplexModel._mapping) + expect(s3Mock.uploadJson).toHaveBeenCalledTimes(2) + + expect(s3Mock.uploadJsonCalls[0][0]).toBeInstanceOf(Array) + expect(s3Mock.uploadJsonCalls[0][0][0]).toBeDefined() + expect(s3Mock.uploadJsonCalls[0][0][0].title).toBe('de_test') + expect(s3Mock.uploadJsonCalls[0][1]).toBe('test-data/content/test-name_de.json') + + expect(s3Mock.uploadJsonCalls[1][0]).toBeInstanceOf(Array) + expect(s3Mock.uploadJsonCalls[1][0][0]).toBeDefined() + expect(s3Mock.uploadJsonCalls[1][0][0].title).toBe('en_test') + expect(s3Mock.uploadJsonCalls[1][1]).toBe('test-data/content/test-name_en.json') + }) +}) diff --git a/packages/airtable-syncer/src/services/airtable-sync.service.ts b/packages/airtable-syncer/src/services/airtable-sync.service.ts new file mode 100644 index 00000000..d01b45f2 --- /dev/null +++ b/packages/airtable-syncer/src/services/airtable-sync.service.ts @@ -0,0 +1,129 @@ +import { AirtableId, AirtableModelMapping } from '@shiftcode/airtable-mapper' +import { LoggerService } from '@shiftcode/inversify-logger' +import { S3Helper } from '@shiftcode/lambda-utilities/s3' +import { Logger } from '@shiftcode/logger' +import { inject, injectable } from 'inversify' + +import { AirtableSyncConfig } from '../config/airtable-config.model.js' +import { AIRTABLE_SYNC_CONFIG } from '../module/airtable-sync-config.symbol.js' +import { batchTasks } from '../static/batch-tasks.function.js' +import { reduceObjForLang } from '../static/reduce-obj-for-lang.function.js' +import { supportedLanguagesToArray } from '../static/supported-languages-to-array.functions.js' +import { AirtableFetcher } from './airtable-fetcher.service.js' + +export type NameFunction = (object: any) => string + +export type TransformFunction = (records: any[][]) => any + +export interface AirtableToS3 { + mapping: Array> + s3KeyOrPrefix: string + s3NameProperty?: string | NameFunction // if defined the specified property value will be used as name for the .json file + transformOrFilter?: TransformFunction + unwrap?: boolean +} + +@injectable() +export class AirtableSync { + s3DataPrefix: string + s3AssetPrefix: string + private readonly logger: Logger + + constructor( + @inject(AIRTABLE_SYNC_CONFIG) private readonly config: AirtableSyncConfig, + private s3Helper: S3Helper, + private airtableFetcher: AirtableFetcher, + loggerService: LoggerService, + ) { + this.s3Helper.init(this.config.airtableSync.atBucketName) + this.logger = loggerService.getInstance('AirtableSync') + } + + init(s3AssetPrefix: string, s3DataPrefix: string) { + this.s3DataPrefix = s3DataPrefix + this.s3AssetPrefix = s3AssetPrefix + } + + async syncModels(airtableBase: string, modelsToSync: AirtableToS3[], s3Prefix: string) { + if (!Array.isArray(modelsToSync)) { + throw new Error('given modelsToFetch is not an array') + } + + this.logger.info(`fetchModels`, { + base: airtableBase, + modelsToFetch: modelsToSync.map((m) => m.s3KeyOrPrefix), + s3Prefix, + }) + + this.airtableFetcher.clearCache() + await this.airtableFetcher.init(airtableBase, this.s3AssetPrefix) + + // start fetching + const supportedLanguages = this.config.airtableSync.supportedLanguages + const uploadTasks: Array<() => Promise> = [] + for (const mtf of modelsToSync) { + this.logger.debug(`fetchModel ${mtf.s3KeyOrPrefix}`) + // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents + let result: any | AirtableId[][] = [] + for (const typeMapping of mtf.mapping) { + const records = await this.airtableFetcher.fetchAll(typeMapping) + result.push(records) + } + if (mtf.transformOrFilter) { + result = mtf.transformOrFilter(result) + } else { + result = result[0] + } + + if (result) { + const keyBase = `${this.s3DataPrefix}${s3Prefix}${mtf.s3KeyOrPrefix}` + if (mtf.unwrap) { + for (const unwrappedResult of result) { + const s3NameProperty: string = + typeof mtf.s3NameProperty === 'function' + ? mtf.s3NameProperty(unwrappedResult) + : (mtf.s3NameProperty && unwrappedResult[mtf.s3NameProperty]) || unwrappedResult.AIRTABLE_ID + + const key = `${keyBase}${s3NameProperty}` + uploadTasks.push(...this.getUploadPerLanguageTask(unwrappedResult, key, supportedLanguages)) + } + } else { + uploadTasks.push(...this.getUploadPerLanguageTask(result, keyBase, supportedLanguages)) + } + } + } + + this.logger.debug(`${uploadTasks.length} upload tasks ready to be executed`) + + // S3 can handle 3500 upload requests per second for individual partitioned S3 prefix + // (https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html). + // Since the sync task is usually not time critical we still use a very simple implementation + // without handling individual limits per partitioned S3 prefix and observing the timing, we just provide a static value + // For now we use 50 as the aws sdk max sockets is set to 50 by default + // See: https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-configuring-maxsockets.html + for await (const task of batchTasks(uploadTasks, 50)) { + this.logger.debug( + `batch executed -> ok: ${task.filter((s) => s.status === 'fulfilled').length} / error: ${task.filter((s) => s.status === 'rejected').length}`, + ) + } + } + + private getUploadPerLanguageTask(result: any, key: string, supportedLanguages: string): Array<() => Promise> { + // remove json type suffix if it's there + if (/\.json$/.test(key)) { + key = key.substring(0, key.length - 5) + } + const languageFields = supportedLanguagesToArray(supportedLanguages) + + return languageFields.map((lang) => { + return () => { + return this.s3Helper + .uploadJson(reduceObjForLang(result, [lang, ...languageFields]), `${key}_${lang}.json`) + .catch((err) => { + this.logger.error(`Failed to upload to s3: ${key}_${lang}.json`, err) + throw err + }) + } + }) + } +} diff --git a/packages/airtable-syncer/src/services/airtable.api.spec.ts b/packages/airtable-syncer/src/services/airtable.api.spec.ts new file mode 100644 index 00000000..38154a4d --- /dev/null +++ b/packages/airtable-syncer/src/services/airtable.api.spec.ts @@ -0,0 +1,73 @@ +import { Container } from 'inversify' +import { afterEach, beforeEach, describe, expect, test } from 'vitest' + +import { bindLoggerToContainer } from '../../test/add-logger-to-container.function.js' +import { AirtableMock } from '../../test/airtable.mock.js' +import { AirtableSyncConfig } from '../config/airtable-config.model.js' +import { AIRTABLE_SYNC_CONFIG } from '../module/airtable-sync-config.symbol.js' +import { AirtableApi } from './airtable.api.js' + +const aBase = 'MyBase' +const aTable = 'MyTable' +const anItemId = 'MyItemId' +const aRecord = { + KEY: 'HI', +} +let container: Container +const config: AirtableSyncConfig = { + airtableSync: { + apiKey: 'NOT_DEFINED_API_KEY', + atBucketName: 'NOT_DEFINED_AT_BUCKET_NAME', + downloadTopic: 'downloadAttachments-xx1', + supportedLanguages: 'de,en', + snsTopicRegion: 'sns-topic-region', + }, +} + +describe('airtable.api', () => { + let airtableMock: AirtableMock + let airtableApi: AirtableApi + + beforeEach(() => { + container = bindLoggerToContainer( + new Container({ + autobind: true, + defaultScope: 'Singleton', + }), + ) + container.bind(AIRTABLE_SYNC_CONFIG).toConstantValue(config) + airtableApi = container.get(AirtableApi) + airtableMock = new AirtableMock() + Object.assign(airtableApi, { airtable: airtableMock }) + }) + afterEach(() => container.unbindAll()) + + test('should select on given table on the initalized base', () => { + airtableApi.setBase(aBase) + void airtableApi.fetchAllByTable(aTable, [], '') + expect(airtableMock.base).toHaveBeenCalledWith(aBase) + expect(airtableMock.mockedBase).toHaveBeenCalledWith(aTable) + expect(airtableMock.mockedTable.select).toHaveBeenCalled() + }) + + test('createItem', async () => { + airtableApi.setBase(aBase) + await airtableApi.createItem(aTable, aRecord) + expect(airtableMock.mockedTable.create).toBeCalledWith(aRecord) + }) + test('readItem', async () => { + airtableApi.setBase(aBase) + await airtableApi.readItem(aTable, anItemId) + expect(airtableMock.mockedTable.find).toBeCalledWith(anItemId) + }) + test('updateItem', async () => { + airtableApi.setBase(aBase) + await airtableApi.updateItem(aTable, anItemId, aRecord) + expect(airtableMock.mockedTable.update).toBeCalledWith(anItemId, aRecord) + }) + test('deleteItem', async () => { + airtableApi.setBase(aBase) + await airtableApi.deleteItem(aTable, anItemId) + expect(airtableMock.mockedTable.destroy).toBeCalledWith(anItemId) + }) +}) diff --git a/packages/airtable-syncer/src/services/airtable.api.ts b/packages/airtable-syncer/src/services/airtable.api.ts new file mode 100644 index 00000000..368efc47 --- /dev/null +++ b/packages/airtable-syncer/src/services/airtable.api.ts @@ -0,0 +1,80 @@ +import { LoggerService } from '@shiftcode/inversify-logger' +import { Logger } from '@shiftcode/logger' +// eslint-disable-next-line @typescript-eslint/naming-convention +import Airtable from 'airtable' +import { inject, injectable } from 'inversify' +// eslint-disable-next-line @typescript-eslint/naming-convention +import PQueue from 'p-queue' + +import { AirtableSyncConfig } from '../config/airtable-config.model.js' +import { AirtableRecord } from '../model/airtable-record.model.js' +import { AIRTABLE_SYNC_CONFIG } from '../module/airtable-sync-config.symbol.js' + +@injectable() +export class AirtableApi { + private static readonly ENDPOINT_URL = 'https://api.airtable.com' + private baseName: string + private base: Airtable.Base + private readonly airtable: Airtable + private readonly logger: Logger + /** A rate-limiting queue to avoid hitting Airtable API limits, executing max 5 requests per second. */ + private readonly queue = new PQueue({ concurrency: 5, interval: 1000, intervalCap: 5, carryoverIntervalCount: true }) + + constructor( + @inject(AIRTABLE_SYNC_CONFIG) private readonly config: AirtableSyncConfig, + loggerService: LoggerService, + ) { + this.logger = loggerService.getInstance('AirtableApi') + this.airtable = new Airtable({ + apiKey: this.config.airtableSync.apiKey, + endpointUrl: AirtableApi.ENDPOINT_URL, + noRetryIfRateLimited: true, + }) + } + + setBase(base: string): void { + this.baseName = base + this.base = this.airtable.base(base) + } + + async createItem(tableName: string, item: any): Promise { + return this.base(tableName).create(item) + } + + async readItem(tableName: string, airtableId: string): Promise { + return this.base(tableName).find(airtableId) + } + + async updateItem(tableName: string, airtableId: string, item: any): Promise { + return this.base(tableName).update(airtableId, item) + } + + async deleteItem(tableName: string, airtableId: string): Promise { + return this.base(tableName).destroy(airtableId) + } + + fetchAllByTable(tableName: string, fields: string[], filterByFormula: string): Promise>> { + return this.queue.add(async () => { + this.logger.info(`fetching table: ${tableName} on base ${this.baseName}`) + const startTime = Date.now() + const records: Array> = [] + const selectOptions: Airtable.SelectOptions = { pageSize: 100, view: 'scView', fields, filterByFormula } + try { + this.logger.debug('fetching with select options:', selectOptions) + await this.base(tableName) + .select(selectOptions) + // we use eachPage because we deactivated retry on the airtable client (see constructor) - reason 5s limit + .eachPage((pageRecords: Airtable.Records, next: any) => { + records.push(...pageRecords) + next() + }) + } catch (err) { + this.logger.error(`Airtable Error while fetching table ${tableName}:`, { selectOptions }, err) + throw err + } + const requestDuration = Date.now() - startTime + this.logger.info(`fetching of ${tableName} took: ${requestDuration} ms`) + return records + }) + } +} diff --git a/packages/airtable-syncer/src/services/attachment-url-resolver.service.ts b/packages/airtable-syncer/src/services/attachment-url-resolver.service.ts new file mode 100644 index 00000000..47238e5a --- /dev/null +++ b/packages/airtable-syncer/src/services/attachment-url-resolver.service.ts @@ -0,0 +1,8 @@ +import { injectable } from 'inversify' + +@injectable() +export abstract class AttachmentUrlResolver { + abstract createUrl(id: string, filename: string): string + + abstract getId(s3Key: string): string +} diff --git a/packages/airtable-syncer/src/services/sns-publisher.service.ts b/packages/airtable-syncer/src/services/sns-publisher.service.ts new file mode 100644 index 00000000..1445b969 --- /dev/null +++ b/packages/airtable-syncer/src/services/sns-publisher.service.ts @@ -0,0 +1,44 @@ +import { PublishCommand, PublishCommandInput, SNSClient } from '@aws-sdk/client-sns' +import { LoggerService } from '@shiftcode/inversify-logger' +import { Logger } from '@shiftcode/logger' +import { inject, injectable } from 'inversify' + +import { AirtableSyncConfig } from '../config/airtable-config.model.js' +import { AIRTABLE_SYNC_CONFIG } from '../module/airtable-sync-config.symbol.js' + +@injectable() +export class SnsPublisher { + private readonly snsClient: SNSClient + private readonly logger: Logger + + constructor( + @inject(AIRTABLE_SYNC_CONFIG) private readonly config: AirtableSyncConfig, + loggerService: LoggerService, + ) { + this.snsClient = new SNSClient({}) + this.logger = loggerService.getInstance('SnsPublisher') + } + + /** + * publishes the given message on given message + * @param topic topic to publish; gets prefixed to get the arn: `arn:aws:sns:${region}:${topic}` + * @param message, json serializable object + * @returns the published message id + */ + async publishMessageToTopic(topic: string, message: any): Promise { + try { + this.logger.debug(`publishing message to topic ${topic}`, message) + const topicArn = `arn:aws:sns:${this.config.airtableSync.snsTopicRegion}:${topic}` + const params: PublishCommandInput = { + Message: JSON.stringify(message), + TopicArn: topicArn, + } + const resp = await this.snsClient.send(new PublishCommand(params)) + this.logger.info(`published ${topicArn} to SNS`, resp) + return resp.MessageId + } catch (e) { + this.logger.error(`Error publishing message to topic ${topic}`, e) + throw e + } + } +} diff --git a/packages/airtable-syncer/src/static/airtable-record-default-keys.const.ts b/packages/airtable-syncer/src/static/airtable-record-default-keys.const.ts new file mode 100644 index 00000000..af09abae --- /dev/null +++ b/packages/airtable-syncer/src/static/airtable-record-default-keys.const.ts @@ -0,0 +1,3 @@ +import { AirtableId } from '@shiftcode/airtable-mapper' + +export const airtableRecordDefaultKeys: ReadonlyArray = ['AIRTABLE_ID', 'AIRTABLE_TABLE'] diff --git a/packages/airtable-syncer/src/static/batch-tasks.function.ts b/packages/airtable-syncer/src/static/batch-tasks.function.ts new file mode 100644 index 00000000..db524bef --- /dev/null +++ b/packages/airtable-syncer/src/static/batch-tasks.function.ts @@ -0,0 +1,12 @@ +/** + * Execute a batch of tasks in parallel with a given limit. + */ +export async function* batchTasks( + tasks: Array<() => Promise>, + limit: number, +): AsyncGenerator>> { + for (let i = 0; i < tasks.length; i = i + limit) { + const tasksChunk = tasks.slice(i, i + limit) + yield await Promise.allSettled(tasksChunk.map((task) => task())) + } +} diff --git a/packages/airtable-syncer/src/static/is-airtable-attachment.function.ts b/packages/airtable-syncer/src/static/is-airtable-attachment.function.ts new file mode 100644 index 00000000..6247a17e --- /dev/null +++ b/packages/airtable-syncer/src/static/is-airtable-attachment.function.ts @@ -0,0 +1,10 @@ +import { AirtableAttachment } from '@shiftcode/airtable-mapper' + +export function isAirtableAttachment(item: any): item is AirtableAttachment { + return ( + (item && + (item).id !== undefined && + (item).filename !== undefined && + (item).url !== undefined) + ) +} diff --git a/packages/airtable-syncer/src/static/is-airtable-image.function.ts b/packages/airtable-syncer/src/static/is-airtable-image.function.ts new file mode 100644 index 00000000..ee178789 --- /dev/null +++ b/packages/airtable-syncer/src/static/is-airtable-image.function.ts @@ -0,0 +1,5 @@ +import { AirtableAttachment, AirtableImageAttachment } from '@shiftcode/airtable-mapper' + +export function isAirtableImage(item: AirtableAttachment): item is AirtableImageAttachment { + return item.thumbnails !== undefined +} diff --git a/packages/airtable-syncer/src/static/reduce-obj-for-lang.function.spec.ts b/packages/airtable-syncer/src/static/reduce-obj-for-lang.function.spec.ts new file mode 100644 index 00000000..ba5c067d --- /dev/null +++ b/packages/airtable-syncer/src/static/reduce-obj-for-lang.function.spec.ts @@ -0,0 +1,297 @@ +import { describe, expect, test } from 'vitest' + +import { KEY_VALUE_SYMBOL } from '../model/key-value.symbol.js' +import { reduceObjForLang } from './reduce-obj-for-lang.function.js' + +describe('reduce obj for language', () => { + test('works on 1st nested props', () => { + const obj = { + description: { + [KEY_VALUE_SYMBOL]: true, + de: 'Beschreibung', + en: 'Description', + fr: 'Description', + AIRTABLE_ID: 'recTBdFYcmyHMte7n', + AIRTABLE_TABLE: 'KeyValue', + }, + factsFigures: { + [KEY_VALUE_SYMBOL]: true, + de: 'Zahlen & Fakten', + en: 'Numbers and facts', + fr: 'Faits et chiffres', + AIRTABLE_ID: 'rec3rfeCNzOZDcc3I', + AIRTABLE_TABLE: 'KeyValue', + }, + } + + const res = reduceObjForLang(obj, ['de']) + + expect(res).toEqual({ + description: 'Beschreibung', + factsFigures: 'Zahlen & Fakten', + }) + }) + test('works on multiple nested props', () => { + const obj = { + acc: { + tab: { + description: { + [KEY_VALUE_SYMBOL]: true, + de: 'Beschreibung', + en: 'Description', + fr: 'Description', + AIRTABLE_ID: 'recTBdFYcmyHMte7n', + AIRTABLE_TABLE: 'KeyValue', + }, + }, + factsFigures: { + [KEY_VALUE_SYMBOL]: true, + de: 'Zahlen & Fakten', + en: 'Numbers and facts', + fr: 'Faits et chiffres', + AIRTABLE_ID: 'rec3rfeCNzOZDcc3I', + AIRTABLE_TABLE: 'KeyValue', + }, + }, + filter: { + heading: { + [KEY_VALUE_SYMBOL]: true, + de: 'Buchen Sie Ihren Aufenthalt', + en: 'Book your stay', + fr: 'Réservez votre séjour', + AIRTABLE_ID: 'reccSxncnvTqiES7A', + AIRTABLE_TABLE: 'KeyValue', + }, + accommodationType: { + heading: { + [KEY_VALUE_SYMBOL]: true, + de: 'Art der Unterkunft:', + en: 'Type of accommodation:', + fr: "Type d'hébergement", + AIRTABLE_ID: 'recIryOmJCsXiFi6l', + AIRTABLE_TABLE: 'KeyValue', + }, + }, + }, + } + + const res = reduceObjForLang(obj, ['de']) + + expect(res).toEqual({ + acc: { + tab: { description: 'Beschreibung' }, + factsFigures: 'Zahlen & Fakten', + }, + filter: { + heading: 'Buchen Sie Ihren Aufenthalt', + accommodationType: { heading: 'Art der Unterkunft:' }, + }, + }) + }) + test('works on nested arrays', () => { + const obj = { + acc: [ + { + description: { + [KEY_VALUE_SYMBOL]: true, + de: 'Beschreibung', + en: 'Description', + fr: 'Description', + AIRTABLE_ID: 'recTBdFYcmyHMte7n', + AIRTABLE_TABLE: 'KeyValue', + }, + }, + { + [KEY_VALUE_SYMBOL]: true, + de: 'Zahlen & Fakten', + en: 'Numbers and facts', + fr: 'Faits et chiffres', + AIRTABLE_ID: 'rec3rfeCNzOZDcc3I', + AIRTABLE_TABLE: 'KeyValue', + }, + ], + } + + const res = reduceObjForLang(obj, ['de']) + + expect(res).toEqual({ + acc: [{ description: 'Beschreibung' }, 'Zahlen & Fakten'], + }) + }) + test('does not touch numbers', () => { + const obj = { + description: { + [KEY_VALUE_SYMBOL]: true, + de: 'Beschreibung', + en: 'Description', + fr: 'Description', + AIRTABLE_ID: 'recTBdFYcmyHMte7n', + AIRTABLE_TABLE: 'KeyValue', + }, + first: 1, + nested: { + hello: { + [KEY_VALUE_SYMBOL]: true, + de: 'HALLO', + en: 'HELLO', + fr: 'Bonjour', + AIRTABLE_ID: 'hjsdfklgjsdfg89u', + AIRTABLE_TABLE: 'KeyValue', + }, + second: 2, + }, + } + + const res = reduceObjForLang(obj, ['de']) + + expect(res).toEqual({ + description: 'Beschreibung', + first: 1, + nested: { + hello: 'HALLO', + second: 2, + }, + }) + }) + test('does not touch strings', () => { + const obj = { + description: { + [KEY_VALUE_SYMBOL]: true, + de: 'Beschreibung', + en: 'Description', + fr: 'Description', + AIRTABLE_ID: 'recTBdFYcmyHMte7n', + AIRTABLE_TABLE: 'KeyValue', + }, + first: 'first', + nested: { + hello: { + [KEY_VALUE_SYMBOL]: true, + de: 'HALLO', + en: 'HELLO', + fr: 'Bonjour', + AIRTABLE_ID: 'hjsdfklgjsdfg89u', + AIRTABLE_TABLE: 'KeyValue', + }, + second: 'second', + }, + } + + const res = reduceObjForLang(obj, ['de']) + + expect(res).toEqual({ + description: 'Beschreibung', + first: 'first', + nested: { + hello: 'HALLO', + second: 'second', + }, + }) + }) + test('does not touch null/undefined values', () => { + const obj = { + description: { + [KEY_VALUE_SYMBOL]: true, + de: 'Beschreibung', + en: 'Description', + fr: 'Description', + AIRTABLE_ID: 'recTBdFYcmyHMte7n', + AIRTABLE_TABLE: 'KeyValue', + }, + first: null, + nested: { + hello: { + [KEY_VALUE_SYMBOL]: true, + de: 'HALLO', + en: 'HELLO', + fr: 'Bonjour', + AIRTABLE_ID: 'hjsdfklgjsdfg89u', + AIRTABLE_TABLE: 'KeyValue', + }, + second: undefined, + }, + } + + const res = reduceObjForLang(obj, ['de']) + + expect(res).toEqual({ + description: 'Beschreibung', + first: null, + nested: { + hello: 'HALLO', + second: undefined, + }, + }) + }) + test('does not touch boolean values', () => { + const obj = { + description: { + [KEY_VALUE_SYMBOL]: true, + de: 'Beschreibung', + en: 'Description', + fr: 'Description', + AIRTABLE_ID: 'recTBdFYcmyHMte7n', + AIRTABLE_TABLE: 'KeyValue', + }, + first: true, + nested: { + hello: { + [KEY_VALUE_SYMBOL]: true, + de: 'HALLO', + en: 'HELLO', + fr: 'Bonjour', + AIRTABLE_ID: 'hjsdfklgjsdfg89u', + AIRTABLE_TABLE: 'KeyValue', + }, + second: false, + }, + } + + const res = reduceObjForLang(obj, ['de']) + + expect(res).toEqual({ + description: 'Beschreibung', + first: true, + nested: { + hello: 'HALLO', + second: false, + }, + }) + }) + test('filles non-defined values with fallback and indicator', () => { + const obj = { + description: { + [KEY_VALUE_SYMBOL]: true, + de: undefined, + en: 'Description', + fr: 'Description', + AIRTABLE_ID: 'recTBdFYcmyHMte7n', + AIRTABLE_TABLE: 'KeyValue', + }, + factsFigures: { + [KEY_VALUE_SYMBOL]: true, + de: 'Zahlen & Fakten', + en: 'Numbers and facts', + fr: 'Faits et chiffres', + AIRTABLE_ID: 'rec3rfeCNzOZDcc3I', + AIRTABLE_TABLE: 'KeyValue', + }, + factsFigures2: { + [KEY_VALUE_SYMBOL]: true, + de: undefined, + en: '', + fr: 'Faits et chiffres', + AIRTABLE_ID: 'rec3rfeCNzOZDcc3I', + AIRTABLE_TABLE: 'KeyValue', + }, + } + + const res = reduceObjForLang(obj, ['de', 'en', 'fr']) + + expect(res).toEqual({ + description: 'de:: Description', + factsFigures: 'Zahlen & Fakten', + factsFigures2: 'de:: Faits et chiffres', + }) + }) +}) diff --git a/packages/airtable-syncer/src/static/reduce-obj-for-lang.function.ts b/packages/airtable-syncer/src/static/reduce-obj-for-lang.function.ts new file mode 100644 index 00000000..97f0640c --- /dev/null +++ b/packages/airtable-syncer/src/static/reduce-obj-for-lang.function.ts @@ -0,0 +1,29 @@ +import { KEY_VALUE_SYMBOL } from '../model/key-value.symbol.js' + +const isDefined = (obj: any) => (lang: any) => obj[lang] !== undefined && obj[lang] !== '' + +/** + * recursively replaces key-value objects with the value corresponding to the first language + * or fallback with next non-undefined value in or lang from + */ +export function reduceObjForLang(obj: any, withLanguage: string[]): any { + if (!obj || typeof obj !== 'object') { + return obj + } else if (Array.isArray(obj)) { + return obj.map((i) => reduceObjForLang(i, withLanguage)) + } else if (KEY_VALUE_SYMBOL in obj) { + // replace the KV object with the actual value of given language + // if object is not defined or empty, fallback to another lang in the order defined in config + return isDefined(obj)(withLanguage[0]) + ? obj[withLanguage[0]] + : `${withLanguage[0]}:: ${obj[withLanguage.find(isDefined(obj)) || withLanguage[0]]}` + } else { + return Object.entries(obj).reduce( + (u, [k, v]) => { + u[k] = reduceObjForLang(v, withLanguage) + return u + }, + {}, + ) + } +} diff --git a/packages/airtable-syncer/src/static/supported-languages-to-array.functions.ts b/packages/airtable-syncer/src/static/supported-languages-to-array.functions.ts new file mode 100644 index 00000000..0a0446e8 --- /dev/null +++ b/packages/airtable-syncer/src/static/supported-languages-to-array.functions.ts @@ -0,0 +1,3 @@ +export function supportedLanguagesToArray(supportedLanguages: string): string[] { + return supportedLanguages.trim().split(/,\s*/) +} diff --git a/packages/airtable-syncer/test/add-logger-to-container.function.ts b/packages/airtable-syncer/test/add-logger-to-container.function.ts new file mode 100644 index 00000000..92ee8f06 --- /dev/null +++ b/packages/airtable-syncer/test/add-logger-to-container.function.ts @@ -0,0 +1,11 @@ +import { bindLogTransport, loggerModule } from '@shiftcode/inversify-logger' +import { LogLevel } from '@shiftcode/logger' +import { Container } from 'inversify' + +import { MockLogTransport } from './mock-log.transport.js' + +export function bindLoggerToContainer(con: Container): Container { + void bindLogTransport(con, LogLevel.DEBUG, MockLogTransport) + void con.load(loggerModule) + return con +} diff --git a/packages/airtable-syncer/test/airtable-fetcher.mock.ts b/packages/airtable-syncer/test/airtable-fetcher.mock.ts new file mode 100644 index 00000000..63566028 --- /dev/null +++ b/packages/airtable-syncer/test/airtable-fetcher.mock.ts @@ -0,0 +1,9 @@ +import { injectable } from 'inversify' +import { vi } from 'vitest' + +@injectable() +export class AirtableFetcherMock { + clearCache = vi.fn() + init = vi.fn() + fetchAll = vi.fn() +} diff --git a/packages/airtable-syncer/test/airtable.api.mock.ts b/packages/airtable-syncer/test/airtable.api.mock.ts new file mode 100644 index 00000000..f52d0296 --- /dev/null +++ b/packages/airtable-syncer/test/airtable.api.mock.ts @@ -0,0 +1,8 @@ +import { injectable } from 'inversify' +import { vi } from 'vitest' + +@injectable() +export class AirtableApiMock { + setBase = vi.fn() + fetchAllByTable = vi.fn() +} diff --git a/packages/airtable-syncer/test/airtable.mock.ts b/packages/airtable-syncer/test/airtable.mock.ts new file mode 100644 index 00000000..8af97929 --- /dev/null +++ b/packages/airtable-syncer/test/airtable.mock.ts @@ -0,0 +1,22 @@ +import { Records } from 'airtable' +import { vi } from 'vitest' + +export class AirtableMock { + selectMock = { + all: vi.fn().mockReturnValue(Promise.resolve(>[])), + firstPage: vi.fn().mockReturnValue(Promise.resolve(>[])), + eachPage: vi.fn().mockReturnValue(Promise.resolve()), + } + + mockedTable = { + select: vi.fn().mockReturnValue(this.selectMock), + find: vi.fn(), + create: vi.fn(), + update: vi.fn(), + replace: vi.fn(), + destroy: vi.fn(), + } + mockedBase = vi.fn().mockReturnValue(this.mockedTable) + + base = vi.fn().mockReturnValue(this.mockedBase) +} diff --git a/packages/airtable-syncer/test/mock-log.transport.ts b/packages/airtable-syncer/test/mock-log.transport.ts new file mode 100644 index 00000000..65f2a5a9 --- /dev/null +++ b/packages/airtable-syncer/test/mock-log.transport.ts @@ -0,0 +1,11 @@ +import { LogLevel, LogTransport } from '@shiftcode/logger' +import { injectable } from 'inversify' +import { vi } from 'vitest' + +@injectable() +export class MockLogTransport extends LogTransport { + log = vi.fn() + constructor(logLevel: LogLevel) { + super(logLevel) + } +} diff --git a/packages/airtable-syncer/test/models/complex.model.ts b/packages/airtable-syncer/test/models/complex.model.ts new file mode 100644 index 00000000..2a6cad18 --- /dev/null +++ b/packages/airtable-syncer/test/models/complex.model.ts @@ -0,0 +1,21 @@ +import { + AirtableId, + AirtableMapping, + booleanConverter, + ImageAttachment, + keyValueMapping, + KeyValueString, +} from '@shiftcode/airtable-mapper' + +export class ComplexModel extends AirtableId { + static _mapping = new AirtableMapping('ComplexModel') + .addMapping('title', keyValueMapping, true) + .addMapping('active', null, true, booleanConverter) + .addMapping('image', null, true) + + title!: KeyValueString + + active!: boolean + + image!: ImageAttachment +} diff --git a/packages/airtable-syncer/test/models/simple.model.ts b/packages/airtable-syncer/test/models/simple.model.ts new file mode 100644 index 00000000..39aa84d6 --- /dev/null +++ b/packages/airtable-syncer/test/models/simple.model.ts @@ -0,0 +1,8 @@ +import { AirtableId, AirtableMapping } from '@shiftcode/airtable-mapper' + +export class SimpleModel extends AirtableId { + static _mapping = new AirtableMapping('SimpleModel').addFields(['title', 'description']) + + title!: string + description!: string +} diff --git a/packages/airtable-syncer/test/s3-helper.mock.ts b/packages/airtable-syncer/test/s3-helper.mock.ts new file mode 100644 index 00000000..0c29f7f1 --- /dev/null +++ b/packages/airtable-syncer/test/s3-helper.mock.ts @@ -0,0 +1,17 @@ +import { injectable } from 'inversify' +import { vi } from 'vitest' + +@injectable() +export class S3HelperMock { + /** {@link S3Helper#init} */ + init = vi.fn() + + /** {@link S3Helper#listAll} */ + listAll = vi.fn().mockReturnValue(Promise.resolve(new Map())) + + uploadJson = vi.fn().mockReturnValue(Promise.resolve()) + + get uploadJsonCalls() { + return this.uploadJson.mock.calls + } +} diff --git a/packages/airtable-syncer/test/sns-publisher.mock.ts b/packages/airtable-syncer/test/sns-publisher.mock.ts new file mode 100644 index 00000000..9694c980 --- /dev/null +++ b/packages/airtable-syncer/test/sns-publisher.mock.ts @@ -0,0 +1,10 @@ +import { injectable } from 'inversify' +import { vi } from 'vitest' + +@injectable() +export class SnsPublisherMock { + get calls() { + return this.publishMessageToTopic.mock.calls + } + publishMessageToTopic = vi.fn().mockReturnValue(Promise.resolve('foo-bar-id')) +} diff --git a/packages/airtable-syncer/test/some-items.ts b/packages/airtable-syncer/test/some-items.ts new file mode 100644 index 00000000..24354a38 --- /dev/null +++ b/packages/airtable-syncer/test/some-items.ts @@ -0,0 +1,47 @@ +import { AirtableImageAttachment, keyValueMapping } from '@shiftcode/airtable-mapper' +// eslint-disable-next-line @typescript-eslint/naming-convention +import { default as Airtable } from 'airtable' + +import { ComplexModel } from './models/complex.model.js' +import { SimpleModel } from './models/simple.model.js' + +export const kvItemId = 'key-value-item-id' +export const smItemId = 'simple-mode-item-id' +export const cmItemId = 'complex-model-item-id' + +export const airtableImgAtt: AirtableImageAttachment = { + id: 'attNCOCHulHBoZrQ7', + url: 'https://dl.airtable.com/.attachments/54affbf839c877e245d59e9569b25230/5bae61a6/ml__0000s_0007_cray.jpg', + filename: 'ml__0000s_0007_cray.jpg', + type: 'image/jpeg', + size: 5583476, + thumbnails: { + large: { + url: 'anUrl', + width: 512, + height: 704, + }, + }, +} + +export const smRecord = new (Airtable).Record(SimpleModel._mapping.tableName, smItemId, { + fields: { + title: 'title', + description: 'description', + }, +}) + +export const kvRecord = new (Airtable).Record(keyValueMapping.tableName, kvItemId, { + fields: { + de: 'de_test', + en: 'en_test', + }, +}) + +export const complexRecord = new (Airtable).Record(ComplexModel._mapping.tableName, cmItemId, { + fields: { + title: [kvItemId], + active: undefined, + image: [{ ...airtableImgAtt }], + }, +}) diff --git a/packages/airtable-syncer/test/test-attachment-url-resolver.service.ts b/packages/airtable-syncer/test/test-attachment-url-resolver.service.ts new file mode 100644 index 00000000..81f2409e --- /dev/null +++ b/packages/airtable-syncer/test/test-attachment-url-resolver.service.ts @@ -0,0 +1,27 @@ +import { inject, injectable } from 'inversify' + +import { AIRTABLE_SYNC_CONFIG, AirtableSyncConfig, AttachmentUrlResolver } from '../src/index.js' + +export const TEST_ASSET_PREFIX = 'test-assets/' + +@injectable() +export class TestAttachmentUrlResolverService extends AttachmentUrlResolver { + private get prefix(): string { + return `/${TEST_ASSET_PREFIX}` + } + + constructor(@inject(AIRTABLE_SYNC_CONFIG) private config: AirtableSyncConfig) { + super() + } + + createUrl(filename: string, id: string): string { + return `${this.prefix}${id}` + } + + getId(url: string): string { + if (url.indexOf(this.prefix) !== 0) { + throw new Error('Foo Bar') + } + return url.slice(this.prefix.length) + } +} diff --git a/packages/airtable-syncer/test/vitest-setup.ts b/packages/airtable-syncer/test/vitest-setup.ts new file mode 100644 index 00000000..3f425aaf --- /dev/null +++ b/packages/airtable-syncer/test/vitest-setup.ts @@ -0,0 +1 @@ +import 'reflect-metadata' diff --git a/packages/airtable-syncer/tsconfig.json b/packages/airtable-syncer/tsconfig.json new file mode 100644 index 00000000..cae652c8 --- /dev/null +++ b/packages/airtable-syncer/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "strictPropertyInitialization": false, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/airtable-syncer/tsconfig.lint.json b/packages/airtable-syncer/tsconfig.lint.json new file mode 100644 index 00000000..f6252c46 --- /dev/null +++ b/packages/airtable-syncer/tsconfig.lint.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.lint.json", + "compilerOptions": { + "baseUrl": ".", + "experimentalDecorators": true, + "emitDecoratorMetadata": true + }, + "include": ["**/*.ts"] +} diff --git a/packages/airtable-syncer/tsconfig.spec.json b/packages/airtable-syncer/tsconfig.spec.json new file mode 100644 index 00000000..a0c9a69c --- /dev/null +++ b/packages/airtable-syncer/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.spec.json", + "compilerOptions": { + "baseUrl": ".", + "experimentalDecorators": true, + "emitDecoratorMetadata": true + }, + "include": ["src/**/*.spec.ts", "test/**/*.ts"] +} diff --git a/packages/airtable-syncer/vitest.config.js b/packages/airtable-syncer/vitest.config.js new file mode 100644 index 00000000..d54e45b3 --- /dev/null +++ b/packages/airtable-syncer/vitest.config.js @@ -0,0 +1,25 @@ +import swc from 'unplugin-swc' +import { defineConfig } from 'vitest/config' + +import CONFIG from '../../vitest.config.js' + +export default defineConfig({ + plugins: [ + swc.vite({ + jsc: { + parser: { + syntax: 'typescript', + decorators: true, + }, + transform: { + decoratorMetadata: true, + }, + target: 'es2022', + }, + }), + ], + test: { + ...CONFIG.test, + setupFiles: ['./test/vitest-setup.ts'], + }, +}) diff --git a/packages/branch-utilities/.lintstagedrc.yml b/packages/branch-utilities/.lintstagedrc.yml deleted file mode 100644 index 4ad7472b..00000000 --- a/packages/branch-utilities/.lintstagedrc.yml +++ /dev/null @@ -1,5 +0,0 @@ -'{src,test}/**/*.(t|j)s': - - npm run lint:staged - -'./package.json': - - sort-package-json diff --git a/packages/eslint-config-recommended/eslint.config.mjs b/packages/branch-utilities/eslint.config.js similarity index 100% rename from packages/eslint-config-recommended/eslint.config.mjs rename to packages/branch-utilities/eslint.config.js diff --git a/packages/branch-utilities/jest.config.js b/packages/branch-utilities/jest.config.js deleted file mode 100644 index 1ccdde95..00000000 --- a/packages/branch-utilities/jest.config.js +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-env node,es2023 */ -import { pathsToModuleNameMapper } from 'ts-jest' -import tsConfig from './tsconfig.jest.json' with { type: 'json' } - -export default { - testEnvironment: 'node', - extensionsToTreatAsEsm: ['.ts'], - transform: { - '^.+\\.ts$': ['ts-jest', { tsconfig: 'tsconfig.jest.json', useESM: true }], - }, - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - ...pathsToModuleNameMapper(tsConfig.compilerOptions.paths ?? {}), - }, -} diff --git a/packages/branch-utilities/lint-staged.config.js b/packages/branch-utilities/lint-staged.config.js new file mode 100644 index 00000000..165242df --- /dev/null +++ b/packages/branch-utilities/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['eslint --fix --cache', 'npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/packages/branch-utilities/package.json b/packages/branch-utilities/package.json index bcd12af3..ff7a9e7a 100644 --- a/packages/branch-utilities/package.json +++ b/packages/branch-utilities/package.json @@ -1,6 +1,6 @@ { "name": "@shiftcode/branch-utilities", - "version": "5.1.1", + "version": "6.0.0-pr254.7", "description": "Utilities for local and ci to get branch name and stage", "repository": "https://github.com/shiftcode/sc-commons-public", "license": "MIT", @@ -14,25 +14,20 @@ } }, "scripts": { - "prebuild": "rm -rf ./dist", - "build": "tsc", - "format": "npm run format:base -- --write", - "format:base": "prettier --config ../../.prettierrc.yml '{src,e2e,test}/**/*.ts'", - "format:ci": "npm run format:base -- --check", - "format:staged": "prettier --write --config ../../.prettierrc.yml", - "lint": "eslint --fix --cache ./src", - "lint:ci": "eslint ./src", - "lint:staged": "eslint --fix --cache", + "build": "rm -rf ./dist && tsc", + "format": "prettier --write .", + "lint": "eslint --fix --cache .", + "lint:ci": "eslint .", "prepublish": "node ../publish-helper/dist/prepare-dist.js", - "test": "NODE_OPTIONS=\"--experimental-vm-modules --trace-warnings\" npx jest --config jest.config.js", - "test:ci": "npm run test", - "test:watch": "npm run test -- --watch" + "test": "vitest --cache --run", + "test:ci": "vitest --no-cache --run && tsc -p ./tsconfig.spec.json", + "test:watch": "vitest --cache" }, "peerDependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^20.0.0 || ^22.0.0" + "node": ">=22.10.2" }, "publishConfig": { "directory": "dist" diff --git a/packages/branch-utilities/src/lib/base.utils.spec.ts b/packages/branch-utilities/src/lib/base.utils.spec.ts index 553d2fd8..e747b6f9 100644 --- a/packages/branch-utilities/src/lib/base.utils.spec.ts +++ b/packages/branch-utilities/src/lib/base.utils.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { BranchInfo, getBranchInfo, isProduction, isPullRequest, parseBranchName } from './base.utils.js' import { CustomGitHubContext, GithubActionEnv, GitHubContext } from './types/index.js' import { CustomScOverrideEnv } from './types/sc-override-env-var.type.js' diff --git a/packages/branch-utilities/tsconfig.json b/packages/branch-utilities/tsconfig.json index 6812fc36..be92441b 100644 --- a/packages/branch-utilities/tsconfig.json +++ b/packages/branch-utilities/tsconfig.json @@ -1,9 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist", - "declarationDir": "./dist", + "baseUrl": ".", "types": ["node"] }, "include": ["src/**/*.ts"] diff --git a/packages/branch-utilities/tsconfig.lint.json b/packages/branch-utilities/tsconfig.lint.json index 922aad8c..1386dd51 100644 --- a/packages/branch-utilities/tsconfig.lint.json +++ b/packages/branch-utilities/tsconfig.lint.json @@ -1,9 +1,5 @@ { - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": "./", - "types": ["jest", "node"] - }, - "include": ["src/**/*.ts", "test/**/*.ts"], - "exclude": [] + "extends": "../../tsconfig.lint.json", + "compilerOptions": { "baseUrl": "." }, + "include": ["**/*.ts"] } diff --git a/packages/eslint-plugin-rules/tsconfig.jest.json b/packages/branch-utilities/tsconfig.spec.json similarity index 57% rename from packages/eslint-plugin-rules/tsconfig.jest.json rename to packages/branch-utilities/tsconfig.spec.json index d40fa1e2..cd684dcb 100644 --- a/packages/eslint-plugin-rules/tsconfig.jest.json +++ b/packages/branch-utilities/tsconfig.spec.json @@ -1,7 +1,7 @@ { - "extends": "../../tsconfig.jest.json", + "extends": "../../tsconfig.spec.json", "compilerOptions": { - "baseUrl": "./" + "baseUrl": "." }, "include": ["src/**/*.spec.ts", "test/**/*.ts"] } diff --git a/packages/branch-utilities/vitest.config.js b/packages/branch-utilities/vitest.config.js new file mode 100644 index 00000000..ec160f83 --- /dev/null +++ b/packages/branch-utilities/vitest.config.js @@ -0,0 +1,3 @@ +import CONFIG from '../../vitest.config.js' + +export default CONFIG diff --git a/packages/cdk-utilities/CHANGELOG.md b/packages/cdk-utilities/CHANGELOG.md new file mode 100644 index 00000000..4ad11777 --- /dev/null +++ b/packages/cdk-utilities/CHANGELOG.md @@ -0,0 +1,150 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [5.4.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@5.3.0...@shiftcode/cdk-utils@5.4.0) (2026-01-23) + +### Features + +- **cloud-watch-api:** new construct ([66226e2](https://github.com/shiftcode/sc-commons/commit/66226e2cd457366453c5a9fbf3b33bc150889f93)) + +# [5.3.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@5.2.0...@shiftcode/cdk-utils@5.3.0) (2026-01-09) + +### Features + +- **cloud-watch-log-transport:** add documentation for external certificate usage ([8d4ebc3](https://github.com/shiftcode/sc-commons/commit/8d4ebc3a730dee63114b19c318c29872d300b4c6)) + +# [5.2.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@5.1.0...@shiftcode/cdk-utils@5.2.0) (2025-12-19) + +### Features + +- **cdk-utils:** accept ILogGroup as prop ([a52020b](https://github.com/shiftcode/sc-commons/commit/a52020b5207ec71ca92bb2033b015cd857cbd985)) + +# [5.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@5.0.0...@shiftcode/cdk-utils@5.1.0) (2025-09-23) + +### Features + +- **language-redirect-cf-function:** new construct for CF function ([3db9a1b](https://github.com/shiftcode/sc-commons/commit/3db9a1b60c2137c034ca1ed57b297977224e19f0)) +- **language-redirect-cf-function:** new construct for CF function ([a62f510](https://github.com/shiftcode/sc-commons/commit/a62f51045e8c0673c6b22e39133e99a3333b34a8)) + +# [5.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@4.1.1...@shiftcode/cdk-utils@5.0.0) (2025-05-23) + +### Bug Fixes + +- **cloud-watch-log-transport:** improve message escaping in log events ([4ea32ca](https://github.com/shiftcode/sc-commons/commit/4ea32ca3855b89c74e2ff2626db36ab2b8b61c05)) +- **cloud-watch-log-transport:** treat message as JSON instead of string for CloudWatch API ([7b815a7](https://github.com/shiftcode/sc-commons/commit/7b815a74f9e0dd6ddc1f1fce1dcd3d14ef226ad7)) + +### Features + +- **cloud-watch-log-transport:** include stack name in API name for better identification ([a1be41c](https://github.com/shiftcode/sc-commons/commit/a1be41cc17944c9ec0a73d25bf6b28a0ffe8031d)) + +### BREAKING CHANGES + +- **cloud-watch-log-transport:** requires stackName for API name + +## [4.1.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@4.1.0...@shiftcode/cdk-utils@4.1.1) (2025-05-21) + +### Bug Fixes + +- **cloud-watch-log-transport:** set CORS header dynamically based on allowed origins length ([229cc71](https://github.com/shiftcode/sc-commons/commit/229cc719ce0edb293021c9264d0402f7e3277e89)) +- **cloud-watch-log-transport:** update CORS header to ensure Access-Control-Allow-Origin compliance ([50c8ff3](https://github.com/shiftcode/sc-commons/commit/50c8ff3b5d57cc20ac2bbe548f4d85b8232453da)) + +# [4.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@4.0.2...@shiftcode/cdk-utils@4.1.0) (2025-05-14) + +### Bug Fixes + +- **cloud-watch-log:** add Access-Control-Allow-Origin to the response params ([e780a40](https://github.com/shiftcode/sc-commons/commit/e780a4085cbdb8e688107c621c2df4f894b0aebf)) + +### Features + +- **cloud-watch-log-transport:** expose log endpoints ([0c24b61](https://github.com/shiftcode/sc-commons/commit/0c24b61d197d92a16f2408f2aa2022d04f77a39c)) +- **cloud-watch-log-transport:** make domain config optional ([e5d75a4](https://github.com/shiftcode/sc-commons/commit/e5d75a41f3be15bb789cb7ff8dfbb00707126ea3)) +- **cloud-watch-log:** add integration and method responses to capture API errors ([e484ccb](https://github.com/shiftcode/sc-commons/commit/e484ccbd22070d44f14da3f5bb7bc9e089b9960b)) +- **cloud-watch-log:** move log group to props to make it configurable ([f39beae](https://github.com/shiftcode/sc-commons/commit/f39beae4da1ac7da425be9d9478aa3a3ca2607b4)) +- **logs:** add CloudWatchLogTransport construct and test CDK app ([82788e9](https://github.com/shiftcode/sc-commons/commit/82788e92650fb39f3039208d1f45e1a141c58f80)) + +## [4.0.2](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@4.0.1...@shiftcode/cdk-utils@4.0.2) (2025-03-06) + +### Bug Fixes + +- update engines definition (left over from node 22 upgrade) ([f5428ae](https://github.com/shiftcode/sc-commons/commit/f5428ae64c45567912887b8bab1e881c4312669f)) + +## [4.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@4.0.0...@shiftcode/cdk-utils@4.0.1) (2025-03-04) + +**Note:** Version bump only for package @shiftcode/cdk-utils + +# [4.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@3.1.0...@shiftcode/cdk-utils@4.0.0) (2024-07-13) + +### Build System + +- **node:** upgrade to node 20 ([2899d0d](https://github.com/shiftcode/sc-commons/commit/2899d0d41ece080b276e7bf84915d4849da81a29)) + +### BREAKING CHANGES + +- **node:** Minimum required node version is 20.11.1. In general speaking the runtime (Node or Browser) must support all es2023 features. + +# [3.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@3.0.0...@shiftcode/cdk-utils@3.1.0) (2023-12-18) + +### Features + +- **eslint-config:** disabled mt-specific config and added curly, eqeqeq ([9b2c7a0](https://github.com/shiftcode/sc-commons/commit/9b2c7a0e668949c022d8338e619fda09615c0dad)) + +# [3.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@2.1.0...@shiftcode/cdk-utils@3.0.0) (2023-05-15) + +### Features + +- **cdk-utils:** migrate to ESM (different related changes) ([9afff84](https://github.com/shiftcode/sc-commons/commit/9afff84ac559cf4d365f9db54b107bff921a56ad)) + +### BREAKING CHANGES + +- **cdk-utils:** only supported in projects using ESM + +# [2.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@2.0.0...@shiftcode/cdk-utils@2.1.0) (2023-03-17) + +### Features + +- **eslint-plugin:** introduce tests to verify correct implementation of plugins ([76d5b2f](https://github.com/shiftcode/sc-commons/commit/76d5b2f2bea5a3f4450e7ce43153fc2ddba832c1)) + +# [2.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@1.1.0...@shiftcode/cdk-utils@2.0.0) (2023-03-16) + +### Bug Fixes + +- **basic-auth-cf-function:** import ([e19af26](https://github.com/shiftcode/sc-commons/commit/e19af26f536cdb06bfcf2a5f57be2b1de5b5aa6c)) + +### Build System + +- **tsconfig:** build for es2022 target ([c75651b](https://github.com/shiftcode/sc-commons/commit/c75651b2b2ca6338e71b6538616d5b0e9bbb40cc)) + +### BREAKING CHANGES + +- **tsconfig:** requires ES2022 support (node@18) + +# [1.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/cdk-utils@1.0.0...@shiftcode/cdk-utils@1.1.0) (2022-04-01) + +### Features + +- **basic-auth-cf-function.construct:** new construct ([e5d2e16](https://github.com/shiftcode/sc-commons/commit/e5d2e168b02179c4d4324194105138f227dea91a)) + +## 1.0.0 (2022-01-11) + +- build(release): next version [skip_build] ([911da02](https://github.com/shiftcode/sc-commons/commit/911da02)) +- build(release): next version [skip_build] ([199066e](https://github.com/shiftcode/sc-commons/commit/199066e)) +- build(release): next version [skip_build] ([0c839e4](https://github.com/shiftcode/sc-commons/commit/0c839e4)) +- build(release): next version [skip_build] ([2722982](https://github.com/shiftcode/sc-commons/commit/2722982)) +- build(release): next version [skip_build] ([a0e996a](https://github.com/shiftcode/sc-commons/commit/a0e996a)) +- build(release): next version [skip_build] ([8d72402](https://github.com/shiftcode/sc-commons/commit/8d72402)) +- build(release): next version [skip_build] ([7bca45d](https://github.com/shiftcode/sc-commons/commit/7bca45d)) +- build(release): next version [skip_build] ([82c65ba](https://github.com/shiftcode/sc-commons/commit/82c65ba)) +- build(release): next version [skip_build] ([8589cd3](https://github.com/shiftcode/sc-commons/commit/8589cd3)) +- build(release): next version [skip_build] ([aaebf67](https://github.com/shiftcode/sc-commons/commit/aaebf67)) +- build(release): next version [skip_build] ([e38c9a6](https://github.com/shiftcode/sc-commons/commit/e38c9a6)) +- build(release): next version [skip_build] ([9470e94](https://github.com/shiftcode/sc-commons/commit/9470e94)) +- ci(prepare-dist): use from new sc-commons-public package ([5ad1e4e](https://github.com/shiftcode/sc-commons/commit/5ad1e4e)) +- fix(deps): move runtime dev-dependencies ([aa73004](https://github.com/shiftcode/sc-commons/commit/aa73004)) +- fix(imports): no deep imports from aws-cdk-lib/core ([67a17ee](https://github.com/shiftcode/sc-commons/commit/67a17ee)) +- feat(cdk-utils): new package for reusable cdk constructs / custom resources ([8842248](https://github.com/shiftcode/sc-commons/commit/8842248)) + +### BREAKING CHANGE + +- new package `@shiftcode/cdk-utils` diff --git a/packages/cdk-utilities/README.md b/packages/cdk-utilities/README.md new file mode 100644 index 00000000..00ce6d26 --- /dev/null +++ b/packages/cdk-utilities/README.md @@ -0,0 +1,5 @@ +# cdk-utilities + +> 🎯 Target runtime: es2023 ([Node >= 20](https://node.green/#ES2023)) + +Reusable Constructs and CustomResources for IAC with [aws-cdk-lib](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html). diff --git a/packages/cdk-utilities/eslint.config.js b/packages/cdk-utilities/eslint.config.js new file mode 100644 index 00000000..47256408 --- /dev/null +++ b/packages/cdk-utilities/eslint.config.js @@ -0,0 +1,13 @@ +import { defineScTsConfig } from '@shiftcode/eslint-config-recommended' + +export default defineScTsConfig( + { + languageOptions: { parserOptions: { project: ['./tsconfig.lint.json'] } }, + }, + { + files: ['**/*.ts'], + rules: { + 'import/no-internal-modules': ['error', { allow: ['aws-cdk-lib/*'] }], + }, + }, +) diff --git a/packages/cdk-utilities/lint-staged.config.js b/packages/cdk-utilities/lint-staged.config.js new file mode 100644 index 00000000..165242df --- /dev/null +++ b/packages/cdk-utilities/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['eslint --fix --cache', 'npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/packages/cdk-utilities/package.json b/packages/cdk-utilities/package.json new file mode 100644 index 00000000..8487bcae --- /dev/null +++ b/packages/cdk-utilities/package.json @@ -0,0 +1,44 @@ +{ + "name": "@shiftcode/cdk-utilities", + "version": "1.0.0-pr254.4", + "description": "Constructs for iac with aws-cdk-lib", + "repository": "https://github.com/shiftcode/sc-commons-public", + "license": "MIT", + "author": "shiftcode GmbH ", + "sideEffects": false, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "scripts": { + "build": "rm -rf ./dist && tsc", + "format": "prettier --write .", + "lint": "eslint --fix --cache .", + "lint:ci": "eslint .", + "prepublish": "node ../publish-helper/dist/prepare-dist.js", + "test": "vitest --cache --run", + "test:ci": "vitest --no-cache --run && tsc -p ./tsconfig.spec.json", + "test:watch": "vitest --cache" + }, + "dependencies": { + "just-pascal-case": "^3.2.0" + }, + "devDependencies": { + "aws-cdk-lib": "^2.3.0", + "constructs": "^10.0.0" + }, + "peerDependencies": { + "aws-cdk-lib": "^2.3.0", + "constructs": "^10.0.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=22.10.2" + }, + "publishConfig": { + "directory": "dist" + } +} diff --git a/packages/cdk-utilities/src/index.ts b/packages/cdk-utilities/src/index.ts new file mode 100644 index 00000000..da8a60f1 --- /dev/null +++ b/packages/cdk-utilities/src/index.ts @@ -0,0 +1,6 @@ +export * from './lib/basic-auth-cf-function.construct.js' +export * from './lib/cloud-watch-api.construct.js' +export * from './lib/cloud-watch-log-transport.construct.js' +export * from './lib/get-ssm-param.function.js' +export * from './lib/language-redirect-cf-function.construct.js' +export * from './lib/root-domain-redirect.construct.js' diff --git a/packages/cdk-utilities/src/lib/basic-auth-cf-function.construct.ts b/packages/cdk-utilities/src/lib/basic-auth-cf-function.construct.ts new file mode 100644 index 00000000..d465f14e --- /dev/null +++ b/packages/cdk-utilities/src/lib/basic-auth-cf-function.construct.ts @@ -0,0 +1,27 @@ +import { + Function as CloudFrontFunction, + FunctionCode, + FunctionProps, + FunctionRuntime, +} from 'aws-cdk-lib/aws-cloudfront' +import { Construct } from 'constructs' + +import { createBasicAuthCfFn } from './utils/create-basic-auth-cf-fn.function.js' + +export interface BasicAuthCloudFrontFunctionProps extends Omit { + user: string + password: string +} + +/** + * Simple CloudFrontFunction for {@link VIEWER_REQUEST} which will return `401 - Unauthorized` when not providing basic auth + */ +export class BasicAuthCloudFrontFunction extends CloudFrontFunction { + constructor(scope: Construct, id: string, config: BasicAuthCloudFrontFunctionProps) { + super(scope, id, { + ...config, + code: FunctionCode.fromInline(createBasicAuthCfFn(config.user, config.password)), + runtime: FunctionRuntime.JS_2_0, + }) + } +} diff --git a/packages/cdk-utilities/src/lib/cloud-watch-api.construct.ts b/packages/cdk-utilities/src/lib/cloud-watch-api.construct.ts new file mode 100644 index 00000000..92e31bfb --- /dev/null +++ b/packages/cdk-utilities/src/lib/cloud-watch-api.construct.ts @@ -0,0 +1,443 @@ +import { Stack } from 'aws-cdk-lib' +import { + AwsIntegration, + BasePathMapping, + Cors, + DomainName, + EndpointType, + IRestApi, + JsonSchemaType, + Model, + PassthroughBehavior, + RequestValidator, + RestApi, +} from 'aws-cdk-lib/aws-apigateway' +import { ICertificate } from 'aws-cdk-lib/aws-certificatemanager' +import { PolicyDocument, PolicyStatement, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam' +import { ILogGroup } from 'aws-cdk-lib/aws-logs' +import { ARecord, IHostedZone, RecordTarget } from 'aws-cdk-lib/aws-route53' +import { ApiGatewayDomain } from 'aws-cdk-lib/aws-route53-targets' +import { Construct } from 'constructs' + +export interface CloudWatchApiProps { + logGroup: ILogGroup + + /** @default {@link EndpointType.REGIONAL} */ + endpointType?: EndpointType + + /** + * allowed origins for CORS configuration + * @default {@link Cors.ALL_ORIGINS} + */ + allowedOrigins?: string[] + + domainConfig?: { + hostedZone: IHostedZone + /** + * use a certificate which is created outside the stack. + * Otherwise, we cannot delete the stack, since the ApiGateway uses a hidden resource (ALB) that uses the certificate. + * This hidden resource releases the certificate delayed, which prevents the certificate from being deleted as it is still in used + */ + certificate: ICertificate + subdomain: string + } + + /** + * resource name of the api gateway rest api + * @default `${stackName}-cloudwatch-api` + */ + restApiName?: string +} + +type DomainConfig = NonNullable + +const enum PathPart { + STREAMS = 'streams', + LOGS = 'logs', +} + +const enum PathParam { + LOG_STREAM_NAME = 'logStreamName', +} + +/** + * creates an API Gateway REST API to interact with CloudWatch Logs. + * exposes the following endpoints: + * - POST /streams: create a new log stream (body: { logStreamName: string }) + * - GET /streams/{logStreamName}: describe a log stream + * - POST /streams/{logStreamName}/logs: put log events to a log stream (body: { logEvents: Array<{ message: string, timestamp: number }> }) + */ +export class CloudWatchApi extends Construct { + readonly api: RestApi + readonly role: Role + readonly domain?: DomainName + readonly url: string + + constructor( + scope: Construct, + id: string, + protected readonly props: CloudWatchApiProps, + ) { + super(scope, id) + + this.role = this.createRole(this.props.logGroup) + this.api = this.createApi(this.role) + + if (this.props.domainConfig) { + const [domain] = this.addDomainToApi(this.api, this.props.domainConfig) + this.domain = domain + this.url = `https://${domain.domainName}` + } else { + this.url = this.api.url + } + } + + private createRole(logGroup: ILogGroup): Role { + return new Role(this, 'ApiGatewayCloudWatchRole', { + assumedBy: new ServicePrincipal('apigateway.amazonaws.com'), + inlinePolicies: { + logsPolicy: new PolicyDocument({ + statements: [ + new PolicyStatement({ + actions: ['logs:CreateLogStream', 'logs:DescribeLogStreams', 'logs:PutLogEvents'], + + resources: [logGroup.logGroupArn, `${logGroup.logGroupArn}:log-stream:*`], + }), + ], + }), + }, + }) + } + + private createApi(apiIntegrationRole: Role): RestApi { + const api = new RestApi(this, 'FrontendLogApi', { + restApiName: this.props.restApiName ?? `${Stack.of(this).stackName}-cloudwatch-api`, + endpointConfiguration: { types: [this.props.endpointType ?? EndpointType.REGIONAL] }, + defaultCorsPreflightOptions: { + allowOrigins: this.props.allowedOrigins ?? Cors.ALL_ORIGINS, + allowMethods: ['GET', 'POST'], + allowHeaders: ['Content-Type'], + }, + }) + + const errorResponseModel: Model = api.addModel('ErrorResponseModel', { + modelName: 'ErrorDto', + schema: { + type: JsonSchemaType.OBJECT, + properties: { + code: { type: JsonSchemaType.STRING }, + message: { type: JsonSchemaType.STRING }, + }, + required: ['code', 'message'], + additionalProperties: false, + }, + }) + + const bodyRequestValidator = new RequestValidator(this, 'BodyRequestValidator', { + requestValidatorName: 'Body Validator', + restApi: api, + validateRequestBody: true, + }) + + const streams = api.root.addResource(PathPart.STREAMS) + const stream = streams.addResource(`{${PathParam.LOG_STREAM_NAME}}`) + const streamLogs = stream.addResource(PathPart.LOGS) + + const allowedOrigin = this.props.allowedOrigins?.length === 1 ? this.props.allowedOrigins[0] : '*' + + // + // CREATE LOG STREAM + // + const logStreamCreateModel: Model = api.addModel('LogStreamCreateModel', { + modelName: 'LogStreamCreateDto', + schema: { + type: JsonSchemaType.OBJECT, + properties: { + logStreamName: { + type: JsonSchemaType.STRING, + pattern: '^[a-zA-Z0-9-_]{16,512}$', + }, + }, + required: ['logStreamName'], + additionalProperties: false, + }, + }) + const createLogStreamIntegration = new AwsIntegration({ + service: 'logs', + action: 'CreateLogStream', + integrationHttpMethod: 'POST', + options: { + credentialsRole: apiIntegrationRole, + passthroughBehavior: PassthroughBehavior.NEVER, + requestParameters: { + 'integration.request.header.X-Amz-Target': `'Logs_20140328.CreateLogStream'`, + 'integration.request.header.Content-Type': `'application/x-amz-json-1.1'`, + }, + requestTemplates: { + 'application/json': `{ + "logGroupName": "${this.props.logGroup.logGroupName}", + "logStreamName": $input.json('$.logStreamName') + }`, + }, + integrationResponses: [ + { + selectionPattern: '2\\d{2}', + statusCode: '201', + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'` }, + responseTemplates: { 'application/json': `#set($inputRoot = $input.path('$'))` }, + }, + { + selectionPattern: '4\\d{2}', + statusCode: '400', + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'` }, + responseTemplates: { + 'application/json': `{ + "code": $input.json('$.__type'), + "message": $input.json('$.message') + }`, + }, + }, + { + selectionPattern: '5\\d{2}', + statusCode: '500', + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'` }, + }, + ], + }, + }) + streams.addMethod('POST', createLogStreamIntegration, { + requestModels: { 'application/json': logStreamCreateModel }, + requestValidator: bodyRequestValidator, + methodResponses: [ + { + statusCode: '201', + responseModels: { 'application/json': Model.EMPTY_MODEL }, + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': true }, + }, + { + statusCode: '400', + responseModels: { 'application/json': errorResponseModel }, + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': true }, + }, + { + statusCode: '500', + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': true }, + }, + ], + }) + + // + // DESCRIBE LOG STREAM + // + const logStreamDescribeModel: Model = api.addModel('LogStreamDescribeModel', { + modelName: 'LogStreamDescribeDto', + schema: { + type: JsonSchemaType.OBJECT, + properties: { + logStreamName: { type: JsonSchemaType.STRING }, + creationTime: { type: JsonSchemaType.NUMBER }, + lastIngestionTime: { type: [JsonSchemaType.NUMBER, JsonSchemaType.NULL] }, + }, + required: ['logStreamName', 'creationTime', 'lastIngestionTime'], + additionalProperties: false, + }, + }) + const describeLogStreamsIntegration = new AwsIntegration({ + service: 'logs', + action: 'DescribeLogStreams', + integrationHttpMethod: 'POST', + options: { + credentialsRole: apiIntegrationRole, + passthroughBehavior: PassthroughBehavior.NEVER, + requestParameters: { + 'integration.request.header.Content-Type': `'application/x-amz-json-1.1'`, + 'integration.request.header.X-Amz-Target': `'Logs_20140328.DescribeLogStreams'`, + }, + requestTemplates: { + 'application/json': ` + { + "limit": 1, + "logGroupName": "${this.props.logGroup.logGroupName}", + "logStreamNamePrefix": "$input.params('${PathParam.LOG_STREAM_NAME}')" + }`, + }, + integrationResponses: [ + { + selectionPattern: '2\\d{2}', + statusCode: '200', + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'` }, + responseTemplates: { + 'application/json': ` +#set($streams = $input.path('$.logStreams')) +#if($streams.size() > 0) + { + "logStreamName": "$streams[0].logStreamName", + "creationTime": $streams[0].creationTime, +#if($streams[0].lastIngestionTime > 0) + "lastIngestionTime": $streams[0].lastIngestionTime +#else + "lastIngestionTime": null +#end + } +#else + #set($context.responseOverride.status = 404) + { + "code": "ResourceNotFoundException", + "message": "The specified log stream does not exist." + } +#end + `, + }, + }, + { + selectionPattern: '4\\d{2}', + statusCode: '400', + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'` }, + }, + { + selectionPattern: '5\\d{2}', + statusCode: '500', + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'` }, + }, + ], + }, + }) + stream.addMethod('GET', describeLogStreamsIntegration, { + methodResponses: [ + { + statusCode: '200', + responseModels: { 'application/json': logStreamDescribeModel }, + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': true }, + }, + { + statusCode: '404', + responseModels: { 'application/json': errorResponseModel }, + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': true }, + }, + { + statusCode: '500', + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': true }, + }, + ], + }) + + // + // PUT LOG EVENTS + // + const writeLogsModel = api.addModel('WriteLogsModel', { + modelName: 'WriteLogsDto', + schema: { + type: JsonSchemaType.OBJECT, + properties: { + logEvents: { + type: JsonSchemaType.ARRAY, + items: { + type: JsonSchemaType.OBJECT, + properties: { + message: { type: JsonSchemaType.STRING }, + timestamp: { type: JsonSchemaType.NUMBER }, + }, + required: ['message', 'timestamp'], + additionalProperties: false, + }, + }, + }, + required: ['logEvents'], + additionalProperties: false, + }, + }) + const putLogEventsIntegration = new AwsIntegration({ + service: 'logs', + action: 'PutLogEvents', + integrationHttpMethod: 'POST', + options: { + credentialsRole: apiIntegrationRole, + passthroughBehavior: PassthroughBehavior.NEVER, + requestParameters: { + 'integration.request.header.X-Amz-Target': `'Logs_20140328.PutLogEvents'`, + 'integration.request.header.Content-Type': `'application/x-amz-json-1.1'`, + }, + requestTemplates: { + 'application/json': `{ + "logGroupName": "${this.props.logGroup.logGroupName}", + "logStreamName": "$input.params('${PathParam.LOG_STREAM_NAME}')", + "logEvents": $input.json('$.logEvents') + }`, + }, + integrationResponses: [ + { + selectionPattern: '2\\d{2}', + statusCode: '201', + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'` }, + responseTemplates: { 'application/json': `#set($inputRoot = $input.path('$'))` }, + }, + { + selectionPattern: '4\\d{2}', + statusCode: '400', + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'` }, + responseTemplates: { + 'application/json': `{ + "code": $input.json('$.__type'), + "message": $input.json('$.message') + }`, + }, + }, + { + selectionPattern: '5\\d{2}', + statusCode: '500', + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'` }, + }, + ], + }, + }) + streamLogs.addMethod('POST', putLogEventsIntegration, { + requestModels: { + 'application/json': writeLogsModel, + }, + requestValidator: bodyRequestValidator, + methodResponses: [ + { + statusCode: '201', + responseModels: { 'application/json': Model.EMPTY_MODEL }, + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': true }, + }, + { + statusCode: '400', + responseModels: { 'application/json': errorResponseModel }, + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': true }, + }, + { + statusCode: '500', + responseParameters: { 'method.response.header.Access-Control-Allow-Origin': true }, + }, + ], + }) + + return api + } + + private addDomainToApi(api: IRestApi, domainConfig: DomainConfig): [DomainName, ARecord] { + const zoneName = domainConfig.hostedZone.zoneName.replace(/\.$/, '') + const domainName = `${domainConfig.subdomain}.${zoneName}` + + const domain = new DomainName(this, 'ApiCustomDomain', { + domainName, + certificate: domainConfig.certificate, + endpointType: this.props.endpointType ?? EndpointType.REGIONAL, + }) + + new BasePathMapping(this, 'BasePathMapping', { + domainName: domain, + restApi: api, + basePath: '', + }) + + const record = new ARecord(this, 'ApiDomainAliasRecord', { + zone: domainConfig.hostedZone, + recordName: domainConfig.subdomain, + target: RecordTarget.fromAlias(new ApiGatewayDomain(domain)), + }) + + return [domain, record] + } +} diff --git a/packages/cdk-utilities/src/lib/cloud-watch-log-transport.construct.ts b/packages/cdk-utilities/src/lib/cloud-watch-log-transport.construct.ts new file mode 100644 index 00000000..d6d46be3 --- /dev/null +++ b/packages/cdk-utilities/src/lib/cloud-watch-log-transport.construct.ts @@ -0,0 +1,257 @@ +import { CfnOutput } from 'aws-cdk-lib' +import { + AwsIntegration, + BasePathMapping, + Cors, + DomainName, + EndpointType, + PassthroughBehavior, + RestApi, +} from 'aws-cdk-lib/aws-apigateway' +import { ICertificate } from 'aws-cdk-lib/aws-certificatemanager' +import { Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam' +import { ILogGroup } from 'aws-cdk-lib/aws-logs' +import { ARecord, IHostedZone, RecordTarget } from 'aws-cdk-lib/aws-route53' +import { ApiGatewayDomain } from 'aws-cdk-lib/aws-route53-targets' +import { Construct } from 'constructs' + +export interface DomainConfig { + hostedZone: IHostedZone + /** + * use a certificate which is created outside the stack. + * Otherwise, we cannot delete the stack, since the ApiGateway uses a hidden resource (ALB) that uses the certificate. + * This hidden resource releases the certificate delayed, which prevents the certificate from being deleted as it is still in used + */ + certificate: ICertificate + subdomain: string +} + +export interface CloudWatchLogTransportProps { + logGroup: ILogGroup + stackName: string + domainConfig?: DomainConfig + allowedOrigins?: string[] + endpointType?: EndpointType +} + +/** + * @deprecated use {@link CloudWatchApi} instead. + */ +export class CloudWatchLogTransportConstruct extends Construct { + readonly logApiUrl: string + readonly createLogStreamApiUrl: string + + constructor( + scope: Construct, + id: string, + readonly props: CloudWatchLogTransportProps, + ) { + super(scope, id) + + const apiRole = new Role(this, 'ApiGatewayCloudWatchRole', { + assumedBy: new ServicePrincipal('apigateway.amazonaws.com'), + }) + props.logGroup.grantWrite(apiRole) + + const api = new RestApi(this, 'FrontendLogApi', { + restApiName: `${this.props.stackName}-FrontendLogApi`, + endpointConfiguration: { + types: [props.endpointType ?? EndpointType.REGIONAL], + }, + defaultCorsPreflightOptions: { + allowOrigins: props.allowedOrigins ?? Cors.ALL_ORIGINS, + allowMethods: ['POST'], + allowHeaders: ['Content-Type'], + }, + }) + + const allowedOrigin = props.allowedOrigins?.length === 1 ? props.allowedOrigins[0] : '*' + + const logIntegration = new AwsIntegration({ + service: 'logs', + action: 'PutLogEvents', + integrationHttpMethod: 'POST', + options: { + credentialsRole: apiRole, + passthroughBehavior: PassthroughBehavior.NEVER, + requestParameters: { + 'integration.request.header.X-Amz-Target': "'Logs_20140328.PutLogEvents'", + 'integration.request.header.Content-Type': "'application/x-amz-json-1.1'", + }, + integrationResponses: [ + { + statusCode: '200', + responseParameters: { + 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'`, + }, + }, + { + statusCode: '400', + responseParameters: { + 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'`, + }, + selectionPattern: '4\\d{2}', + responseTemplates: { + 'application/json': `{ + "error": "$input.path('$.__type')", + "message": "$input.path('$.message')" + }`, + }, + }, + { + statusCode: '500', + responseParameters: { + 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'`, + }, + selectionPattern: '5\\d{2}', + }, + ], + requestTemplates: { + 'application/json': `{ + "logGroupName": "${props.logGroup.logGroupName}", + "logStreamName": $input.json('$.logStreamName'), + "logEvents": [ + { + "timestamp": $input.json('$.timestamp'), + "message": $input.json('$.message') + } + ] + }`, + }, + }, + }) + + const createStreamIntegration = new AwsIntegration({ + service: 'logs', + action: 'CreateLogStream', + integrationHttpMethod: 'POST', + options: { + credentialsRole: apiRole, + passthroughBehavior: PassthroughBehavior.NEVER, + requestParameters: { + 'integration.request.header.X-Amz-Target': "'Logs_20140328.CreateLogStream'", + 'integration.request.header.Content-Type': "'application/x-amz-json-1.1'", + }, + integrationResponses: [ + { + statusCode: '200', + responseParameters: { + 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'`, + }, + selectionPattern: '2\\d{2}', + }, + { + statusCode: '400', + responseParameters: { + 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'`, + }, + selectionPattern: '4\\d{2}', + responseTemplates: { + 'application/json': `{ + "error": "$input.path('$.__type')", + "message": "$input.path('$.message')" + }`, + }, + }, + { + statusCode: '500', + responseParameters: { + 'method.response.header.Access-Control-Allow-Origin': `'${allowedOrigin}'`, + }, + selectionPattern: '5\\d{2}', + }, + ], + requestTemplates: { + 'application/json': `{ + "logGroupName": "${props.logGroup.logGroupName}", + "logStreamName": $input.json('$.logStreamName') + }`, + }, + }, + }) + + const logsResource = api.root.addResource('log') + logsResource.addMethod('POST', logIntegration, { + methodResponses: [ + { + statusCode: '200', + responseParameters: { + 'method.response.header.Access-Control-Allow-Origin': true, + }, + }, + { + statusCode: '400', + responseParameters: { + 'method.response.header.Access-Control-Allow-Origin': true, + }, + }, + { + statusCode: '500', + responseParameters: { + 'method.response.header.Access-Control-Allow-Origin': true, + }, + }, + ], + }) + + const createStreamResource = api.root.addResource('create-stream') + createStreamResource.addMethod('POST', createStreamIntegration, { + methodResponses: [ + { + statusCode: '200', + responseParameters: { + 'method.response.header.Access-Control-Allow-Origin': true, + }, + }, + { + statusCode: '400', + responseParameters: { + 'method.response.header.Access-Control-Allow-Origin': true, + }, + }, + { + statusCode: '500', + responseParameters: { + 'method.response.header.Access-Control-Allow-Origin': true, + }, + }, + ], + }) + + if (this.props.domainConfig) { + const domainConfig = this.props.domainConfig + const zoneName = domainConfig.hostedZone.zoneName.replace(/\.$/, '') + const domainName = `${domainConfig.subdomain}.${zoneName}` + const domain = new DomainName(this, 'ApiCustomDomain', { + domainName, + certificate: domainConfig.certificate, + endpointType: props.endpointType ?? EndpointType.REGIONAL, + }) + + new BasePathMapping(this, 'BasePathMapping', { + domainName: domain, + restApi: api, + basePath: '', + }) + + new ARecord(this, 'ApiDomainAliasRecord', { + zone: domainConfig.hostedZone, + recordName: domainConfig.subdomain, + target: RecordTarget.fromAlias(new ApiGatewayDomain(domain)), + }) + + this.logApiUrl = `https://${domainName}/log` + this.createLogStreamApiUrl = `https://${domainName}/create-stream` + } else { + this.logApiUrl = api.urlForPath('/log') + this.createLogStreamApiUrl = api.urlForPath('/create-stream') + } + + new CfnOutput(this, 'LogEndpointUrl', { + value: this.logApiUrl, + }) + new CfnOutput(this, 'CreateStreamEndpointUrl', { + value: this.createLogStreamApiUrl, + }) + } +} diff --git a/packages/cdk-utilities/src/lib/get-ssm-param.function.ts b/packages/cdk-utilities/src/lib/get-ssm-param.function.ts new file mode 100644 index 00000000..b2b2c27f --- /dev/null +++ b/packages/cdk-utilities/src/lib/get-ssm-param.function.ts @@ -0,0 +1,24 @@ +import { Stack } from 'aws-cdk-lib' +import { AwsCustomResource, AwsCustomResourcePolicy, PhysicalResourceId } from 'aws-cdk-lib/custom-resources' +import pascalCase from 'just-pascal-case' + +/** + * creates a customResource to get an SSM Param value from a specific region. + */ +export function getSsmParam(scope: Stack, region: string, paramName: string): string { + const paramRequest = new AwsCustomResource(scope, pascalCase(`GetSsmParameter-${region}-${paramName}`), { + /* will also be called for a CREATE event */ + onUpdate: { + service: 'SSM', + action: 'getParameter', + parameters: { + Name: paramName, + }, + region, + // Update physical id to always fetch the latest version + physicalResourceId: PhysicalResourceId.of(Date.now().toString()), + }, + policy: AwsCustomResourcePolicy.fromSdkCalls({ resources: AwsCustomResourcePolicy.ANY_RESOURCE }), + }) + return paramRequest.getResponseField('Parameter.Value') +} diff --git a/packages/cdk-utilities/src/lib/language-redirect-cf-function.construct.ts b/packages/cdk-utilities/src/lib/language-redirect-cf-function.construct.ts new file mode 100644 index 00000000..fd32a133 --- /dev/null +++ b/packages/cdk-utilities/src/lib/language-redirect-cf-function.construct.ts @@ -0,0 +1,33 @@ +import { + Function as CloudFrontFunction, + FunctionCode, + FunctionProps, + FunctionRuntime, +} from 'aws-cdk-lib/aws-cloudfront' +import { Construct } from 'constructs' + +import { createLanguageRedirectCfFn } from './utils/create-language-redirect-cf.fn.js' + +export interface LanguageRedirectCloudFrontFunctionProps + extends Omit { + languages: T[] + fallback: NoInfer + /** default: 'LANGUAGE' */ + languageCookieName?: string +} + +/** + * CloudFrontFunction for language redirect + * it will return a `302 - Found` redirecting to the preferred language path if not present as first path segment + */ +export class LanguageRedirectCloudFrontFunction extends CloudFrontFunction { + constructor(scope: Construct, id: string, config: LanguageRedirectCloudFrontFunctionProps) { + super(scope, id, { + ...config, + code: FunctionCode.fromInline( + createLanguageRedirectCfFn(config.languages, config.fallback, config.languageCookieName), + ), + runtime: FunctionRuntime.JS_2_0, + }) + } +} diff --git a/packages/cdk-utilities/src/lib/root-domain-redirect.construct.ts b/packages/cdk-utilities/src/lib/root-domain-redirect.construct.ts new file mode 100644 index 00000000..188c0a41 --- /dev/null +++ b/packages/cdk-utilities/src/lib/root-domain-redirect.construct.ts @@ -0,0 +1,121 @@ +import { RemovalPolicy } from 'aws-cdk-lib' +import { ICertificate } from 'aws-cdk-lib/aws-certificatemanager' +import { + CloudFrontWebDistribution, + HttpVersion, + OriginProtocolPolicy, + PriceClass, + SecurityPolicyProtocol, + SSLMethod, + ViewerCertificate, + ViewerProtocolPolicy, +} from 'aws-cdk-lib/aws-cloudfront' +import { ARecord, IHostedZone, RecordTarget } from 'aws-cdk-lib/aws-route53' +import { CloudFrontTarget } from 'aws-cdk-lib/aws-route53-targets' +import { Bucket, IBucket, RedirectProtocol } from 'aws-cdk-lib/aws-s3' +import { Construct } from 'constructs' + +export interface RootDomainRedirectProps { + /** + * the root domain name like `example.com` + */ + domain: string + + /** + * the hosted zone for the rootdomain in which the dns record is created + */ + hostedZone: IHostedZone + + /** + * the certificate for the cloudfront + * needs to include the root domain + * location of cert needs to be us-east-1 + */ + certificate: ICertificate + + /** + * the subdomain the redirects points to + * default www + */ + targetSubdomain?: string + + /** + * the name of the bucket for the redirect + * default generated like `example-com-www-redirect + */ + bucketName?: string +} + +/** + * creates a root redirect for a domain to its target subdomain (default www) + * redirects http in on step to https://www. (instead of http -> https -> www.) + * http://shiftcode.ch -> https://www.shiftcode.ch + * https://shiftcode.ch -> https://www.shiftcode.ch + * creates the following Resources: DnsRecord -> CfDistribution -> S3 Bucket + */ +export class RootDomainRedirect extends Construct { + readonly redirectBucket: Bucket + readonly cfDistribution: CloudFrontWebDistribution + readonly dnsRecord: ARecord + + constructor( + scope: Construct, + id: string, + readonly props: RootDomainRedirectProps, + ) { + super(scope, id) + + const targetSubdomain = props.targetSubdomain || 'www' + const bucketName = props.bucketName || `${props.domain.replace('.', '-')}-${targetSubdomain}-redirect` + + this.redirectBucket = this.createBucket(bucketName, props.domain, targetSubdomain) + this.cfDistribution = this.createCfDistribution(props.domain, props.certificate, this.redirectBucket) + this.dnsRecord = this.createDnsRecord(props.domain, props.hostedZone, this.cfDistribution) + } + + private createBucket(bucketName: string, domain: string, targetSubdomain: string) { + return new Bucket(this, 'Bucket', { + bucketName, + publicReadAccess: true, + websiteRedirect: { + hostName: `${targetSubdomain}.${domain}`, + protocol: RedirectProtocol.HTTPS, + }, + removalPolicy: RemovalPolicy.DESTROY, + autoDeleteObjects: true, + }) + } + + private createCfDistribution(domain: string, certificate: ICertificate, bucket: IBucket) { + return new CloudFrontWebDistribution(this, 'CloudFrontDistribution', { + comment: `root domain redirect for ${domain}`, + defaultRootObject: '', + priceClass: PriceClass.PRICE_CLASS_ALL, + httpVersion: HttpVersion.HTTP2, + viewerCertificate: ViewerCertificate.fromAcmCertificate(certificate, { + aliases: [domain], + sslMethod: SSLMethod.SNI, + securityPolicy: SecurityPolicyProtocol.TLS_V1_2_2019, + }), + originConfigs: [ + { + customOriginSource: { + domainName: bucket.bucketWebsiteDomainName, + originProtocolPolicy: OriginProtocolPolicy.HTTP_ONLY, + }, + behaviors: [{ isDefaultBehavior: true }], + }, + ], + // s3 will redirect to https // prevents having 2 redirects (cf+s3) + viewerProtocolPolicy: ViewerProtocolPolicy.ALLOW_ALL, + }) + } + + private createDnsRecord(domain: string, hostedZone: IHostedZone, cfDistribution: CloudFrontWebDistribution) { + return new ARecord(this, 'AliasRecord', { + recordName: domain, + target: RecordTarget.fromAlias(new CloudFrontTarget(cfDistribution)), + zone: hostedZone, + }) + } +} diff --git a/packages/cdk-utilities/src/lib/utils/cloudfront-function-request.type.ts b/packages/cdk-utilities/src/lib/utils/cloudfront-function-request.type.ts new file mode 100644 index 00000000..58bcfc60 --- /dev/null +++ b/packages/cdk-utilities/src/lib/utils/cloudfront-function-request.type.ts @@ -0,0 +1,72 @@ +type Value = { value: string } | { value: string; multiValue: Array<{ value: string }> } + +// created based on https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html#functions-event-structure-viewer +export interface CloudFrontFunctionEvent { + version: '1.0' + context: { + /** + * The CloudFront domain name (for example, d111111abcdef8.cloudfront.net) of the distribution that's associated with the event. + */ + distributionDomainName: string + + /** + * The ID of the distribution(for example, EDFDVBD6EXAMPLE) that's associated with the event. + */ + distributionId: string + + /** + * The event type, either viewer-request or viewer-response. + */ + eventType: string + + /** + * A string that uniquely identifies a CloudFront request(and its associated response). + */ + requestId: string + } + viewer: { + ip: string + } + request: { + /** + * HTTP method of the request + */ + method: string + /** + * The relative path of the requested object. + */ + uri: string + /** + * An object that represents the query string in the request. If the request doesn't include a query string, + * the request object still includes an empty querystring object. + * + * The querystring object contains one field for each query string parameter in the request. + */ + querystring: Record + /** + * An object that represents the HTTP headers in the request. If the request contains any Cookie headers, those + * headers are not part of the headers object. Cookies are represented separately in the cookies object. + * + * The headers object contains one field for each header in the request. Header names are converted to lowercase + * in the event object, and header names must be lowercase when they're added by your function code. + * When CloudFront Functions converts the event object back into an HTTP request, the first letter of each word + * in header names is capitalized. Words are separated by a hyphen (-). For example, if your function code adds + * a header named example-header-name, CloudFront converts this to Example-Header-Name in the HTTP request. + */ + headers: Record + /** + * An object that represents the cookies in the request (Cookie headers). + * + * The cookies object contains one field for each cookie in the request. + */ + cookies: Record + } +} + +export interface CloudFrontFunctionHandler { + ( + event: CloudFrontFunctionEvent, + ): + | CloudFrontFunctionEvent['request'] + | { statusCode: number; statusDescription?: string; headers?: Record } +} diff --git a/packages/cdk-utilities/src/lib/utils/create-basic-auth-cf-fn.function.spec.ts b/packages/cdk-utilities/src/lib/utils/create-basic-auth-cf-fn.function.spec.ts new file mode 100644 index 00000000..bc2dc27a --- /dev/null +++ b/packages/cdk-utilities/src/lib/utils/create-basic-auth-cf-fn.function.spec.ts @@ -0,0 +1,67 @@ +import { describe, expect, test } from 'vitest' + +import type { CloudFrontFunctionEvent } from './cloudfront-function-request.type.js' +import { createBasicAuthCfFn } from './create-basic-auth-cf-fn.function.js' + +describe('createBasicAuthCfFn', () => { + function setup(...parameters: Parameters) { + const fnCode = createBasicAuthCfFn(...parameters) + + // Wrap the string so it returns the handler + // eslint-disable-next-line @typescript-eslint/no-implied-eval + const getHandler = Function(`${fnCode}\n return handler;`) + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + return getHandler() as (event: CloudFrontFunctionEvent) => any + } + + test('creates an executable function', () => { + const handler = setup('user1', 'p@ssw0rD') + expect(typeof handler).toBe('function') + }) + + test('allows access with correct credentials', () => { + const handler = setup('user1', 'p@ssw0rD') + const event: CloudFrontFunctionEvent = { + version: '1.0', + context: {} as any, + viewer: { ip: '' }, + request: { + method: 'GET', + uri: '/', + querystring: {}, + headers: { + authorization: { value: 'Basic ' + Buffer.from('user1:p@ssw0rD').toString('base64') }, + }, + cookies: {}, + }, + } + + const result = handler(event) + expect(result).toBe(event.request) + }) + + test('denies access with incorrect credentials', () => { + const handler = setup('user1', 'p@ssw0rD') + const event: CloudFrontFunctionEvent = { + version: '1.0', + context: {} as any, + viewer: { ip: '' }, + request: { + method: 'GET', + uri: '/', + querystring: {}, + headers: { + authorization: { value: 'Basic ' + Buffer.from('user1:wrongpassword').toString('base64') }, + }, + cookies: {}, + }, + } + + const result = handler(event) + expect(result).toEqual({ + statusCode: 401, + statusDescription: 'Unauthorized', + headers: { 'www-authenticate': { value: 'Basic' } }, + }) + }) +}) diff --git a/packages/cdk-utilities/src/lib/utils/create-basic-auth-cf-fn.function.ts b/packages/cdk-utilities/src/lib/utils/create-basic-auth-cf-fn.function.ts new file mode 100644 index 00000000..7c72e3cb --- /dev/null +++ b/packages/cdk-utilities/src/lib/utils/create-basic-auth-cf-fn.function.ts @@ -0,0 +1,16 @@ +export function createBasicAuthCfFn(user: string, pw: string): string { + const auth = 'Basic ' + Buffer.from(`${user}:${pw}`).toString('base64') + return ` +function handler(event) { + var authHeader = event.request.headers['authorization'] + if (authHeader && authHeader.value === '${auth}') { + return event.request + } + return { + statusCode: 401, + statusDescription: 'Unauthorized', + headers: { 'www-authenticate': { value: 'Basic' } } + } +} +` +} diff --git a/packages/cdk-utilities/src/lib/utils/create-language-redirect-cf.fn.ts b/packages/cdk-utilities/src/lib/utils/create-language-redirect-cf.fn.ts new file mode 100644 index 00000000..b78a0ee4 --- /dev/null +++ b/packages/cdk-utilities/src/lib/utils/create-language-redirect-cf.fn.ts @@ -0,0 +1,76 @@ +/** + * Creates a CloudFront Function code string for language-based redirection. + * The function checks the request path, cookies, and Accept-Language header to determine the appropriate language. + * this Code is expected to run in JavaScript runtime 2.0 from CloudFront. + * see {@link https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-javascript-runtime-20.html} + */ +export function createLanguageRedirectCfFn( + languages: T[], + fallback: T, + languageCookieName: string = 'LANGUAGE', +): string { + return ` +const languages = ${JSON.stringify(languages)}; +const FALLBACK_LANG = ${JSON.stringify(fallback)}; +const COOKIE_NAME = ${JSON.stringify(languageCookieName)}; + +function handler(event) { + const headers = event.request.headers + + const pathParts = event.request.uri.split('/').filter((part) => part.length > 0) + if (pathParts.length > 0 && languages.includes(pathParts[0])) { + return event.request + } + + const proposedLanguage = getProposedLanguage( + languages, + getCookieValue(headers.cookie ? headers.cookie.value : '', COOKIE_NAME), + headers['accept-language'], + FALLBACK_LANG, + ) + + const host = headers.host ? headers.host.value : '' + const uri = event.request.uri === '/' ? '' : event.request.uri + + return { + statusCode: 302, + statusDescription: 'Found', + headers: { + location: { value: \`https://\${host}/\${proposedLanguage}\${uri}\` }, + 'cache-control': { value: 'max-age=3600' }, + 'content-type': { value: 'text/plain' }, + } + } +} + +function getProposedLanguage(languages, languageCookie, acceptLanguageHeader, fallbackLanguage) { + if (languages.includes(languageCookie)) { + return languageCookie + } + if (acceptLanguageHeader) { + const acceptedLanguages = acceptLanguageHeader.value.split(',') + for (let i = 0; i < acceptedLanguages.length; i++) { + const lang = acceptedLanguages[i].split(';')[0].trim() + if (languages.includes(lang)) { + return lang + } + } + } + return fallbackLanguage +} + +function getCookieValue(cookieString, cookieName) { + if (!cookieString) { + return null + } + const cookies = cookieString.split(';') + for (let i = 0; i < cookies.length; i++) { + const cookie = cookies[i].trim() + if (cookie.indexOf(cookieName + '=') === 0) { + return cookie.substring(cookieName.length + 1) + } + } + return null +} +` +} diff --git a/packages/cdk-utilities/src/lib/utils/create-language-redirect-cf.function.spec.ts b/packages/cdk-utilities/src/lib/utils/create-language-redirect-cf.function.spec.ts new file mode 100644 index 00000000..5a4dd3a8 --- /dev/null +++ b/packages/cdk-utilities/src/lib/utils/create-language-redirect-cf.function.spec.ts @@ -0,0 +1,142 @@ +import { describe, expect, test } from 'vitest' + +import type { CloudFrontFunctionEvent } from './cloudfront-function-request.type.js' +import { createLanguageRedirectCfFn } from './create-language-redirect-cf.fn.js' + +function createCfFunctionEvent( + url: string, + headers: CloudFrontFunctionEvent['request']['headers'] = {}, +): CloudFrontFunctionEvent { + // split the url into host and path + const urlParts = url.split('/') + const host = urlParts[0] + const uri = '/' + urlParts.slice(1).join('/') + + // add host header + headers.host = { value: host } + + return { + version: '1.0', + context: {} as any, + viewer: { ip: '' }, + request: { + method: 'GET', + uri, + querystring: {}, + headers, + cookies: {}, + }, + } +} + +describe('createLanguageRedirectCfFn', () => { + function setup(...parameters: Parameters) { + const fnCode = createLanguageRedirectCfFn(...parameters) + + // Wrap the string so it returns the handler + // eslint-disable-next-line @typescript-eslint/no-implied-eval + const getHandler = Function(`${fnCode}\n return handler;`) + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + return getHandler() as (event: CloudFrontFunctionEvent) => any + } + + test('creates an executable function', () => { + const handler = setup(['en', 'de'], 'en') + expect(typeof handler).toBe('function') + }) + + test('does not contain a "debugger" statement', () => { + // cuz that's the only way to debug it, and we really don't want that in prod + const fnCode = createLanguageRedirectCfFn(['en', 'de'], 'en') + expect(fnCode).not.toMatch(/debugger;?/) + }) + + test('returns the request when already on a language path', () => { + const handler = setup(['en', 'de', 'fr'], 'en') + const event = createCfFunctionEvent('shiftcode.io/de/some/path') + const result = handler(event) + expect(result).toBe(event.request) + }) + + test('does not accept language paths not in the list but behaves like it is an ordinary path part', () => { + const handler = setup(['en', 'de', 'fr'], 'en') + const event = createCfFunctionEvent('shiftcode.io/it/some/path') + const result = handler(event) + expect(result).not.toBe(event.request) + expect(result).toEqual({ + statusCode: 302, + statusDescription: 'Found', + headers: expect.objectContaining({ + location: { value: 'https://shiftcode.io/en/it/some/path' }, + }), + }) + }) + + test('redirects to fallback language when no cookie or header present', () => { + const handler = setup(['en', 'de', 'fr'], 'en') + const event = createCfFunctionEvent('shiftcode.io') + const result = handler(event) + expect(result).toEqual({ + statusCode: 302, + statusDescription: 'Found', + headers: expect.objectContaining({ + location: { value: 'https://shiftcode.io/en' }, + }), + }) + }) + + test('keeps the path when redirecting to fallback language', () => { + const handler = setup(['en', 'de', 'fr'], 'en') + const event = createCfFunctionEvent('shiftcode.io/some/path') + const result = handler(event) + expect(result).toEqual({ + statusCode: 302, + statusDescription: 'Found', + headers: expect.objectContaining({ + location: { value: 'https://shiftcode.io/en/some/path' }, + }), + }) + }) + + test('redirects by accept-language header', () => { + const handler = setup(['en', 'de', 'fr'], 'en', 'LANGUAGE') + const event = createCfFunctionEvent('shiftcode.io', { 'accept-language': { value: 'fr, de;q=0.8, en;q=0.6' } }) + const result = handler(event) + expect(result).toEqual({ + statusCode: 302, + statusDescription: 'Found', + headers: expect.objectContaining({ + location: { value: 'https://shiftcode.io/fr' }, + }), + }) + }) + + test('redirects by custom language cookie', () => { + const handler = setup(['en', 'de', 'fr'], 'en', 'LANGUAGE') + const event = createCfFunctionEvent('shiftcode.io', { cookie: { value: 'en=fr;LANGUAGE=de' } }) + const result = handler(event) + expect(result).toEqual({ + statusCode: 302, + statusDescription: 'Found', + headers: expect.objectContaining({ + location: { value: 'https://shiftcode.io/de' }, + }), + }) + }) + + test('prefers cookie over accept-language header', () => { + const handler = setup(['en', 'de', 'fr'], 'en', 'LANGUAGE') + const event = createCfFunctionEvent('shiftcode.io', { + cookie: { value: 'LANGUAGE=de' }, + 'accept-language': { value: 'fr, en;q=0.8, it;q=0.6' }, + }) + const result = handler(event) + expect(result).toEqual({ + statusCode: 302, + statusDescription: 'Found', + headers: expect.objectContaining({ + location: { value: 'https://shiftcode.io/de' }, + }), + }) + }) +}) diff --git a/packages/cdk-utilities/tsconfig.json b/packages/cdk-utilities/tsconfig.json new file mode 100644 index 00000000..0c602ef3 --- /dev/null +++ b/packages/cdk-utilities/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "strictPropertyInitialization": false, + "resolveJsonModule": true, + "skipLibCheck": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/cdk-utilities/tsconfig.lint.json b/packages/cdk-utilities/tsconfig.lint.json new file mode 100644 index 00000000..1386dd51 --- /dev/null +++ b/packages/cdk-utilities/tsconfig.lint.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.lint.json", + "compilerOptions": { "baseUrl": "." }, + "include": ["**/*.ts"] +} diff --git a/packages/utilities/tsconfig.jest.json b/packages/cdk-utilities/tsconfig.spec.json similarity index 57% rename from packages/utilities/tsconfig.jest.json rename to packages/cdk-utilities/tsconfig.spec.json index d40fa1e2..cd684dcb 100644 --- a/packages/utilities/tsconfig.jest.json +++ b/packages/cdk-utilities/tsconfig.spec.json @@ -1,7 +1,7 @@ { - "extends": "../../tsconfig.jest.json", + "extends": "../../tsconfig.spec.json", "compilerOptions": { - "baseUrl": "./" + "baseUrl": "." }, "include": ["src/**/*.spec.ts", "test/**/*.ts"] } diff --git a/packages/cdk-utilities/vitest.config.js b/packages/cdk-utilities/vitest.config.js new file mode 100644 index 00000000..ec160f83 --- /dev/null +++ b/packages/cdk-utilities/vitest.config.js @@ -0,0 +1,3 @@ +import CONFIG from '../../vitest.config.js' + +export default CONFIG diff --git a/packages/eslint-config-recommended/.lintstagedrc.yml b/packages/eslint-config-recommended/.lintstagedrc.yml deleted file mode 100644 index 4ad7472b..00000000 --- a/packages/eslint-config-recommended/.lintstagedrc.yml +++ /dev/null @@ -1,5 +0,0 @@ -'{src,test}/**/*.(t|j)s': - - npm run lint:staged - -'./package.json': - - sort-package-json diff --git a/packages/eslint-config-recommended/README.md b/packages/eslint-config-recommended/README.md index 3ebd5e4d..7289d1ae 100644 --- a/packages/eslint-config-recommended/README.md +++ b/packages/eslint-config-recommended/README.md @@ -15,7 +15,7 @@ the module only exports a single function `defineScTsConfig` which can be used t it is basically a wrapper around the new eslint `defineConfig` function but already includes the setup for typescript, some rules with default configurations and will ensure the prettier rules (disabling formatting rules) are included at last. -sample `eslint.config.mjs`: +sample `eslint.config.js`: ```js import { defineScTsConfig } from '@shiftcode/eslint-config-recommended' diff --git a/packages/eslint-plugin-rules/eslint.config.mjs b/packages/eslint-config-recommended/eslint.config.js similarity index 100% rename from packages/eslint-plugin-rules/eslint.config.mjs rename to packages/eslint-config-recommended/eslint.config.js diff --git a/packages/eslint-config-recommended/lint-staged.config.js b/packages/eslint-config-recommended/lint-staged.config.js new file mode 100644 index 00000000..165242df --- /dev/null +++ b/packages/eslint-config-recommended/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['eslint --fix --cache', 'npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/packages/eslint-config-recommended/package.json b/packages/eslint-config-recommended/package.json index bc5e68ed..72503241 100644 --- a/packages/eslint-config-recommended/package.json +++ b/packages/eslint-config-recommended/package.json @@ -1,9 +1,9 @@ { "name": "@shiftcode/eslint-config-recommended", - "version": "6.1.0", + "version": "7.0.0-pr254.7", "description": "default shiftcode config for eslint", "repository": "https://github.com/shiftcode/sc-commons-public", - "license": "UNLICENSED", + "license": "MIT", "author": "shiftcode GmbH ", "sideEffects": false, "type": "module", @@ -18,23 +18,17 @@ } }, "scripts": { - "prebuild": "rm -rf ./dist", - "build": "tsc", - "build:lint:ci": "npm run build", - "format": "npm run format:base -- --write", - "format:base": "prettier --config ../../.prettierrc.yml '{src,e2e,test}/**/*.ts'", - "format:ci": "npm run format:base -- --check", - "format:staged": "prettier --write --config ../../.prettierrc.yml", - "lint": "eslint --fix --cache ./src", - "lint:ci": "eslint ./src", - "lint:staged": "eslint --fix --cache", + "build": "rm -rf ./dist && tsc", + "format": "prettier --write .", + "lint": "eslint --fix --cache .", + "lint:ci": "eslint .", "prepublish": "node ../publish-helper/dist/prepare-dist.js", - "test": "echo 'Error: no test specificed'", - "test:ci": "npm run test" + "test": "echo 'no test'", + "test:ci": "echo 'No tests'" }, "dependencies": { "@eslint/js": "^9.37.0", - "@shiftcode/eslint-plugin-rules": "^5.0.1", + "@shiftcode/eslint-plugin-rules": "^6.0.0-pr254.7", "eslint": "^9.37.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", @@ -54,7 +48,7 @@ } }, "engines": { - "node": "^20.0.0 || ^22.0.0" + "node": ">=22.10.2" }, "publishConfig": { "directory": "dist" diff --git a/packages/eslint-config-recommended/src/index.ts b/packages/eslint-config-recommended/src/index.ts index 833af3b1..8d6018b3 100644 --- a/packages/eslint-config-recommended/src/index.ts +++ b/packages/eslint-config-recommended/src/index.ts @@ -7,6 +7,15 @@ import eslintPluginSimpleImportSort from 'eslint-plugin-simple-import-sort' import eslintPluginUnusedImports from 'eslint-plugin-unused-imports' import eslintTs from 'typescript-eslint' +export const DEFAULT_IGNORES: readonly string[] = [ + 'node_modules/**', + 'dist/**', + 'out-tsc/**', + '.angular/**', + 'cdk.out/**', + 'cypress/reports/**', +] + /** * define the shiftcode eslint config for typescript. * the function wraps given configs with some common settings and adds prettier rules at the end. @@ -33,6 +42,10 @@ import eslintTs from 'typescript-eslint' */ export function defineScTsConfig(...configs: Parameters): ReturnType { return defineConfig( + { + ignores: [...DEFAULT_IGNORES], + }, + { files: ['**/*.{ts,mts,cts,js,mjs,cjs}'], extends: [eslint.configs.recommended], @@ -235,25 +248,25 @@ export function defineScTsConfig(...configs: Parameters): R }, }, - /* - * allow some commonly used patterns for testing to pass eslint - */ + // relax the rules for files which are not part of the src/ folder and for test files + // only change file/ignore globs with care! { - files: ['**/test/**/*.ts', '**/*.spec.ts', '**/*.test.ts'], + files: [ + '**/*.{ts,mts,cts,js,mjs,cjs}', // include all ts/js files + ], + ignores: [ + 'src/**/*', // ignore all files inside src/ + '!src/**/*.{spec,test}.ts', // un-ignore test files + ], rules: { - 'no-console': 'off', - 'max-classes-per-file': 'off', + // it is ok to use dev deps and deps that are listed inside the root package.json + 'import/no-extraneous-dependencies': ['error', { packageDir: ['.', '../..'] }], + '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/no-empty-function': 'off', - }, - }, - - // for files which are not part of the src/ folder and for test files - // it is ok to use dependencies that are listed inside the root package.json (e.g. @shiftcode/eslint-config-recommended) - { - files: ['!**/src/**', '**/*.spec.ts', '**/*.test.ts'], - rules: { - 'import/no-extraneous-dependencies': ['error', { packageDir: ['.', '../..'] }], + '@typescript-eslint/ban-ts-comment': 'off', + 'max-classes-per-file': 'off', + 'no-console': 'off', }, }, diff --git a/packages/eslint-config-recommended/tsconfig.json b/packages/eslint-config-recommended/tsconfig.json index 6812fc36..be92441b 100644 --- a/packages/eslint-config-recommended/tsconfig.json +++ b/packages/eslint-config-recommended/tsconfig.json @@ -1,9 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist", - "declarationDir": "./dist", + "baseUrl": ".", "types": ["node"] }, "include": ["src/**/*.ts"] diff --git a/packages/eslint-config-recommended/tsconfig.lint.json b/packages/eslint-config-recommended/tsconfig.lint.json index f79528e0..1386dd51 100644 --- a/packages/eslint-config-recommended/tsconfig.lint.json +++ b/packages/eslint-config-recommended/tsconfig.lint.json @@ -1,12 +1,5 @@ { - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": "./", - "types": ["jest", "node"], - "paths": { - "@shiftcode/eslint-plugin-rules": ["../eslint-plugin-rules/src/index.ts"] - } - }, - "include": ["src/**/*.ts", "test/**/*.ts"], - "exclude": [] + "extends": "../../tsconfig.lint.json", + "compilerOptions": { "baseUrl": "." }, + "include": ["**/*.ts"] } diff --git a/packages/eslint-plugin-rules/.lintstagedrc.yml b/packages/eslint-plugin-rules/.lintstagedrc.yml deleted file mode 100644 index 4ad7472b..00000000 --- a/packages/eslint-plugin-rules/.lintstagedrc.yml +++ /dev/null @@ -1,5 +0,0 @@ -'{src,test}/**/*.(t|j)s': - - npm run lint:staged - -'./package.json': - - sort-package-json diff --git a/packages/logger/eslint.config.mjs b/packages/eslint-plugin-rules/eslint.config.js similarity index 100% rename from packages/logger/eslint.config.mjs rename to packages/eslint-plugin-rules/eslint.config.js diff --git a/packages/eslint-plugin-rules/jest.config.js b/packages/eslint-plugin-rules/jest.config.js deleted file mode 100644 index 7687c577..00000000 --- a/packages/eslint-plugin-rules/jest.config.js +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-env node,es2023 */ -import { pathsToModuleNameMapper } from 'ts-jest' -import tsConfig from './tsconfig.jest.json' with { type: 'json' } - -export default { - testEnvironment: 'node', - extensionsToTreatAsEsm: ['.ts'], - transform: { - '^.+\\.ts$': ['ts-jest', { tsconfig: 'tsconfig.jest.json', useESM: true }], - }, - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - ...pathsToModuleNameMapper(tsConfig.compilerOptions.paths ?? {}, { prefix: '' }), - }, -} diff --git a/packages/eslint-plugin-rules/lint-staged.config.js b/packages/eslint-plugin-rules/lint-staged.config.js new file mode 100644 index 00000000..165242df --- /dev/null +++ b/packages/eslint-plugin-rules/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['eslint --fix --cache', 'npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/packages/eslint-plugin-rules/package.json b/packages/eslint-plugin-rules/package.json index ab1d51f2..bd8f81ad 100644 --- a/packages/eslint-plugin-rules/package.json +++ b/packages/eslint-plugin-rules/package.json @@ -1,32 +1,27 @@ { "name": "@shiftcode/eslint-plugin-rules", - "version": "5.0.1", + "version": "6.0.0-pr254.7", "description": "eslint-rules for shiftcode-specific eslint rules", "repository": "https://github.com/shiftcode/sc-commons-public", - "license": "UNLICENSED", + "license": "MIT", "author": "shiftcode GmbH ", "sideEffects": false, "type": "module", "exports": { ".": { - "default": "./dist/index.js", - "types": "./dist/index.d.ts" + "types": "./dist/index.d.ts", + "default": "./dist/index.js" } }, "scripts": { - "prebuild": "rm -rf ./dist", - "build": "tsc", - "build:lint:ci": "npm run build", - "format": "npm run format:base -- --write", - "format:base": "prettier --config ../../.prettierrc.yml '{src,e2e,test}/**/*.ts'", - "format:ci": "npm run format:base -- --check", - "format:staged": "prettier --write --config ../../.prettierrc.yml", - "lint": "eslint --fix --cache ./src", - "lint:ci": "eslint ./src", - "lint:staged": "eslint --fix --cache", + "build": "rm -rf ./dist && tsc", + "format": "prettier --write .", + "lint": "eslint --fix --cache .", + "lint:ci": "eslint .", "prepublish": "node ../publish-helper/dist/prepare-dist.js", - "test": "jest", - "test:ci": "npm run test" + "test": "vitest --cache --run", + "test:ci": "vitest --no-cache --run && tsc -p ./tsconfig.spec.json", + "test:watch": "vitest --cache" }, "dependencies": { "@typescript-eslint/utils": "^8.46.0" @@ -39,7 +34,7 @@ "eslint": "^9.37.0" }, "engines": { - "node": "^20.0.0 || ^22.0.0" + "node": ">=22.10.2" }, "publishConfig": { "directory": "dist" diff --git a/packages/eslint-plugin-rules/src/rules/deny-parent-index-file-import.spec.ts b/packages/eslint-plugin-rules/src/rules/deny-parent-index-file-import.spec.ts index f08d354d..21076f38 100644 --- a/packages/eslint-plugin-rules/src/rules/deny-parent-index-file-import.spec.ts +++ b/packages/eslint-plugin-rules/src/rules/deny-parent-index-file-import.spec.ts @@ -1,4 +1,4 @@ -import { createRuleTester } from '../utils/rule-tester.js' +import { createRuleTester } from '../../test/rule-tester.js' import { DenyParentIndexFileImportMessageIds, denyParentIndexFileImportRule } from './deny-parent-index-file-import.js' const ruleTester = createRuleTester() diff --git a/packages/eslint-plugin-rules/src/rules/import-denylist.spec.ts b/packages/eslint-plugin-rules/src/rules/import-denylist.spec.ts index 93b78130..02f4ab4c 100644 --- a/packages/eslint-plugin-rules/src/rules/import-denylist.spec.ts +++ b/packages/eslint-plugin-rules/src/rules/import-denylist.spec.ts @@ -1,4 +1,4 @@ -import { createRuleTester } from '../utils/rule-tester.js' +import { createRuleTester } from '../../test/rule-tester.js' import { ImportDenylistMessageIds, importDenyListRule } from './import-denylist.js' const ruleTester = createRuleTester() diff --git a/packages/eslint-plugin-rules/src/rules/prefix-builtin-module-import.spec.ts b/packages/eslint-plugin-rules/src/rules/prefix-builtin-module-import.spec.ts index 69467b9d..4a8c7726 100644 --- a/packages/eslint-plugin-rules/src/rules/prefix-builtin-module-import.spec.ts +++ b/packages/eslint-plugin-rules/src/rules/prefix-builtin-module-import.spec.ts @@ -1,4 +1,4 @@ -import { createRuleTester } from '../utils/rule-tester.js' +import { createRuleTester } from '../../test/rule-tester.js' import { prefixBuiltinModuleImportRule, PrefixNodeModuleImportMessageIds } from './prefix-builtin-module-import.js' const ruleTester = createRuleTester() diff --git a/packages/eslint-plugin-rules/src/utils/rule-tester.ts b/packages/eslint-plugin-rules/test/rule-tester.ts similarity index 50% rename from packages/eslint-plugin-rules/src/utils/rule-tester.ts rename to packages/eslint-plugin-rules/test/rule-tester.ts index d698a118..64f9c844 100644 --- a/packages/eslint-plugin-rules/src/utils/rule-tester.ts +++ b/packages/eslint-plugin-rules/test/rule-tester.ts @@ -1,9 +1,13 @@ -import { join } from 'node:path' - import * as parser from '@typescript-eslint/parser' import { RuleTester } from '@typescript-eslint/rule-tester' +import * as vitest from 'vitest' -const tsRootDirectory = join(__dirname, '../..', 'test') +// https://typescript-eslint.io/packages/rule-tester/#vitest +// since we don't want to use vitest with globals +RuleTester.afterAll = vitest.afterAll +RuleTester.it = vitest.it +RuleTester.itOnly = vitest.it.only +RuleTester.describe = vitest.describe export function createRuleTester(): RuleTester { return new RuleTester({ @@ -11,7 +15,7 @@ export function createRuleTester(): RuleTester { parser, parserOptions: { ecmaVersion: 2023, - tsconfigRootDir: tsRootDirectory, + tsconfigRootDir: import.meta.dirname, project: './tsconfig.json', }, }, diff --git a/packages/eslint-plugin-rules/tsconfig.json b/packages/eslint-plugin-rules/tsconfig.json index 6812fc36..5490d09b 100644 --- a/packages/eslint-plugin-rules/tsconfig.json +++ b/packages/eslint-plugin-rules/tsconfig.json @@ -2,8 +2,6 @@ "extends": "../../tsconfig.json", "compilerOptions": { "baseUrl": "./", - "outDir": "./dist", - "declarationDir": "./dist", "types": ["node"] }, "include": ["src/**/*.ts"] diff --git a/packages/eslint-plugin-rules/tsconfig.lint.json b/packages/eslint-plugin-rules/tsconfig.lint.json index c653bf37..1386dd51 100644 --- a/packages/eslint-plugin-rules/tsconfig.lint.json +++ b/packages/eslint-plugin-rules/tsconfig.lint.json @@ -1,9 +1,5 @@ { - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": "./" - }, - "types": ["jest", "node"], - "include": ["src/**/*.ts", "test/**/*.ts"], - "exclude": [] + "extends": "../../tsconfig.lint.json", + "compilerOptions": { "baseUrl": "." }, + "include": ["**/*.ts"] } diff --git a/packages/eslint-plugin-rules/tsconfig.spec.json b/packages/eslint-plugin-rules/tsconfig.spec.json new file mode 100644 index 00000000..cd684dcb --- /dev/null +++ b/packages/eslint-plugin-rules/tsconfig.spec.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.spec.json", + "compilerOptions": { + "baseUrl": "." + }, + "include": ["src/**/*.spec.ts", "test/**/*.ts"] +} diff --git a/packages/eslint-plugin-rules/vitest.config.js b/packages/eslint-plugin-rules/vitest.config.js new file mode 100644 index 00000000..03c371e0 --- /dev/null +++ b/packages/eslint-plugin-rules/vitest.config.js @@ -0,0 +1,11 @@ +import { defineConfig } from 'vitest/config' + +import CONFIG from '../../vitest.config.js' + +export default defineConfig({ + test: { + ...CONFIG.test, + testTimeout: 10_000, + teardownTimeout: 10_000, + }, +}) diff --git a/packages/iac-utilities/CHANGELOG.md b/packages/iac-utilities/CHANGELOG.md new file mode 100644 index 00000000..2f201caa --- /dev/null +++ b/packages/iac-utilities/CHANGELOG.md @@ -0,0 +1,439 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [10.4.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@10.4.0...@shiftcode/iac-helper@10.4.1) (2026-01-14) + +**Note:** Version bump only for package @shiftcode/iac-helper + +# [10.4.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@10.3.1...@shiftcode/iac-helper@10.4.0) (2025-09-23) + +### Features + +- **stage-info:** new script to just print the stage-info to stdout ([f100ae9](https://github.com/shiftcode/sc-commons/commit/f100ae9b1454c76399b4aba79e5e075f15048461)) + +## [10.3.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@10.3.0...@shiftcode/iac-helper@10.3.1) (2025-09-22) + +### Bug Fixes + +- **aws-env-vars:** remove empty spaces after last export statement ([716d6ab](https://github.com/shiftcode/sc-commons/commit/716d6abf30bc86d92df470342e7330d85d0d55c6)) +- **deps:** change to 5.0.2 branch-utilities as 5.0.0 is unpublished ([ce4d83d](https://github.com/shiftcode/sc-commons/commit/ce4d83d015592b7726f9e66cf29bf132eb62cbe7)) + +# [10.3.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@10.2.0...@shiftcode/iac-helper@10.3.0) (2025-09-09) + +### Features + +- add --no-write option to fetch-client-config script ([b816e73](https://github.com/shiftcode/sc-commons/commit/b816e736ba98d201794c156299dacd80c1b37845)) + +# [10.2.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@10.1.0...@shiftcode/iac-helper@10.2.0) (2025-09-04) + +### Features + +- **iac-helper:** support latest `@shiftcode/branch-utilities` ([9737261](https://github.com/shiftcode/sc-commons/commit/973726160756369f8c7c5a0bd56de82ee12484aa)) + +# [10.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@10.0.0...@shiftcode/iac-helper@10.1.0) (2025-08-13) + +### Bug Fixes + +- **stage-override-to-pr-base:** type GitHub PRs for better type safety ([61b5375](https://github.com/shiftcode/sc-commons/commit/61b53752be5dc327f801cf5fab541feea4f12f10)) + +### Features + +- **iac-helper:** add aws-env-vars script ([75b458f](https://github.com/shiftcode/sc-commons/commit/75b458f62147c9fb7773a1acd054ac91eee42950)) +- **iac-helper:** add stage-override-to-pr-base script ([70e5aee](https://github.com/shiftcode/sc-commons/commit/70e5aeea1fd7f119e038849b4d793b806d7d5983)) +- **stage-override-to-pr-base:** remove branchNameOverride argument ([a5ff251](https://github.com/shiftcode/sc-commons/commit/a5ff251cb841e9cd6f627fb6b8ac642a2e701230)) + +# [10.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@9.0.2...@shiftcode/iac-helper@10.0.0) (2025-06-02) + +### Build System + +- **iac-helper:** upgrade branch-utilities and publish-helper to version 4.0.0 ([4549d59](https://github.com/shiftcode/sc-commons/commit/4549d596b55921c3e8ed5d3c77e214d897611475)) + +### BREAKING CHANGES + +- **iac-helper:** requires @shiftcode/branch-utilities version 4.0.0 + +## [9.0.2](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@9.0.1...@shiftcode/iac-helper@9.0.2) (2025-05-19) + +**Note:** Version bump only for package @shiftcode/iac-helper + +## [9.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@9.0.0...@shiftcode/iac-helper@9.0.1) (2025-05-15) + +**Note:** Version bump only for package @shiftcode/iac-helper + +# [9.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@8.0.1...@shiftcode/iac-helper@9.0.0) (2025-05-01) + +### Code Refactoring + +- **iac-helper:** deprecate @shiftcode/commons-config package ([a83b00b](https://github.com/shiftcode/sc-commons/commit/a83b00b88d9c55671aaec7925c9528fab4485cb7)) + +### BREAKING CHANGES + +- **iac-helper:** the package @shiftcode/commons-config is no longer available + +## [8.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@8.0.0...@shiftcode/iac-helper@8.0.1) (2025-03-06) + +### Bug Fixes + +- update engines definition (left over from node 22 upgrade) ([f5428ae](https://github.com/shiftcode/sc-commons/commit/f5428ae64c45567912887b8bab1e881c4312669f)) + +# [8.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@7.1.1...@shiftcode/iac-helper@8.0.0) (2025-03-04) + +### Build System + +- **deps:** upgrade to node22 ([f9c5712](https://github.com/shiftcode/sc-commons/commit/f9c57121ad78b6bc84cbc70071c595804b5fb08b)) + +### BREAKING CHANGES + +- **deps:** requires node 22 + +## [7.1.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@7.1.0...@shiftcode/iac-helper@7.1.1) (2024-08-02) + +**Note:** Version bump only for package @shiftcode/iac-helper + +# [7.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@7.0.3...@shiftcode/iac-helper@7.1.0) (2024-07-31) + +### Features + +- **iac-helper:** allow more aws sso profile types in schema ([885cdf0](https://github.com/shiftcode/sc-commons/commit/885cdf0205b3d1364b5d832024247ba6df954355)) + +## [7.0.3](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@7.0.2...@shiftcode/iac-helper@7.0.3) (2024-07-31) + +**Note:** Version bump only for package @shiftcode/iac-helper + +## [7.0.2](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@7.0.1...@shiftcode/iac-helper@7.0.2) (2024-07-30) + +**Note:** Version bump only for package @shiftcode/iac-helper + +## [7.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@7.0.0...@shiftcode/iac-helper@7.0.1) (2024-07-29) + +**Note:** Version bump only for package @shiftcode/iac-helper + +# [7.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@6.3.0...@shiftcode/iac-helper@7.0.0) (2024-07-13) + +### Build System + +- **node:** upgrade to node 20 ([2899d0d](https://github.com/shiftcode/sc-commons/commit/2899d0d41ece080b276e7bf84915d4849da81a29)) + +### BREAKING CHANGES + +- **node:** Minimum required node version is 20.11.1. In general speaking the runtime (Node or Browser) must support all es2023 features. + +# [6.3.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@6.2.1...@shiftcode/iac-helper@6.3.0) (2024-01-25) + +### Features + +- **iac-helper:** add support for prodKeyword (master | main) ([72849f5](https://github.com/shiftcode/sc-commons/commit/72849f591b9b877613ef21e9c68e23d1ee756147)) + +## [6.2.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@6.2.0...@shiftcode/iac-helper@6.2.1) (2024-01-25) + +**Note:** Version bump only for package @shiftcode/iac-helper + +# [6.2.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@6.1.4...@shiftcode/iac-helper@6.2.0) (2023-11-15) + +### Features + +- **iac-helper:** add helper script (bin) to configure aws sso ([3420d18](https://github.com/shiftcode/sc-commons/commit/3420d1841c07c123e241504cd8463dbd506861a2)) +- **iac-helper:** update schema ([cd4d586](https://github.com/shiftcode/sc-commons/commit/cd4d586b546ae9bdbcd1bb44fd34f225db97afe8)) +- **iac-helper:** update sso configure script ([6e14615](https://github.com/shiftcode/sc-commons/commit/6e1461586446f82af24966b7cb2fc0601c3af79e)) + +## [6.1.4](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@6.1.3...@shiftcode/iac-helper@6.1.4) (2023-10-26) + +### Bug Fixes + +- **iac-helper:** fixed invalidated-cf-cache function when used with multiple paths ([a01c5d1](https://github.com/shiftcode/sc-commons/commit/a01c5d13eb1ee85c8016cc121c70de847cbc511a)) + +## [6.1.3](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@6.1.2...@shiftcode/iac-helper@6.1.3) (2023-10-18) + +**Note:** Version bump only for package @shiftcode/iac-helper + +## [6.1.2](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@6.1.1...@shiftcode/iac-helper@6.1.2) (2023-07-27) + +**Note:** Version bump only for package @shiftcode/iac-helper + +## [6.1.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@6.1.0...@shiftcode/iac-helper@6.1.1) (2023-06-01) + +**Note:** Version bump only for package @shiftcode/iac-helper + +# [6.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@6.0.1...@shiftcode/iac-helper@6.1.0) (2023-06-01) + +### Features + +- **eslint-config:** add eslint-disable comments ([3716577](https://github.com/shiftcode/sc-commons/commit/37165771b8ac0e94bdcc7f90b55e41d358db9d65)) + +## [6.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@6.0.0...@shiftcode/iac-helper@6.0.1) (2023-05-26) + +**Note:** Version bump only for package @shiftcode/iac-helper + +# [6.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@5.1.0...@shiftcode/iac-helper@6.0.0) (2023-05-15) + +### Code Refactoring + +- **iac-helper:** remove depreacted functionality ([9def5a5](https://github.com/shiftcode/sc-commons/commit/9def5a5d53a0275ad0bc8a198de8cf0dee403aab)) +- **iac-helper:** remove depreacted functionality ([5b6802c](https://github.com/shiftcode/sc-commons/commit/5b6802c43c7c141dec8c5ab7221eace388e84b64)) + +### Features + +- **iac-helper:** migrate to ESM ([79046e7](https://github.com/shiftcode/sc-commons/commit/79046e7c459d57e2b801e441f468b50c1c6bb8d1)) +- **iac-helper:** migrate to ESM (different related changes) ([9ac4f82](https://github.com/shiftcode/sc-commons/commit/9ac4f82991e30d0804a1417b91c3a5eab1f39600)) + +### BREAKING CHANGES + +- **iac-helper:** deprecated functionality (runtimeConfig & getRuntimeConfigForEnv) was removed, use stageInfo & region directly +- **iac-helper:** deprecated feature (publishClientToS3) was removed, use uploadToS3 instead +- **iac-helper:** only supported in projects using ESM +- **iac-helper:** only supported in projects using ESM + +# [5.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@5.0.0...@shiftcode/iac-helper@5.1.0) (2023-03-17) + +### Features + +- **eslint-plugin:** introduce tests to verify correct implementation of plugins ([76d5b2f](https://github.com/shiftcode/sc-commons/commit/76d5b2f2bea5a3f4450e7ce43153fc2ddba832c1)) + +# [5.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@4.3.0...@shiftcode/iac-helper@5.0.0) (2023-03-16) + +### Build System + +- **tsconfig:** build for es2022 target ([c75651b](https://github.com/shiftcode/sc-commons/commit/c75651b2b2ca6338e71b6538616d5b0e9bbb40cc)) + +### Code Refactoring + +- **get-account-id:** removed ([3af4bf1](https://github.com/shiftcode/sc-commons/commit/3af4bf1daea8b06b1b2f02b4b07f82c39d178853)) +- **iac-helper:** buildTimeBaseRuntimeConfigProvider ([2b13680](https://github.com/shiftcode/sc-commons/commit/2b1368023ed1bb2f0b8d0a13254600c5482a472b)) +- **iac-helper:** update [@aws-sdk](https://github.com/aws-sdk) libs ([e2dce72](https://github.com/shiftcode/sc-commons/commit/e2dce72fd3d1096f6a6f4be2e19e6aebea673ebb)) +- **iac-stack-config-service:** removed getEnvFromDeployedFunction as it does not belong here ([efd59eb](https://github.com/shiftcode/sc-commons/commit/efd59eb19cabc8e2701b29dcd6808f7a9434ca94)) +- **iac-stack-config.service:** removed old stuff ([0d124cc](https://github.com/shiftcode/sc-commons/commit/0d124cc93acfa8a5a8f1722fe87a70ea918acdcb)) +- **runtime-config-module:** removed ([18a8eab](https://github.com/shiftcode/sc-commons/commit/18a8eabc4a7d2e7d1cee715d2e010327ad11df04)) + +### BREAKING CHANGES + +- **iac-stack-config.service:** IacStackConfigService constructor changed and it no longer provides `sharedData`, `getSharedDataForEnv` and `getSharedDataFromEnv` +- **runtime-config-module:** runtimeConfigModule (inversify) was removed +- **tsconfig:** requires ES2022 support (node@18) +- **iac-helper:** previously used `aws-sdk/global` config provider supported env and dot files. now reading the 'AWS_REGION' env var only which means it would no longer work with other sorts of aws config than via ENV +- **iac-helper:** iac-helper requires @aws-sdk libs ^3.204.0 +- **iac-stack-config-service:** removed getEnvFromDeployedFunction() method from IacStackConfigService + no replacement yet - if actually needed, move it from fadas to sc-commons/iac-helper as plain function (with optional dep) +- **get-account-id:** removed getAccountId() function + instead use `process.env.CDK_DEFAULT_ACCOUNT` if you actually need the account id (which you probably don't) + +# [4.3.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@4.2.0...@shiftcode/iac-helper@4.3.0) (2022-10-11) + +### Features + +- **stage-info:** new script to export stage info ([edf4b83](https://github.com/shiftcode/sc-commons/commit/edf4b836cd88fc496da10dd248a23da4a917e83a)) + +# [4.2.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@4.1.0...@shiftcode/iac-helper@4.2.0) (2022-04-26) + +### Features + +- **scripts/fetch-client-config:** new `key` option used to read from the outputs ([cd12f7f](https://github.com/shiftcode/sc-commons/commit/cd12f7fb6b1ec30063a0dcfd89a9eca0326af336)) +- **scripts/invalidate-cf-cache:** new `key` option used to read from the outputs ([3e58146](https://github.com/shiftcode/sc-commons/commit/3e581466317177abf240d78c53b22b05d0465b3a)) +- **scripts/publish-client-to-s3:** add option to skip the `pruning` of the bucket ([d63a853](https://github.com/shiftcode/sc-commons/commit/d63a853e3c842d334a2381e133250015e38fef72)) +- **scripts/publish-client-to-s3:** new `key` option used to read from the outputs ([c80604e](https://github.com/shiftcode/sc-commons/commit/c80604e95467b75a04f03776c83b495584dabb7a)) + +# [4.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@4.0.1...@shiftcode/iac-helper@4.1.0) (2022-03-31) + +### Features + +- **credentials-helper:** add sso credentials-helper script to use with old sdk v2 tools ([8d0198d](https://github.com/shiftcode/sc-commons/commit/8d0198d6d524de57289f3b90e5af5e7c0e520d0f)) + +## [4.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/iac-helper@4.0.0...@shiftcode/iac-helper@4.0.1) (2022-01-17) + +### Bug Fixes + +- **dependency:** require lambda-utils@7 ([cd204a1](https://github.com/shiftcode/sc-commons/commit/cd204a1bd3aa51d9125c8fe0a6a4799bea5e2680)) + +## 4.0.0 (2022-01-11) + +- build(release): next version [skip ci] ([7fb99e3](https://github.com/shiftcode/sc-commons/commit/7fb99e3)) +- build(release): next version [skip ci] ([69f8e36](https://github.com/shiftcode/sc-commons/commit/69f8e36)) +- build(release): next version [skip ci] ([6658958](https://github.com/shiftcode/sc-commons/commit/6658958)) +- build(release): next version [skip_build] ([911da02](https://github.com/shiftcode/sc-commons/commit/911da02)) +- build(release): next version [skip_build] ([199066e](https://github.com/shiftcode/sc-commons/commit/199066e)) +- build(release): next version [skip_build] ([0c839e4](https://github.com/shiftcode/sc-commons/commit/0c839e4)) +- build(release): next version [skip_build] ([2722982](https://github.com/shiftcode/sc-commons/commit/2722982)) +- build(release): next version [skip_build] ([a0e996a](https://github.com/shiftcode/sc-commons/commit/a0e996a)) +- build(release): next version [skip_build] ([8d72402](https://github.com/shiftcode/sc-commons/commit/8d72402)) +- build(release): next version [skip_build] ([7bca45d](https://github.com/shiftcode/sc-commons/commit/7bca45d)) +- build(release): next version [skip_build] ([82c65ba](https://github.com/shiftcode/sc-commons/commit/82c65ba)) +- build(release): next version [skip_build] ([8589cd3](https://github.com/shiftcode/sc-commons/commit/8589cd3)) +- build(release): next version [skip_build] ([aaebf67](https://github.com/shiftcode/sc-commons/commit/aaebf67)) +- build(release): next version [skip_build] ([e38c9a6](https://github.com/shiftcode/sc-commons/commit/e38c9a6)) +- build(release): next version [skip_build] ([9470e94](https://github.com/shiftcode/sc-commons/commit/9470e94)) +- build(release): next version [skip_build] ([7a83884](https://github.com/shiftcode/sc-commons/commit/7a83884)) +- build(release): next version [skip_build] ([0ca65a3](https://github.com/shiftcode/sc-commons/commit/0ca65a3)) +- build(release): next version [skip_build] ([b9614a4](https://github.com/shiftcode/sc-commons/commit/b9614a4)) +- build(release): next version [skip_build] ([1483216](https://github.com/shiftcode/sc-commons/commit/1483216)) +- build(release): next version [skip_build] ([5e2b455](https://github.com/shiftcode/sc-commons/commit/5e2b455)) +- build(release): next version [skip_build] ([7470c7d](https://github.com/shiftcode/sc-commons/commit/7470c7d)) +- build(release): next version [skip_build] ([bf316bd](https://github.com/shiftcode/sc-commons/commit/bf316bd)) +- build(release): next version [skip_workflow] ([04eb9bc](https://github.com/shiftcode/sc-commons/commit/04eb9bc)) +- build(tsconfig.spex): fix paths ([cde6281](https://github.com/shiftcode/sc-commons/commit/cde6281)) +- test(handler-to-bundle-info.function): fix typo in spec ([61270ec](https://github.com/shiftcode/sc-commons/commit/61270ec)) +- chore(aws-sdk): use same version in all packages ([08ac152](https://github.com/shiftcode/sc-commons/commit/08ac152)) +- chore(barrel-file): create own barrel file for base dir ([6a87c83](https://github.com/shiftcode/sc-commons/commit/6a87c83)) +- chore(deps): update ([ef20963](https://github.com/shiftcode/sc-commons/commit/ef20963)) +- chore(peer-deps): remove pr version ([ef34bce](https://github.com/shiftcode/sc-commons/commit/ef34bce)) +- ci(prepare-dist): use from new sc-commons-public package ([5ad1e4e](https://github.com/shiftcode/sc-commons/commit/5ad1e4e)) +- refactor(get-lambda-props): removed ([e02b161](https://github.com/shiftcode/sc-commons/commit/e02b161)) +- refactor(peer-dependencies): use branch-utilities lib from sc-commons-public ([a35b7af](https://github.com/shiftcode/sc-commons/commit/a35b7af)) +- refactor(stack-with-shared-data): removed ([bfb9860](https://github.com/shiftcode/sc-commons/commit/bfb9860)) +- refactor(webpack-build-helper): removed since outdated ([2f3012f](https://github.com/shiftcode/sc-commons/commit/2f3012f)) +- fix(dependencies): cleanup ([9119e8f](https://github.com/shiftcode/sc-commons/commit/9119e8f)) +- fix(deps): move runtime dev-dependencies ([aa73004](https://github.com/shiftcode/sc-commons/commit/aa73004)) +- fix(deps): remove Nullable helper ([d470494](https://github.com/shiftcode/sc-commons/commit/d470494)) +- fix(extend-with-iac-utils): make props accessible in extending class ([cfe1ff2](https://github.com/shiftcode/sc-commons/commit/cfe1ff2)) +- fix(extend-with-iac-utils): typo ([65c8862](https://github.com/shiftcode/sc-commons/commit/65c8862)) +- fix(iac-utils): resolve test issue ([ac77f2a](https://github.com/shiftcode/sc-commons/commit/ac77f2a)) +- fix(peer-dependencies): correct version ([99aa21e](https://github.com/shiftcode/sc-commons/commit/99aa21e)) +- fix(peer-dependencies): update versions ([9aac1ed](https://github.com/shiftcode/sc-commons/commit/9aac1ed)) +- fix(scripts): accept promise options ([39bdb70](https://github.com/shiftcode/sc-commons/commit/39bdb70)) +- fix(typings): prepare for ts 4.5 ([5025471](https://github.com/shiftcode/sc-commons/commit/5025471)) +- feat(deps): update inversify to v6 and mime to v3 ([b1912f2](https://github.com/shiftcode/sc-commons/commit/b1912f2)) +- feat(extend-with-iac-utils): functions to dynamically extend base class ([e95f053](https://github.com/shiftcode/sc-commons/commit/e95f053)) +- feat(handler-to-bundle-info): allow additional arg for destDir ([afa64dc](https://github.com/shiftcode/sc-commons/commit/afa64dc)) +- feat(iac-stack-config-service): support stage-switchable properties ([014bc1e](https://github.com/shiftcode/sc-commons/commit/014bc1e)) +- style(prettier): prettify ([4887470](https://github.com/shiftcode/sc-commons/commit/4887470)) + +### BREAKING CHANGE + +- getLambdaProps was removed since not recommended to use +- NestedStackWithSharedData/StackWithSharedData was removed + use extendWithIacUtils(Stack) instead (see spec for example) +- Nullable helper type was removed. use from @shiftcode/utils instead +- requires inversify@^6.0.1 +- webpack-build-helper was removed since outdated + +## 3.0.0 (2021-12-23) + +- build(release): next version [skip ci] ([d3b33ba](https://github.com/shiftcode/sc-commons/commit/d3b33ba)) +- build(release): next version [skip ci] ([87c30b4](https://github.com/shiftcode/sc-commons/commit/87c30b4)) +- build(release): next version [skip ci] ([16d5995](https://github.com/shiftcode/sc-commons/commit/16d5995)) +- build(release): next version [skip ci] ([d7b6d61](https://github.com/shiftcode/sc-commons/commit/d7b6d61)) +- build(release): next version [skip ci] ([76a41a6](https://github.com/shiftcode/sc-commons/commit/76a41a6)) +- build(release): next version [skip ci] ([44d8085](https://github.com/shiftcode/sc-commons/commit/44d8085)) +- build(release): next version [skip ci] ([4a2a73d](https://github.com/shiftcode/sc-commons/commit/4a2a73d)) +- build(release): next version [skip ci] ([ac3ac7f](https://github.com/shiftcode/sc-commons/commit/ac3ac7f)) +- build(release): next version [skip ci] ([14622a2](https://github.com/shiftcode/sc-commons/commit/14622a2)) +- build(release): next version [skip ci] ([3199b0c](https://github.com/shiftcode/sc-commons/commit/3199b0c)) +- build(release): next version [skip ci] ([652b10b](https://github.com/shiftcode/sc-commons/commit/652b10b)) +- build(release): next version [skip ci] ([78e4b60](https://github.com/shiftcode/sc-commons/commit/78e4b60)) +- build(release): next version [skip ci] ([006c0be](https://github.com/shiftcode/sc-commons/commit/006c0be)) +- build(release): next version [skip ci] ([6285743](https://github.com/shiftcode/sc-commons/commit/6285743)) +- build(release): next version [skip ci] ([2e01006](https://github.com/shiftcode/sc-commons/commit/2e01006)) +- build(release): next version [skip ci] ([f66b3c3](https://github.com/shiftcode/sc-commons/commit/f66b3c3)) +- build(release): next version [skip ci] ([69cc0f4](https://github.com/shiftcode/sc-commons/commit/69cc0f4)) +- build(release): next version [skip ci] ([921f9f0](https://github.com/shiftcode/sc-commons/commit/921f9f0)) +- build(release): next version [skip ci] ([25993ec](https://github.com/shiftcode/sc-commons/commit/25993ec)) +- build(release): next version [skip ci] ([1fed9a1](https://github.com/shiftcode/sc-commons/commit/1fed9a1)) +- build(release): next version [skip ci] ([cd44cac](https://github.com/shiftcode/sc-commons/commit/cd44cac)) +- build(typescript): remove separate ts version ([657c447](https://github.com/shiftcode/sc-commons/commit/657c447)) +- refactor(\*): replace npm run with yarn ([238adbc](https://github.com/shiftcode/sc-commons/commit/238adbc)) +- refactor(\*): replace yarn run with yarn ([ef0d2f7](https://github.com/shiftcode/sc-commons/commit/ef0d2f7)) +- refactor(\*): unify READMEs title ([b779764](https://github.com/shiftcode/sc-commons/commit/b779764)) +- refactor(bin-scripts): export main functions to use from code ([6799993](https://github.com/shiftcode/sc-commons/commit/6799993)) +- refactor(iac-helper): use branch-utils package ([c20c084](https://github.com/shiftcode/sc-commons/commit/c20c084)) +- revert(version): back to pr ([daf8058](https://github.com/shiftcode/sc-commons/commit/daf8058)) +- fix(deps): update just-snake-case to v3 ([14cfd22](https://github.com/shiftcode/sc-commons/commit/14cfd22)) +- fix(export-base-runtime-config): add she-bang ([697a805](https://github.com/shiftcode/sc-commons/commit/697a805)) +- fix(export-cfn-outputs): add script ([3c85f72](https://github.com/shiftcode/sc-commons/commit/3c85f72)) +- fix(package.json): @shiftcode versions ([c9b0c7d](https://github.com/shiftcode/sc-commons/commit/c9b0c7d)) +- fix(package.json): author ([67db3f3](https://github.com/shiftcode/sc-commons/commit/67db3f3)) +- fix(package.json): correctly set sideEffects property ([11e30b5](https://github.com/shiftcode/sc-commons/commit/11e30b5)) +- fix(peer-dependencies): depend on pr93 versions ([b36c70b](https://github.com/shiftcode/sc-commons/commit/b36c70b)) +- fix(publish-client-to-s3): cli options ([613e067](https://github.com/shiftcode/sc-commons/commit/613e067)) +- fix(scripts): move to root ([b9e619e](https://github.com/shiftcode/sc-commons/commit/b9e619e)) +- feat(fetch-client-config): add script ([7d7eea0](https://github.com/shiftcode/sc-commons/commit/7d7eea0)) +- feat(invalidate-cf-cache): add script ([a2bc06c](https://github.com/shiftcode/sc-commons/commit/a2bc06c)) +- feat(publish-client-to-s3): actually validate definitions ([d12f12e](https://github.com/shiftcode/sc-commons/commit/d12f12e)) +- feat(publish-client-to-s3): add script to upload client ([b143b11](https://github.com/shiftcode/sc-commons/commit/b143b11)) +- feat(scripts): enhance export-base-runtime-config ([0d40bff](https://github.com/shiftcode/sc-commons/commit/0d40bff)) +- feat(typescript): use typescript 4.4 and require tslib ^2.3 ([3524ecd](https://github.com/shiftcode/sc-commons/commit/3524ecd)) +- style(prettier): update to 2.5 and prettify ([47be5f1](https://github.com/shiftcode/sc-commons/commit/47be5f1)) +- test(jest): update rename tsconfig.spec and update jest ([30a28ff](https://github.com/shiftcode/sc-commons/commit/30a28ff)) +- chore(prepublish): fix script call ([56e67b1](https://github.com/shiftcode/sc-commons/commit/56e67b1)) + +### BREAKING CHANGE + +- requires peer dependency @shiftcode/branch-utils +- requires tslib ^2.3 + +## 2.1.3 (2021-11-09) + +**Note:** Version bump only for package @shiftcode/iac-helper + +## 2.1.2 (2021-11-08) + +**Note:** Version bump only for package @shiftcode/iac-helper + +## 2.1.1 (2021-09-03) + +**Note:** Version bump only for package @shiftcode/iac-helper + +## 2.1.0 (2021-09-03) + +- feat(iac-helper): add export-base-runtime-config executable ([4cc5f28](https://github.com/shiftcode/sc-commons/commit/4cc5f28)) +- refactor(build-helper): flatten publish artifact ([0225ada](https://github.com/shiftcode/sc-commons/commit/0225ada)) + +## 2.0.2 (2021-03-31) + +**Note:** Version bump only for package @shiftcode/iac-helper + +## 2.0.1 (2021-01-22) + +- chore(package.json): use \* version for dev-deps to peer packages ([a13d261](https://github.com/shiftcode/sc-commons/commit/a13d261)) + +## 2.0.0 (2020-10-06) + +- refactor(build-helper): remove dist/\_cjs/publish-lib file ([ecf2451](https://github.com/shiftcode/sc-commons/commit/ecf2451)) +- refactor(iac-helper): flatten iac-stack-config constructor args ([fec659e](https://github.com/shiftcode/sc-commons/commit/fec659e)) +- refactor(iac-helper): optional dependencies and deep exports ([0d38774](https://github.com/shiftcode/sc-commons/commit/0d38774)) +- refactor(prod-switchable): export type to be reused ([a432d56](https://github.com/shiftcode/sc-commons/commit/a432d56)) +- Merge branch 'master' into #77-reusable-utils ([baa4f26](https://github.com/shiftcode/sc-commons/commit/baa4f26)), closes [#77](https://github.com/shiftcode/sc-commons/issues/77) +- feat(iac-helper): getProdDependantProp fun with sophisticated typings ([aa5f6b6](https://github.com/shiftcode/sc-commons/commit/aa5f6b6)) +- feat(iac-helper): nested-stack-with-shared-data ([bdffbbd](https://github.com/shiftcode/sc-commons/commit/bdffbbd)) +- feat(iac-helper): StackWithSharedData common cf outputs ([c2bae99](https://github.com/shiftcode/sc-commons/commit/c2bae99)) +- chore(lint-staged): update all configuration files ([ac86637](https://github.com/shiftcode/sc-commons/commit/ac86637)) +- fix(iac-helper): allow custom root dir for lambda functions ([d1e9b07](https://github.com/shiftcode/sc-commons/commit/d1e9b07)) +- fix(iac-helper): allow custom root dir for lambda functions ([97f58be](https://github.com/shiftcode/sc-commons/commit/97f58be)) +- fix(iac-helper): cfn output colon instead of dot ([05f882e](https://github.com/shiftcode/sc-commons/commit/05f882e)) +- fix(iac-helper): change build and publish scripts ([f5ee994](https://github.com/shiftcode/sc-commons/commit/f5ee994)) +- fix(iac-helper): package versions in opt deps ([0a7965d](https://github.com/shiftcode/sc-commons/commit/0a7965d)) +- fix(iac-helper): publish config ([40692e1](https://github.com/shiftcode/sc-commons/commit/40692e1)) +- fix(iac-helper): stack-with-shared-data output ([2e78a3a](https://github.com/shiftcode/sc-commons/commit/2e78a3a)) +- fix(iac-helper): stack-with-shared-data output ([953ca05](https://github.com/shiftcode/sc-commons/commit/953ca05)) +- fix(iac-helper): stackWithSharedData import ([9a4d5cd](https://github.com/shiftcode/sc-commons/commit/9a4d5cd)) +- fix(iac-helper): tslint:disable:no-unused-expression ([22988a4](https://github.com/shiftcode/sc-commons/commit/22988a4)) +- fix(iac-helper): user build-helper pre-publish-lib ([12cde06](https://github.com/shiftcode/sc-commons/commit/12cde06)) + +### BREAKING CHANGE + +- - to make sure optional dependencies are actually optional, deep exports are necessary. + +* DefaultLambda no longer exists. Instead a helper function getLambdaProps was added + +## 1.1.1 (2020-06-14) + +**Note:** Version bump only for package @shiftcode/iac-helper + +## 1.1.0 (2020-05-19) + +- feat(aws): account id function trough sts ([32025a2](https://github.com/shiftcode/sc-commons/commit/32025a2)) + +## 1.0.1 (2020-05-19) + +- fix(peerdeps): version of peer deps update ([9dd641d](https://github.com/shiftcode/sc-commons/commit/9dd641d)) + +## 1.0.0 (2020-05-19) + +- feat(typescript): update to typescript 3.9 ([1dc45f5](https://github.com/shiftcode/sc-commons/commit/1dc45f5)) + +### BREAKING CHANGE + +- tslib 2.0.0 required for typescript update + +## 0.1.0 (2020-05-11) + +- feat(iac-helper): code from baikonur ([3c547d9](https://github.com/shiftcode/sc-commons/commit/3c547d9)) diff --git a/packages/iac-utilities/README.md b/packages/iac-utilities/README.md new file mode 100644 index 00000000..b5f4b2d8 --- /dev/null +++ b/packages/iac-utilities/README.md @@ -0,0 +1,48 @@ +# iac-utilities + +> 🎯 Target runtime: es2023 ([Node >= 20](https://node.green/#ES2023)) + +Utilities for build and runtime to work with the [AWS-CDK](https://aws.amazon.com/de/cdk/). + +## necessary peer dependencies + +- `@aws-sdk/client-...` +- `@shiftcode/branch-utilities` +- `tslib` + +## optional peer dependencies + +- `@aws-sdk/client-cloudformation` + - `exportStackOutputs` +- `@aws-sdk/client-cloudfront` + - `invalidateCfCache` +- `@aws-sdk/credential-providers` & `@aws-sdk/types` + - `credentials-helper` +- `@shiftcode/lambda-utilities` + - `uploadToS3` +- `@aws-sdk/client-s3` + - `uploadToS3` + +## Scripts + +### aws-env-vars + +- **Purpose**: Resolve and provide AWS environment variables from a configuration file. +- **Usage**: `npm run aws-env-vars -c `, most commonly used with `eval "$(npm run aws-env-vars -c )"`. +- **Args**: + + | Arg | Description | Optional | + | --------------------- | ------------------------------------------------------------------------ | -------- | + | `-c, --config ` | Relative path to the config file (default: `./aws-accounts.config.json`) | Yes | + +- **Output**: Prints AWS environment variable exports or errors. + - exports `AWS_REGION` and `SC_AWS_ACCOUNT_ID` for the github action. + - exports `AWS_REGION` and `AWS_PROFILE` for the local development. + +### stage-override-to-pr-base + +- **Purpose**: Override the stage to the base of the current pr. (Only works in a GitHub action context.) +- **Usage**: `npm run stage-override-to-pr-base` +- **Args**: None +- **Output**: Prints the environment variable exports for the stage override or errors + - exports `SC_OVERRIDE_BRANCH_NAME` and `SC_OVERRIDE_IS_PR` diff --git a/packages/iac-utilities/eslint.config.js b/packages/iac-utilities/eslint.config.js new file mode 100644 index 00000000..4044f404 --- /dev/null +++ b/packages/iac-utilities/eslint.config.js @@ -0,0 +1,13 @@ +import { defineScTsConfig } from '@shiftcode/eslint-config-recommended' + +export default defineScTsConfig( + { + languageOptions: { parserOptions: { project: ['./tsconfig.lint.json'] } }, + }, + { + files: ['**/*.ts'], + rules: { + 'no-console': 'off', + }, + }, +) diff --git a/packages/iac-utilities/lint-staged.config.js b/packages/iac-utilities/lint-staged.config.js new file mode 100644 index 00000000..165242df --- /dev/null +++ b/packages/iac-utilities/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['eslint --fix --cache', 'npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/packages/iac-utilities/package.json b/packages/iac-utilities/package.json new file mode 100644 index 00000000..324f3aec --- /dev/null +++ b/packages/iac-utilities/package.json @@ -0,0 +1,97 @@ +{ + "name": "@shiftcode/iac-utilities", + "version": "1.0.0-pr254.4", + "description": "scripts and util functions for aws iac", + "repository": "https://github.com/shiftcode/sc-commons-public", + "license": "MIT", + "author": "shiftcode GmbH ", + "sideEffects": false, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./scripts": { + "types": "./dist/scripts/index.d.ts", + "default": "./dist/scripts/index.js" + } + }, + "bin": { + "aws-env-vars": "./dist/aws-env-vars.js", + "aws-sso-configure-profiles": "./dist/aws-sso-configure-profiles.js", + "credentials-helper": "./dist/credentials-helper.js", + "export-base-runtime-config": "./dist/export-base-runtime-config.js", + "export-stack-outputs": "./dist/export-stack-outputs.js", + "export-stage-info": "./dist/export-stage-info.js", + "fetch-client-config": "./dist/fetch-client-config.js", + "invalidate-cf-cache": "./dist/invalidate-cf-cache.js", + "publish-client-to-s3": "./dist/upload-to-s3.js", + "stage-info": "./dist/stage-info.js", + "stage-override-to-pr-base": "./dist/stage-override-to-pr-base.js", + "upload-to-s3": "./dist/upload-to-s3.js" + }, + "scripts": { + "build": "rm -rf ./dist && tsc", + "format": "prettier --write .", + "lint": "eslint --fix --cache .", + "lint:ci": "eslint .", + "prepublish": "node ../publish-helper/dist/prepare-dist.js", + "test": "vitest --cache --run", + "test:ci": "vitest --no-cache --run && tsc -p ./tsconfig.spec.json", + "test:watch": "vitest --cache" + }, + "dependencies": { + "ajv": "^8.16.0", + "fast-glob": "^3.2.10", + "just-snake-case": "^3.2.0", + "mime": "^4.0.4", + "yargs": "^17.2.1" + }, + "devDependencies": { + "@aws-sdk/client-cloudformation": "^3.204.0", + "@aws-sdk/client-cloudfront": "^3.204.0", + "@aws-sdk/client-s3": "^3.204.0", + "@aws-sdk/credential-providers": "^3.204.0", + "@aws-sdk/types": "^3.201.0", + "@shiftcode/branch-utilities": "^6.0.0-pr254.7", + "@shiftcode/lambda-utilities": "^1.0.0-pr254.4", + "@types/yargs": "^17.0.5" + }, + "peerDependencies": { + "@aws-sdk/client-cloudformation": "^3.204.0", + "@aws-sdk/client-cloudfront": "^3.204.0", + "@aws-sdk/client-s3": "^3.204.0", + "@aws-sdk/credential-providers": "^3.204.0", + "@aws-sdk/types": "^3.201.0", + "@shiftcode/branch-utilities": "^6.0.0 || ^6.0.0-pr254", + "@shiftcode/lambda-utilities": "^1.0.0 || ^1.0.0-pr254", + "tslib": "^2.3.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-cloudformation": { + "optional": true + }, + "@aws-sdk/client-cloudfront": { + "optional": true + }, + "@aws-sdk/client-s3": { + "optional": true + }, + "@aws-sdk/credential-providers": { + "optional": true + }, + "@aws-sdk/types": { + "optional": true + }, + "@shiftcode/branch-utilities": { + "optional": true + } + }, + "engines": { + "node": ">=22.10.2" + }, + "publishConfig": { + "directory": "dist" + } +} diff --git a/packages/iac-utilities/src/aws-env-vars.ts b/packages/iac-utilities/src/aws-env-vars.ts new file mode 100644 index 00000000..6945965e --- /dev/null +++ b/packages/iac-utilities/src/aws-env-vars.ts @@ -0,0 +1,19 @@ +#!/usr/bin/env node + +import yargs from 'yargs' + +import { awsEnvVars, AwsEnvVarsOptions } from './scripts/index.js' + +const args = yargs(process.argv).option('configFilePath' satisfies keyof AwsEnvVarsOptions, { + alias: 'c', + type: 'string', + description: 'Relative path to the AWS accounts config file', +}).argv + +try { + const responseMsg = await awsEnvVars(args) + console.info(responseMsg) +} catch (err) { + console.error(err) + process.exit(1) +} diff --git a/packages/iac-utilities/src/aws-sso-configure-profiles.ts b/packages/iac-utilities/src/aws-sso-configure-profiles.ts new file mode 100644 index 00000000..3ee439e3 --- /dev/null +++ b/packages/iac-utilities/src/aws-sso-configure-profiles.ts @@ -0,0 +1,30 @@ +#!/usr/bin/env node +import yargs from 'yargs' + +import { configureAwsProfiles, DEFAULT_PATH_TO_AWS_SSO_CONFIG } from './scripts/aws-sso-configure-profiles.function.js' + +const args = yargs(process.argv) + .option('config', { + alias: 'c', + type: 'string', + description: `path to the config file (default .${DEFAULT_PATH_TO_AWS_SSO_CONFIG}) from which the profiles will be copied to ~.aws/config. The content must match the schema defined in @shiftcode/iac-utilities/aws-sso-config-schema.json`, + demandOption: true, + }) + .option('verbose', { + type: 'boolean', + default: false, + description: 'Run with verbose logging', + }) + .example( + 'aws-sso-configure-profiles -c ./aws-sso-config.json', + 'copies the aws sso profiles form the given configuration file to the default config location (~/.aws/config)', + ) + .showHelpOnFail(true).argv + +try { + const responseMsg = await configureAwsProfiles(args) + process.stdout.write(responseMsg) +} catch (err) { + console.error(err) + process.exit(1) +} diff --git a/packages/iac-utilities/src/base/commons/base-bundle-info.type.ts b/packages/iac-utilities/src/base/commons/base-bundle-info.type.ts new file mode 100644 index 00000000..5402e8c2 --- /dev/null +++ b/packages/iac-utilities/src/base/commons/base-bundle-info.type.ts @@ -0,0 +1,11 @@ +export interface BaseBundleInfo { + handlerName: string + functionName: string + baseFilename: string + outPath: string +} + +export interface BundleInfo extends BaseBundleInfo { + entryPoint: string + filename: string +} diff --git a/packages/iac-utilities/src/base/commons/handler-to-bundle-info.function.spec.ts b/packages/iac-utilities/src/base/commons/handler-to-bundle-info.function.spec.ts new file mode 100644 index 00000000..0519dcc5 --- /dev/null +++ b/packages/iac-utilities/src/base/commons/handler-to-bundle-info.function.spec.ts @@ -0,0 +1,31 @@ +import { describe, expect, test } from 'vitest' + +import { BundleInfo } from './base-bundle-info.type.js' +import { handlerToBundleInfo } from './handler-to-bundle-info.function.js' + +describe('handlerToBundleInfo', () => { + test(`works with default './dist' `, () => { + const expectedBundleInfo: BundleInfo = { + baseFilename: 'my-fn', + filename: 'my-fn.js', + entryPoint: './dist/functions/my-fn.js', + functionName: 'my-fn', + handlerName: 'handler', + outPath: './dist/webpack/functions/my-fn/', + } + expect(handlerToBundleInfo('functions/my-fn.handler')).toEqual(expectedBundleInfo) + }) + test('works with custom src/dest paths', () => { + const expectedBundleInfo: BundleInfo = { + baseFilename: 'my-fn', + filename: 'my-fn.js', + entryPoint: './dist/_esm2019/functions/my-fn.js', + functionName: 'my-fn', + handlerName: 'handler', + outPath: './dist/bundles/functions/my-fn/', + } + expect(handlerToBundleInfo('functions/my-fn.handler', './dist/_esm2019', './dist/bundles')).toEqual( + expectedBundleInfo, + ) + }) +}) diff --git a/packages/iac-utilities/src/base/commons/handler-to-bundle-info.function.ts b/packages/iac-utilities/src/base/commons/handler-to-bundle-info.function.ts new file mode 100644 index 00000000..1dd1c201 --- /dev/null +++ b/packages/iac-utilities/src/base/commons/handler-to-bundle-info.function.ts @@ -0,0 +1,40 @@ +import path from 'node:path' + +import { BundleInfo } from './base-bundle-info.type.js' + +/** + * creates bundle info for given lambdaFunctionName + * @param handler the lambda function name + * @param sourceDir path to the lambda functions src dir, default `./dist` + * @param destDir path to the outDir, default `{sourceDir}/webpack/` + * @example + * handlerToBundleInfo('functions/my-fn.handler') -> { + * baseFilename: 'my-fn', + * filename: 'my-fn.js', + * entryPoint: './dist/functions/my-fn.js', + * functionName: 'my-fn', + * handlerName: 'handler', + * outPath: './dist/webpack/functions/my-fn/', + * } + */ +export function handlerToBundleInfo(handler: string, sourceDir = './dist', destDir?: string): BundleInfo { + destDir = destDir ? destDir : `${sourceDir}/webpack` + + const baseNameParts = path.basename(handler).split('.') + // return function handler name --> eg 'handler' + // filename can contain '.' + const handlerName = baseNameParts.splice(-1)[0] + const baseFilename = baseNameParts.join('.') + const functionName = baseNameParts.join('-') + const dirname = path.dirname(handler) + // abc-fn.handler --> abc-fn.js + const filename = `${baseFilename}.js` + return { + entryPoint: `${sourceDir}/${dirname}/${filename}`, + outPath: `${destDir}/${dirname}/${baseFilename}/`, + baseFilename, + filename, + handlerName, + functionName, + } +} diff --git a/packages/iac-utilities/src/base/commons/iac-stack-config-error.ts b/packages/iac-utilities/src/base/commons/iac-stack-config-error.ts new file mode 100644 index 00000000..36ae3c4d --- /dev/null +++ b/packages/iac-utilities/src/base/commons/iac-stack-config-error.ts @@ -0,0 +1,5 @@ +export class IacStackConfigError extends Error { + constructor(message: string) { + super(message) + } +} diff --git a/packages/iac-utilities/src/base/commons/iac-stack-name-strategy.enum.ts b/packages/iac-utilities/src/base/commons/iac-stack-name-strategy.enum.ts new file mode 100644 index 00000000..37fc11e2 --- /dev/null +++ b/packages/iac-utilities/src/base/commons/iac-stack-name-strategy.enum.ts @@ -0,0 +1,6 @@ +export enum IacStackNameStrategy { + /** @deprecated This should only be used for projects sticking to name master for the default branch, other should use PROD_DEPENDANT_MAIN */ + PROD_DEPENDANT, + STAGE_DEPENDANT, + PROD_DEPENDANT_MAIN, +} diff --git a/packages/iac-utilities/src/base/commons/prod-switchable.model.ts b/packages/iac-utilities/src/base/commons/prod-switchable.model.ts new file mode 100644 index 00000000..74c8a682 --- /dev/null +++ b/packages/iac-utilities/src/base/commons/prod-switchable.model.ts @@ -0,0 +1,11 @@ +/** + * Object with values for prod and nonProd + */ +export interface ProdSwitchable { + prod: T + nonProd: T +} + +export type ProdSwitchableKey

= { + [Key in keyof P]: P[Key] extends ProdSwitchable ? P[Key]['prod' | 'nonProd'] : never +} diff --git a/packages/iac-utilities/src/base/commons/stage-switchable.model.ts b/packages/iac-utilities/src/base/commons/stage-switchable.model.ts new file mode 100644 index 00000000..af15e310 --- /dev/null +++ b/packages/iac-utilities/src/base/commons/stage-switchable.model.ts @@ -0,0 +1,15 @@ +/** + * Object with values for specific stages (pr??, xx??) if set or general prod/pr/xx + */ +export interface StageSwitchable { + prod: T + pr: T + xx: T + + // specific stage (pr??, xx??) + [key: string]: T +} + +export type StageSwitchableKey

= { + [Key in keyof P]: P[Key] extends StageSwitchable ? P[Key]['prod' | 'pr' | 'xx'] : never +} diff --git a/packages/iac-utilities/src/base/config/build-time-base-runtime-config-provider.fn.ts b/packages/iac-utilities/src/base/config/build-time-base-runtime-config-provider.fn.ts new file mode 100644 index 00000000..1db52003 --- /dev/null +++ b/packages/iac-utilities/src/base/config/build-time-base-runtime-config-provider.fn.ts @@ -0,0 +1,18 @@ +import { getBranchInfo } from '@shiftcode/branch-utilities' + +import { BaseRuntimeConfigProviderFn } from '../utils/iac-stack-config.service.js' + +const REGION_ENV_VAR = 'AWS_REGION' + +/** + * reads the branchInfo (stage, isProd isPr) and the aws region env var to build the {@link BaseRuntimeConfig} + */ +export const buildTimeBaseRuntimeConfigProvider: BaseRuntimeConfigProviderFn = () => { + const { stage, isProd, isPr } = getBranchInfo(process.env) + const region = process.env[REGION_ENV_VAR] + if (!region) { + throw new Error(`AWS region is not set in env (${REGION_ENV_VAR})`) + } + + return { stage, productionFlag: isProd, pullRequestFlag: isPr, region } +} diff --git a/packages/iac-utilities/src/base/config/env-based-base-runtime-config-provider.fn.ts b/packages/iac-utilities/src/base/config/env-based-base-runtime-config-provider.fn.ts new file mode 100644 index 00000000..f9d53a58 --- /dev/null +++ b/packages/iac-utilities/src/base/config/env-based-base-runtime-config-provider.fn.ts @@ -0,0 +1,10 @@ +import { BaseRuntimeConfig } from '../utils/base-runtime-config.type.js' +import { BaseRuntimeConfigProviderFn, IacStackConfigService } from '../utils/iac-stack-config.service.js' + +export const envBasedBaseRuntimeConfigProvider: BaseRuntimeConfigProviderFn = () => { + if (process && process.env[IacStackConfigService.envBaseRuntimeConfig] !== undefined) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return JSON.parse(process.env[IacStackConfigService.envBaseRuntimeConfig]!) as BaseRuntimeConfig + } + throw new Error('No base runtime config found in environment variables') +} diff --git a/packages/iac-utilities/src/base/index.ts b/packages/iac-utilities/src/base/index.ts new file mode 100644 index 00000000..6221e2e0 --- /dev/null +++ b/packages/iac-utilities/src/base/index.ts @@ -0,0 +1,13 @@ +export * from './commons/base-bundle-info.type.js' +export * from './commons/handler-to-bundle-info.function.js' +export * from './commons/iac-stack-config-error.js' +export * from './commons/iac-stack-name-strategy.enum.js' +export * from './commons/prod-switchable.model.js' +export * from './commons/stage-switchable.model.js' +export * from './config/build-time-base-runtime-config-provider.fn.js' +export * from './config/env-based-base-runtime-config-provider.fn.js' +export * from './utils/base-runtime-config.type.js' +export * from './utils/extend-with-iac-utils.function.js' +export * from './utils/iac-stack-config.service.js' +export * from './utils/switch-prod-dependant.function.js' +export * from './utils/type-utils.js' diff --git a/packages/iac-utilities/src/base/utils/base-runtime-config.type.ts b/packages/iac-utilities/src/base/utils/base-runtime-config.type.ts new file mode 100644 index 00000000..18ae562c --- /dev/null +++ b/packages/iac-utilities/src/base/utils/base-runtime-config.type.ts @@ -0,0 +1,6 @@ +export interface BaseRuntimeConfig { + stage: string + region: string + productionFlag: boolean + pullRequestFlag: boolean +} diff --git a/packages/iac-utilities/src/base/utils/extend-with-iac-utils.function.spec.ts b/packages/iac-utilities/src/base/utils/extend-with-iac-utils.function.spec.ts new file mode 100644 index 00000000..fff81d2b --- /dev/null +++ b/packages/iac-utilities/src/base/utils/extend-with-iac-utils.function.spec.ts @@ -0,0 +1,50 @@ +import { StageInfo } from '@shiftcode/branch-utilities' +import { describe, expect, test } from 'vitest' + +import { IacStackNameStrategy } from '../commons/iac-stack-name-strategy.enum.js' +import { ProdSwitchable } from '../commons/prod-switchable.model.js' +import { StageSwitchable } from '../commons/stage-switchable.model.js' +import { extendWithIacUtils } from './extend-with-iac-utils.function.js' +import { IacStackConfigService } from './iac-stack-config.service.js' + +describe('extendWithIacUtils', () => { + class BaseClass { + constructor(readonly name: string) {} + } + + interface TestStackProps { + a: ProdSwitchable + b: StageSwitchable + c: boolean + } + + class TestStack extends extendWithIacUtils(BaseClass) { + constructor(name: string, props: TestStackProps, configService: IacStackConfigService) { + super([name], props, configService) + } + } + + test('works with correct type inference', () => { + const rtConfig: StageInfo = { + stage: 'xx1', + isPr: false, + isProd: false, + } + const region = 'eu-central-1' + const props: TestStackProps = { + a: { prod: 100, nonProd: 50 }, + b: { prod: '1', pr: '2', xx: '3', xx1: '4' }, + c: true, + } + const x = new TestStack( + 'test', + props, + new IacStackConfigService('iac-test', IacStackNameStrategy.STAGE_DEPENDANT, rtConfig, region), + ) + + expect(x.getProdDependantProp('a')).toEqual(50) + expect(x.getStageDependantProp('b')).toEqual('4') + expect(x.props.c).toEqual(true) + expect(x.configService.stackName).toBe('iac-test-xx1') + }) +}) diff --git a/packages/iac-utilities/src/base/utils/extend-with-iac-utils.function.ts b/packages/iac-utilities/src/base/utils/extend-with-iac-utils.function.ts new file mode 100644 index 00000000..6c6a7310 --- /dev/null +++ b/packages/iac-utilities/src/base/utils/extend-with-iac-utils.function.ts @@ -0,0 +1,52 @@ +import { ProdSwitchable, ProdSwitchableKey } from '../commons/prod-switchable.model.js' +import { StageSwitchable, StageSwitchableKey } from '../commons/stage-switchable.model.js' +import { IacStackConfigService } from './iac-stack-config.service.js' +import { AllowedNames } from './type-utils.js' + +/** the IacUtils Interface */ +export interface IacUtils

{ + readonly props: P + readonly configService: IacStackConfigService + + getProdDependantProp>>(propKey: K): ProdSwitchableKey

[K] + + getStageDependantProp>>(propKey: K): StageSwitchableKey

[K] +} + +/** the IacUtils constructable type used as return type when calling the {@link extendWithIacUtils} function */ +export type IacUtilsConstructable any> = new ( + superArgs: ConstructorParameters, + params: P, + configService: IacStackConfigService, +) => InstanceType & IacUtils

+ +/** the actual Utilities function which takes any class to extend */ +export function extendWithIacUtils any>(clazz: T): IacUtilsConstructable { + // The Utilities class which implements the Utilities interface */ + class IacUtilsClazz extends (clazz) implements IacUtils

{ + constructor( + superArgs: ConstructorParameters, + readonly props: P, + readonly configService: IacStackConfigService, + ) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + super(...superArgs) + } + + /** + * get prod or nonProd value of a prodSwitchable property + */ + getProdDependantProp>>(propKey: K): ProdSwitchableKey

[K] { + return this.configService.switchProdDependant(>this.props[propKey]) + } + + /** + * get stage dependant value of a StageSwitchable property + */ + getStageDependantProp>>(propKey: K): StageSwitchableKey

[K] { + return this.configService.switchStageDependant(>this.props[propKey]) + } + } + + return IacUtilsClazz as IacUtilsConstructable +} diff --git a/packages/iac-utilities/src/base/utils/iac-stack-config.service.ts b/packages/iac-utilities/src/base/utils/iac-stack-config.service.ts new file mode 100644 index 00000000..223c6d8c --- /dev/null +++ b/packages/iac-utilities/src/base/utils/iac-stack-config.service.ts @@ -0,0 +1,134 @@ +import { StageInfo } from '@shiftcode/branch-utilities' + +import { IacStackNameStrategy } from '../commons/iac-stack-name-strategy.enum.js' +import { ProdSwitchable } from '../commons/prod-switchable.model.js' +import { StageSwitchable } from '../commons/stage-switchable.model.js' +import { BaseRuntimeConfig } from './base-runtime-config.type.js' + +export type BaseRuntimeConfigProviderFn = () => BaseRuntimeConfig + +export class IacStackConfigService { + /* eslint-disable-next-line @typescript-eslint/naming-convention */ + static readonly envBaseRuntimeConfig = 'SC_BASE_RUNTIME_CONFIG' + + readonly stackName: string + + constructor( + readonly stackBaseName: string, + private readonly nameStrategy: IacStackNameStrategy, + readonly stageInfo: StageInfo, + readonly region: string, + ) { + this.stackName = this.nameByStrategy(stackBaseName) + } + + /** + * concatenates given propertyToName according to defined nameStrategy. + * default mode is 'append' + */ + nameByStrategy(propertyToName: string, mode: 'append' | 'prepend' = 'append') { + switch (this.nameStrategy) { + case IacStackNameStrategy.PROD_DEPENDANT: + return this.prodDependantNaming('master', propertyToName, mode) + case IacStackNameStrategy.PROD_DEPENDANT_MAIN: + return this.prodDependantNaming('main', propertyToName, mode) + case IacStackNameStrategy.STAGE_DEPENDANT: + return this.stageDependantNaming(propertyToName, mode) + default: + throw new Error('Unsupported enum value for IacStackNameStrategy') + } + } + + /** + * create name by defined {@link nameByStrategy} and given region + * mode defaults to append + * @example + * nameByStrategyAndRegion('abc') => + */ + nameByStrategyAndRegion(propertyToName: string, mode: 'append' | 'prepend' = 'append') { + switch (this.nameStrategy) { + case IacStackNameStrategy.PROD_DEPENDANT: + return this.prodDependantNaming('master', this.regionDependantNaming(propertyToName, mode), mode) + case IacStackNameStrategy.PROD_DEPENDANT_MAIN: + return this.prodDependantNaming('main', this.regionDependantNaming(propertyToName, mode), mode) + case IacStackNameStrategy.STAGE_DEPENDANT: + return this.stageDependantNaming(this.regionDependantNaming(propertyToName, mode), mode) + default: + throw new Error('Unsupported enum value for IacStackNameStrategy') + } + } + + /** prepends the {@link stackName} to proveided propertyName */ + stackDependantNaming(propertyToName: string) { + return `${this.stackName}-${propertyToName}` + } + + /** + * get prod or nonProd value of a prodSwitchable property + */ + switchProdDependant(valueToSwitch: ProdSwitchable): K { + return this.stageInfo.isProd ? valueToSwitch.prod : valueToSwitch.nonProd + } + + prodDependant(prodValue: K, nonProd: K) { + return this.stageInfo.isProd ? prodValue : nonProd + } + + /** + * get stage dependant value of a StageSwitchable property + * (falls back to the xx value if actual stage is not defined in valueToSwitch) + */ + switchStageDependant(valueToSwitch: StageSwitchable): K { + const { stage, isProd, isPr } = this.stageInfo + if (stage in valueToSwitch) { + return valueToSwitch[stage] + } + if (isProd) { + return valueToSwitch.prod + } + if (isPr) { + return valueToSwitch.pr + } + return valueToSwitch.xx + } + + /** + * create a stack and region dependant bucket name + * @return `${stackName}-${region}-${name}` + */ + createBucketName(name: string): string { + return `${this.stackName}-${this.region}-${name}` + } + + /** + * concatenates given propertyToName with the region. + * mode defaults to append (= `${propertyToName}-${region}`) + */ + private regionDependantNaming(propertyToName: string, mode: 'append' | 'prepend' = 'append') { + return mode === 'append' ? `${propertyToName}-${this.region}` : `${this.region}-${propertyToName}` + } + + /** + * concatenates given propertyToName with the stage. + * mode defaults to append (= `${propertyToName}-${stage}`) + */ + private stageDependantNaming(propertyToName: string, mode: 'append' | 'prepend' = 'append') { + return mode === 'append' ? `${propertyToName}-${this.stageInfo.stage}` : `${this.stageInfo.stage}-${propertyToName}` + } + + /** + * Since prod currently is represented by either 'master' | 'main' we support both keywords. + * Concatenates given propertyToName with either 'nonProd' or 'master'|'main' (depending on naming convention). + * mode defaults to append (= `${propertyToName}-${nonProd|}`) + */ + private prodDependantNaming( + prodKeyword: 'master' | 'main', + propertyToName: string, + mode: 'append' | 'prepend' = 'append', + ) { + // we call the prod stack master to be congruent with stack dependant naming + const toAdd = this.stageInfo.isProd ? prodKeyword : 'nonProd' + + return mode === 'append' ? `${propertyToName}-${toAdd}` : `${toAdd}-${propertyToName}` + } +} diff --git a/packages/iac-utilities/src/base/utils/switch-prod-dependant.function.ts b/packages/iac-utilities/src/base/utils/switch-prod-dependant.function.ts new file mode 100644 index 00000000..0f31dc7b --- /dev/null +++ b/packages/iac-utilities/src/base/utils/switch-prod-dependant.function.ts @@ -0,0 +1,11 @@ +import { ProdSwitchable } from '../commons/prod-switchable.model.js' + +export function switchProdDependant( + switchable: ProdSwitchable, + runtimeConfig: { common: { productionFlag: boolean } }, +): K { + if (runtimeConfig.common.productionFlag) { + return switchable.prod + } + return switchable.nonProd +} diff --git a/packages/iac-utilities/src/base/utils/type-utils.ts b/packages/iac-utilities/src/base/utils/type-utils.ts new file mode 100644 index 00000000..28fd419b --- /dev/null +++ b/packages/iac-utilities/src/base/utils/type-utils.ts @@ -0,0 +1,5 @@ +export type FilterFlags = { + [Key in keyof Base]: Base[Key] extends Condition ? Key : never +} + +export type AllowedNames = FilterFlags[keyof Base] diff --git a/packages/iac-utilities/src/credentials-helper.ts b/packages/iac-utilities/src/credentials-helper.ts new file mode 100644 index 00000000..1287779d --- /dev/null +++ b/packages/iac-utilities/src/credentials-helper.ts @@ -0,0 +1,13 @@ +#!/usr/bin/env node +import { credentialsInit } from './scripts/index.js' + +// simply get the first provided arg +const profileArg = process.argv[2] + +try { + await credentialsInit(profileArg) + // noop as the credential_process output is already written to stdout +} catch (err) { + console.error(err) + process.exit(1) +} diff --git a/packages/iac-utilities/src/export-base-runtime-config.ts b/packages/iac-utilities/src/export-base-runtime-config.ts new file mode 100644 index 00000000..05c8ca06 --- /dev/null +++ b/packages/iac-utilities/src/export-base-runtime-config.ts @@ -0,0 +1,36 @@ +#!/usr/bin/env node +import yargs from 'yargs' + +import { exportBaseRuntimeConfig } from './scripts/index.js' + +const args = yargs(process.argv) + .option('destination', { + alias: 'd', + type: 'string', + description: 'relative target path', + default: './', + }) + .option('filename', { + alias: 'f', + type: 'string', + description: 'name for file to write', + default: 'base-runtime-config.json', + }) + .option('stage', { + alias: 's', + type: 'string', + description: 'create base runtime with provided stage', + }) + .option('region', { + alias: 'r', + type: 'string', + description: 'create base runtime with provided region', + }).argv + +try { + const responseMsg = await exportBaseRuntimeConfig(args) + console.info(responseMsg) +} catch (err) { + console.error(err) + process.exit(1) +} diff --git a/packages/iac-utilities/src/export-stack-outputs.ts b/packages/iac-utilities/src/export-stack-outputs.ts new file mode 100644 index 00000000..6f93dbaa --- /dev/null +++ b/packages/iac-utilities/src/export-stack-outputs.ts @@ -0,0 +1,31 @@ +#!/usr/bin/env node +import yargs from 'yargs' + +import { exportStackOutputs } from './scripts/index.js' + +const args = yargs(process.argv) + .option('stackName', { + alias: 'n', + type: 'string', + description: 'stackname from which the outputs should be fetched', + demandOption: true, + }) + .option('destination', { + alias: 'd', + type: 'string', + description: 'relative target path', + default: './', + }) + .option('fileName', { + alias: 'f', + type: 'string', + description: 'name for file to write (default [stackname].cf-outputs.json)', + }).argv + +try { + const responseMsg = await exportStackOutputs(args) + console.info(responseMsg) +} catch (err) { + console.error(err) + process.exit(1) +} diff --git a/packages/iac-utilities/src/export-stage-info.ts b/packages/iac-utilities/src/export-stage-info.ts new file mode 100644 index 00000000..67410054 --- /dev/null +++ b/packages/iac-utilities/src/export-stage-info.ts @@ -0,0 +1,31 @@ +#!/usr/bin/env node +import yargs from 'yargs' + +import { exportStageInfo } from './scripts/index.js' + +const args = yargs(process.argv) + .option('destination', { + alias: 'd', + type: 'string', + description: 'relative target path', + default: './', + }) + .option('filename', { + alias: 'f', + type: 'string', + description: 'name for file to write', + default: 'stage-info.json', + }) + .option('stage', { + alias: 's', + type: 'string', + description: 'create stage-info with provided stage', + }).argv + +try { + const responseMsg = await exportStageInfo(args) + console.info(responseMsg) +} catch (err) { + console.error(err) + process.exit(1) +} diff --git a/packages/iac-utilities/src/fetch-client-config.ts b/packages/iac-utilities/src/fetch-client-config.ts new file mode 100644 index 00000000..57c87772 --- /dev/null +++ b/packages/iac-utilities/src/fetch-client-config.ts @@ -0,0 +1,44 @@ +#!/usr/bin/env node +import yargs from 'yargs' + +import { fetchClientConfig } from './scripts/index.js' + +const DEFAULT_OUTPUT_KEY = 'CFO_CLIENT_CONFIG_URL' + +const args = yargs(process.argv) + .option('outputs', { + alias: 'o', + type: 'string', + description: `path to the outputs json file. needs to define ${DEFAULT_OUTPUT_KEY}`, + demandOption: true, + }) + .option('key', { + type: 'string', + description: `key to read in the outputs.json file containing the client-config url`, + default: DEFAULT_OUTPUT_KEY, + }) + .option('destination', { + alias: 'd', + type: 'string', + description: 'relative target path', + default: './', + }) + .option('write', { + type: 'boolean', + description: 'write to file (default: true)', + default: true, + }).argv + +try { + const resolvedArgs = await args + const responseMsg = await fetchClientConfig({ + outputs: resolvedArgs.outputs, + key: resolvedArgs.key, + destination: resolvedArgs.destination, + noWrite: !resolvedArgs.write, + }) + console.info(responseMsg) +} catch (err) { + console.error(err) + process.exit(1) +} diff --git a/packages/iac-utilities/src/index.ts b/packages/iac-utilities/src/index.ts new file mode 100644 index 00000000..13e1683d --- /dev/null +++ b/packages/iac-utilities/src/index.ts @@ -0,0 +1 @@ +export * from './base/index.js' diff --git a/packages/iac-utilities/src/invalidate-cf-cache.ts b/packages/iac-utilities/src/invalidate-cf-cache.ts new file mode 100644 index 00000000..ce30c483 --- /dev/null +++ b/packages/iac-utilities/src/invalidate-cf-cache.ts @@ -0,0 +1,34 @@ +#!/usr/bin/env node +import yargs from 'yargs' + +import { invalidateCfCache } from './scripts/index.js' + +const DEFAULT_OUTPUT_KEY = 'CFO_CLOUD_FRONT_DISTRIBUTION_ID' + +const args = yargs(process.argv) + .option('outputs', { + alias: 'o', + type: 'string', + description: `path to the outputs json file. needs to define ${DEFAULT_OUTPUT_KEY}`, + demandOption: true, + }) + .option('key', { + type: 'string', + description: `key to read in the outputs.json file containing the cloudFront distribution ID`, + default: DEFAULT_OUTPUT_KEY, + }) + .option('wait', { type: 'boolean', default: false, description: 'wait until invalidation is done' }) + .option('items', { + array: true, + type: 'string', + description: 'items to invalidate', + default: ['/*'], + }).argv + +try { + const responseMsg = await invalidateCfCache(args) + console.info(responseMsg) +} catch (err) { + console.error(err) + process.exit(1) +} diff --git a/packages/iac-utilities/src/json-schemas/aws-sso-profiles-definition-schema.json b/packages/iac-utilities/src/json-schemas/aws-sso-profiles-definition-schema.json new file mode 100644 index 00000000..f68ff2a6 --- /dev/null +++ b/packages/iac-utilities/src/json-schemas/aws-sso-profiles-definition-schema.json @@ -0,0 +1,99 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "aws-sso-profiles-config://config-definition", + "title": "AWS SSO profiles config definition", + "type": "object", + "properties": { + "profileByStage": { + "type": "object", + "description": "Configures the mapping between the stage and the profile to use, currently we only support prod & dev.", + "minProperties": 1, + "properties": { + "prod": { + "type": "string" + }, + "dev": { + "type": "string" + } + }, + "additionalProperties": false + }, + "profiles": { + "type": "object", + "description": "Configures all the available profiles which can be referenced by the profileByStage property.", + "minProperties": 1, + "patternProperties": { + "^\\w*-(prod|dev){1}$": { + "anyOf": [ + { + "$ref": "#/$defs/directSsoProfile" + }, + { + "$ref": "#/$defs/ssoOnlyProfile" + }, + { + "$ref": "#/$defs/assumeRoleProfile" + } + ] + } + } + } + }, + "required": ["profileByStage", "profiles"], + "$defs": { + "directSsoProfile": { + "type": "object", + "required": ["sso_session", "sso_account_id", "sso_role_name", "region", "output"], + "properties": { + "sso_session": { + "type": "string" + }, + "sso_account_id": { + "type": "string" + }, + "sso_role_name": { + "type": "string" + }, + "region": { + "type": "string" + }, + "output": { + "enum": ["json"] + } + } + }, + "ssoOnlyProfile": { + "type": "object", + "required": ["sso_session", "sso_account_id", "sso_role_name"], + "properties": { + "sso_session": { + "type": "string" + }, + "sso_account_id": { + "type": "string" + }, + "sso_role_name": { + "type": "string" + } + } + }, + "assumeRoleProfile": { + "type": "object", + "required": ["source_profile", "role_arn", "region", "output"], + "properties": { + "source_profile": { + "type": "string" + }, + "role_arn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "output": { + "enum": ["json"] + } + } + } + } +} diff --git a/packages/iac-utilities/src/json-schemas/s3-upload-definition-schema.json b/packages/iac-utilities/src/json-schemas/s3-upload-definition-schema.json new file mode 100644 index 00000000..69388c76 --- /dev/null +++ b/packages/iac-utilities/src/json-schemas/s3-upload-definition-schema.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "upload-to-s3://s3-upload-definition", + "title": "S3 Upload Definitions", + "type": "object", + "required": ["definitions"], + "properties": { + "definitions": { + "type": "array", + "items": { + "type": "object", + "required": ["include", "cacheControl"], + "properties": { + "include": { + "type": "array", + "description": "Localization files to use for i18n", + "items": { + "type": "string", + "description": "glob pattern", + "examples": ["*.css", "*.js"] + }, + "minItems": 1 + }, + "cacheControl": { + "type": "string", + "description": "cache control to set when uploading", + "examples": ["max-age=0, s-maxage=300", "max-age=604800"] + }, + "contentType": { + "type": "string", + "description": "content type to set when uploading", + "examples": ["text/html; charset=utf-8*"] + } + } + }, + "minItems": 1 + } + } +} diff --git a/packages/iac-utilities/src/scripts/aws-env-vars.function.ts b/packages/iac-utilities/src/scripts/aws-env-vars.function.ts new file mode 100644 index 00000000..5fd7351d --- /dev/null +++ b/packages/iac-utilities/src/scripts/aws-env-vars.function.ts @@ -0,0 +1,31 @@ +import path from 'node:path' + +import { getBranchInfo, isGithubWorkflow } from '@shiftcode/branch-utilities' + +import { resolveActiveProfile } from './aws-sso-configure-profiles.function.js' + +export interface AwsEnvVarsOptions { + configFilePath?: string +} + +export async function awsEnvVars(options: AwsEnvVarsOptions | Promise): Promise { + const opts = await options + + const oldLogger = console.log + console.log = () => void 0 + + const { isProd } = getBranchInfo(process.env) + + const filePath = path.join(process.cwd(), opts.configFilePath || './aws-accounts.config.json') + + const activeProfile = await resolveActiveProfile(isProd, filePath) + + console.log = oldLogger + // Keep in mind this is a multiline template string, do not format / indent it. + return `${ + isGithubWorkflow(process.env) + ? `export SC_AWS_ACCOUNT_ID=${activeProfile.sso_account_id}` + : `export AWS_PROFILE=${activeProfile.profileName}` + } +export AWS_REGION=${activeProfile.region}` +} diff --git a/packages/iac-utilities/src/scripts/aws-sso-configure-profiles.function.ts b/packages/iac-utilities/src/scripts/aws-sso-configure-profiles.function.ts new file mode 100644 index 00000000..4c5b4559 --- /dev/null +++ b/packages/iac-utilities/src/scripts/aws-sso-configure-profiles.function.ts @@ -0,0 +1,140 @@ +import { execSync } from 'node:child_process' +import { existsSync } from 'node:fs' +import { readFile } from 'node:fs/promises' + +import { Ajv, ValidateFunction } from 'ajv' + +// eslint-disable-next-line import/no-internal-modules +import awsSsoProfileConfigSchema from '../json-schemas/aws-sso-profiles-definition-schema.json' with { type: 'json' } + +export const DEFAULT_PATH_TO_AWS_SSO_CONFIG = '/aws/sso.config.json' + +export const AWS_SSO_CONFIG_SCHEMA_NAME = '@shiftcode/iac-utilities/aws-sso-profile-config-schema.json' + +type AwsSsoConfigDefSchemaName = `${string}${typeof AWS_SSO_CONFIG_SCHEMA_NAME}` + +type AwsSsoProfileStage = 'prod' | 'dev' + +type SsoProfile = { + /* eslint-disable @typescript-eslint/naming-convention */ + sso_session: string + sso_account_id: string + sso_role_name: string + region: string + output: string + /* eslint-enable @typescript-eslint/naming-convention */ +} + +/** + * this type reflects the json schema of {@link ./aws-sso-profile-config-schema.json} + */ +interface AwsSsoProfileConfig { + $schema: AwsSsoConfigDefSchemaName + profileByStage: Record + profiles: Record +} + +export interface AwsConfigureProfilesOptions { + config: string + verbose: boolean +} + +const info: Console['log'] = (...a: any[]) => console.log('awsSsoCopyConfig ::', ...a) + +/** + * ensures the aws cli is installed + */ +export function assertAWSCliInstalled() { + try { + execSync('aws --version') + return true + } catch { + throw new Error('Unable to execute "aws --version" - Do you have the AWS CLI installed?') + } +} + +/** + * reads the config file from the given path and validates it against the JSON schema + * @param path + */ +async function readConfigFile(path: string): Promise { + if (!existsSync(path)) { + throw new Error(`AWS SSO config file '${path}' does not exist.`) + } + const file = await readFile(path, 'utf8') + const parsed = JSON.parse(file) + + const schemaValidator: ValidateFunction = new Ajv({ allErrors: true, strict: 'log' }).compile( + awsSsoProfileConfigSchema, + ) + const valid = schemaValidator(parsed) + + if (valid) { + // ensure the values in profileByStage point to valid profile definitions + const allProfiles = Object.keys(parsed.profiles) + if (Object.values(parsed.profileByStage).some((profileName) => !allProfiles.includes(profileName))) { + throw new Error( + `At least one profile is referenced in the profileByStage section but not defined in the profiles section`, + ) + } + + return parsed + } + + info('invalid definitions file:', schemaValidator.errors) + throw new Error(`Config file does not match schema`) +} + +export async function configureAwsProfiles( + options: AwsConfigureProfilesOptions | Promise, +) { + const opts = await options + const log: Console['log'] = opts.verbose ? (...a: any[]) => console.log('awsSsoCopyConfig ::', ...a) : () => {} + + // make sure the aws cli is installed + assertAWSCliInstalled() + log(`AWS CLI installation verified`) + + const awsSsoConfig = await readConfigFile(opts.config ?? DEFAULT_PATH_TO_AWS_SSO_CONFIG) + log(`AWS SSO config file loaded from '${opts.config}'`, JSON.stringify(awsSsoConfig, undefined, 2)) + + for (const [profileName, profileSettings] of Object.entries(awsSsoConfig.profiles)) { + if (profileSettings) { + for (const [key, value] of Object.entries(profileSettings)) { + const command = `aws configure set profile.${profileName}.${key} ${value}` + log(`executing: ${command}`) + execSync(command) + } + } + } + + const existingProfiles = execSync('aws configure list-profiles').toString().split('\n') + existingProfiles.pop() // remove last empty line + info( + 'AWS profiles added to your local AWS CLI configuration (~/.aws/config). You now have the following profiles in your config:', + ) + for (const profile of existingProfiles) { + info(`- ${profile}`) + } + return 'DONE' +} + +export async function resolveActiveProfile( + isProd: boolean, + configFilePath = DEFAULT_PATH_TO_AWS_SSO_CONFIG, +): Promise { + const stage = isProd ? 'prod' : 'dev' + const configFile = await readConfigFile(configFilePath) + info('configFile', configFile) + + const ssoProfileName = configFile.profileByStage[stage] + + const activeSsoProfile = configFile.profiles[ssoProfileName] + if (!activeSsoProfile) { + throw new Error( + `No profile found for stage ${stage}, existing stages are ${Object.keys(configFile.profileByStage).join(', ')}`, + ) + } + + return { ...activeSsoProfile, profileName: ssoProfileName } +} diff --git a/packages/iac-utilities/src/scripts/credentials-helper.function.ts b/packages/iac-utilities/src/scripts/credentials-helper.function.ts new file mode 100644 index 00000000..d3a0f136 --- /dev/null +++ b/packages/iac-utilities/src/scripts/credentials-helper.function.ts @@ -0,0 +1,56 @@ +import { execSync } from 'node:child_process' + +import { fromSSO } from '@aws-sdk/credential-providers' +import { Credentials } from '@aws-sdk/types' + +/* + * Credential helper to export temporary credentials from AWS SSO to AWS SDK v2 based tools like aws-cdk. + * This package can be removed once https://github.com/aws/aws-cdk/issues/5455 is closed + * and all our internal tools are using v3 AWS JS SDK. + * You can use it as credential_process inside the aws config. + */ +export async function credentialsInit(profile: string | undefined) { + if (!profile) { + throw new Error('You have to provide a profile as first arg') + } + try { + if (isAWSCliInstalled()) { + const result = await fromSSO({ profile })() + writeKeys(result, profile, true) + } + } catch (e: unknown) { + if (e && typeof e === 'object' && 'message' in e && String(e.message).indexOf('run aws sso login') !== -1) { + execSync(`aws sso login --profile ${profile}`) + await credentialsInit(profile) + } else { + throw e + } + } +} + +function isAWSCliInstalled(): boolean { + try { + execSync('aws --version') + return true + } catch { + throw new Error('Unable to execute "aws --version" - Do you have the AWS CLI installed?') + } +} + +function writeKeys(credentials: Credentials, profile: string, toConsole = false) { + if (toConsole) { + console.log( + JSON.stringify({ + Version: 1, + AccessKeyId: credentials.accessKeyId, + SecretAccessKey: credentials.secretAccessKey, + SessionToken: credentials.sessionToken, + Expiration: credentials.expiration?.toISOString(), + }), + ) + } else { + execSync(`aws configure set --profile active_SSO-${profile} aws_access_key_id ${credentials.accessKeyId}`) + execSync(`aws configure set --profile active_SSO-${profile} aws_secret_access_key ${credentials.secretAccessKey}`) + execSync(`aws configure set --profile active_SSO-${profile} aws_session_token ${credentials.sessionToken}`) + } +} diff --git a/packages/iac-utilities/src/scripts/export-base-runtime.function.ts b/packages/iac-utilities/src/scripts/export-base-runtime.function.ts new file mode 100644 index 00000000..08612da1 --- /dev/null +++ b/packages/iac-utilities/src/scripts/export-base-runtime.function.ts @@ -0,0 +1,58 @@ +import { mkdir, writeFile } from 'node:fs/promises' +import path from 'node:path' + +import { buildTimeBaseRuntimeConfigProvider } from '../base/config/build-time-base-runtime-config-provider.fn.js' +import { BaseRuntimeConfig } from '../base/index.js' + +interface ExportBaseRuntimeConfigOptions { + destination: string + filename: string + stage?: string + region?: string +} + +export async function exportBaseRuntimeConfig( + options: ExportBaseRuntimeConfigOptions | Promise, +) { + const opts = await options + let config: BaseRuntimeConfig + + if (opts.stage && opts.region) { + // make sure when stage and region is set, never call buildTimeBaseRuntimeConfigProvider (SM) + config = createConfig(opts.stage, opts.region) + } else if (opts.stage) { + config = createConfig(opts.stage, buildTimeBaseRuntimeConfigProvider().region) + } else { + config = buildTimeBaseRuntimeConfigProvider() + } + + if (!opts.filename.endsWith('.json')) { + throw new Error('name has to end with `.json`') + } + + const configNice = JSON.stringify(config, undefined, 2) + + const destinationPath = path.join(process.cwd(), opts.destination) + + await mkdir(destinationPath, { recursive: true }) + + const filePath = path.join(destinationPath, opts.filename) + console.info(`writing file to ${filePath}`) + await writeFile(filePath, configNice, { encoding: 'utf8' }) + + return configNice +} + +function createConfig(stage: string, region: string): BaseRuntimeConfig { + const isPr = stage.startsWith('pr') + const isXx = stage.startsWith('xx') + if (!isPr && !isXx) { + throw new Error('The provided stage neither is xx nor pr.') + } + return { + region, + stage, + productionFlag: false, + pullRequestFlag: isPr, + } +} diff --git a/packages/iac-utilities/src/scripts/export-stack-outputs.function.spec.ts b/packages/iac-utilities/src/scripts/export-stack-outputs.function.spec.ts new file mode 100644 index 00000000..bd850720 --- /dev/null +++ b/packages/iac-utilities/src/scripts/export-stack-outputs.function.spec.ts @@ -0,0 +1,19 @@ +import { describe, expect, test } from 'vitest' + +import { createJson } from './export-stack-outputs.function.js' + +describe('export stack outputs', () => { + test('create correct json', () => { + const json = JSON.parse( + createJson([ + { + Description: 'description', + OutputKey: 'Some-Output-Key', + OutputValue: 'Some-Output-Value', + ExportName: 'ExportName', + }, + ]), + ) + expect(json).toEqual({ CFO_SOME_OUTPUT_KEY: 'Some-Output-Value' }) + }) +}) diff --git a/packages/iac-utilities/src/scripts/export-stack-outputs.function.ts b/packages/iac-utilities/src/scripts/export-stack-outputs.function.ts new file mode 100644 index 00000000..798e3f74 --- /dev/null +++ b/packages/iac-utilities/src/scripts/export-stack-outputs.function.ts @@ -0,0 +1,63 @@ +import { mkdir, writeFile } from 'node:fs/promises' +import path from 'node:path' + +import { CloudFormationClient, DescribeStacksCommand } from '@aws-sdk/client-cloudformation' +import snakeCase from 'just-snake-case' + +export interface ExportStackOutputsOptions { + stackName: string + destination: string + fileName?: string +} + +export async function exportStackOutputs( + options: ExportStackOutputsOptions | Promise, +): Promise { + const opts = await options + const cfn = new CloudFormationClient({}) + const stacks = await cfn.send(new DescribeStacksCommand({ StackName: opts.stackName })) + if (!stacks.Stacks) { + throw new Error(`no stack found with name ${opts.stackName}`) + } + const outputs = stacks.Stacks?.[0].Outputs + + if (!outputs) { + throw new Error('no stack outputs found') + } + + const dirPath = path.join(process.cwd(), opts.destination) + + await mkdir(dirPath, { recursive: true }) + + const filePath = path.join(dirPath, opts.fileName || `${opts.stackName}.cf-outputs.json`) + + await writeFile(filePath, createJson(outputs), { encoding: 'utf8' }) + + // await Promise.all([ + // writeFile(`./${productName}.cf-outputs.sh`, createSh(outputs), { encoding: 'utf8' }), + // ]) + + return 'DONE' +} + +// copy-pasted since not exported +/* eslint-disable @typescript-eslint/naming-convention */ +interface Output { + OutputKey?: string + OutputValue?: string + Description?: string + ExportName?: string +} +/* eslint-enable @typescript-eslint/naming-convention */ + +export function createJson(outputs: Output[]): string { + const obj = outputs.reduce>( + (u, output) => ({ + ...u, + [`CFO_${snakeCase(output.OutputKey).toUpperCase()}`]: output.OutputValue ?? null, + }), + {}, + ) + + return JSON.stringify(obj, undefined, 2) +} diff --git a/packages/iac-utilities/src/scripts/export-stage-info.function.ts b/packages/iac-utilities/src/scripts/export-stage-info.function.ts new file mode 100644 index 00000000..d586c5ed --- /dev/null +++ b/packages/iac-utilities/src/scripts/export-stage-info.function.ts @@ -0,0 +1,34 @@ +import { mkdir, writeFile } from 'node:fs/promises' +import path from 'node:path' + +import { createStageInfo, getBranchInfo, StageInfo } from '@shiftcode/branch-utilities' + +export interface ExportStageInfoOptions { + destination: string + filename: string + stage?: string +} + +export async function exportStageInfo(options: ExportStageInfoOptions | Promise) { + const opts = await options + + if (!opts.filename.endsWith('.json')) { + throw new Error('name has to end with `.json`') + } + + let info: StageInfo + if (opts.stage) { + info = createStageInfo(opts.stage) + } else { + const { stage, isProd, isPr } = getBranchInfo(process.env) + info = { stage, isProd, isPr } + } + + const infoNice = JSON.stringify(info, undefined, 2) + const destinationPath = path.join(process.cwd(), opts.destination) + await mkdir(destinationPath, { recursive: true }) + const filePath = path.join(destinationPath, opts.filename) + console.info(`writing file to ${filePath}`) + await writeFile(filePath, infoNice, { encoding: 'utf8' }) + return infoNice +} diff --git a/packages/iac-utilities/src/scripts/fetch-client-config.function.ts b/packages/iac-utilities/src/scripts/fetch-client-config.function.ts new file mode 100644 index 00000000..d02f2f16 --- /dev/null +++ b/packages/iac-utilities/src/scripts/fetch-client-config.function.ts @@ -0,0 +1,33 @@ +import { execSync } from 'node:child_process' +import { mkdir, writeFile } from 'node:fs/promises' +import path from 'node:path' + +import { readFromStackOutput } from './script-utils.js' + +export interface FetchClientConfigOptions { + outputs: string + destination: string + key: string + noWrite?: boolean +} + +export async function fetchClientConfig(options: FetchClientConfigOptions | Promise) { + const opts = await options + const clientConfigUrl = await readFromStackOutput(opts.outputs, opts.key) + + const raw = execSync(`curl ${clientConfigUrl}`, { encoding: 'utf8' }).trim() + + const parsed = JSON.parse(raw) + const pretty = JSON.stringify(parsed, undefined, 2) + + if (!opts.noWrite) { + const dirPath = path.join(process.cwd(), opts.destination) + + await mkdir(dirPath, { recursive: true }) + const filePath = path.join(dirPath, 'client-config') + + await writeFile(filePath, pretty, { encoding: 'utf8' }) + } + + return pretty +} diff --git a/packages/iac-utilities/src/scripts/index.ts b/packages/iac-utilities/src/scripts/index.ts new file mode 100644 index 00000000..4ecaaa65 --- /dev/null +++ b/packages/iac-utilities/src/scripts/index.ts @@ -0,0 +1,10 @@ +export * from './aws-env-vars.function.js' +export * from './aws-sso-configure-profiles.function.js' +export * from './credentials-helper.function.js' +export * from './export-base-runtime.function.js' +export * from './export-stack-outputs.function.js' +export * from './export-stage-info.function.js' +export * from './fetch-client-config.function.js' +export * from './invalidated-cf-cache.function.js' +export * from './stage-override-to-pr-base.function.js' +export * from './upload-to-s3.function.js' diff --git a/packages/iac-utilities/src/scripts/invalidated-cf-cache.function.ts b/packages/iac-utilities/src/scripts/invalidated-cf-cache.function.ts new file mode 100644 index 00000000..14d0cb25 --- /dev/null +++ b/packages/iac-utilities/src/scripts/invalidated-cf-cache.function.ts @@ -0,0 +1,63 @@ +import { promisify } from 'node:util' + +import { CloudFrontClient, CreateInvalidationCommand, GetInvalidationCommand } from '@aws-sdk/client-cloudfront' + +import { readFromStackOutput } from './script-utils.js' + +const sleep = promisify(setTimeout) +const client = new CloudFrontClient({}) + +export interface InvalidatedCfCacheOptions { + outputs: string + key: string + wait: boolean + items: string[] +} + +export async function invalidateCfCache(options: InvalidatedCfCacheOptions | Promise) { + const opts = await options + const distributionId = await readFromStackOutput(opts.outputs, opts.key) + + const createInvCmd = new CreateInvalidationCommand({ + DistributionId: distributionId, + InvalidationBatch: { + CallerReference: `ci:invalidate-cf-cache-${Date.now()}`, + Paths: { + Quantity: opts.items.length, + Items: opts.items, + }, + }, + }) + const response = await client.send(createInvCmd) + + if (!response.Invalidation?.Id) { + throw new Error(`Failed creating Invalidation on ${distributionId}`) + } + + if (opts.wait) { + await waitUntilDone(distributionId, response.Invalidation.Id) + return `successfully invalidated the Distribution ${distributionId}` + } else { + return `successfully sent invalidationRequest to Distribution ${distributionId}` + } +} + +async function waitUntilDone(distributionId: string, invalidationId: string, timeout = 1_000): Promise { + await sleep(timeout) + + const getInvCmd = new GetInvalidationCommand({ + DistributionId: distributionId, + Id: invalidationId, + }) + + const response = await client.send(getInvCmd) + + if (!response.Invalidation) { + throw new Error(`Could not get Invalidation ${invalidationId} from Distribution ${distributionId}`) + } + console.log(`Status ${invalidationId}: ${response.Invalidation.Status}`) + + if (response.Invalidation.Status !== 'Completed') { + await waitUntilDone(distributionId, invalidationId, timeout) + } +} diff --git a/packages/iac-utilities/src/scripts/script-utils.ts b/packages/iac-utilities/src/scripts/script-utils.ts new file mode 100644 index 00000000..3fbb5d88 --- /dev/null +++ b/packages/iac-utilities/src/scripts/script-utils.ts @@ -0,0 +1,25 @@ +import { existsSync } from 'node:fs' +import { readFile } from 'node:fs/promises' + +export const colorize = { + important: (txt: string) => `\x1b[44m\x1b[36m${txt}\x1b[0m`, + red: (txt: string) => `\x1b[31m${txt}\x1b[0m`, + green: (txt: string) => `\x1b[32m${txt}\x1b[0m`, +} + +function hasProp(object: T, property: K): object is T & Record { + return typeof object === 'object' && object !== null && property in object +} + +export async function readFromStackOutput(fileName: string, variable: string): Promise { + if (!existsSync(fileName)) { + throw new Error(`stack output json file '${fileName}' does not exist.`) + } + const file = await readFile(fileName, 'utf8') + const parsed: unknown = JSON.parse(file) + + if (hasProp(parsed, variable) && typeof parsed[variable] === 'string') { + return parsed[variable] + } + throw new Error(`invalid stack output json file '${fileName}': could not read '${variable}'`) +} diff --git a/packages/iac-utilities/src/scripts/stage-override-to-pr-base.function.ts b/packages/iac-utilities/src/scripts/stage-override-to-pr-base.function.ts new file mode 100644 index 00000000..def7baf5 --- /dev/null +++ b/packages/iac-utilities/src/scripts/stage-override-to-pr-base.function.ts @@ -0,0 +1,18 @@ +import { execSync } from 'node:child_process' + +interface GitHubPr { + headRefName: string +} + +export function stageOverrideToPrBase(): string { + const gitHubPrJson = execSync('gh pr list --json headRefName,title,isDraft,closed', { encoding: 'utf8' }).trim() + const gitHubPrs: GitHubPr[] = JSON.parse(gitHubPrJson) + + const branchNameOverride = process.env['GITHUB_BASE_REF'] + const isPrOverride = !!gitHubPrs.find((pr) => pr.headRefName === branchNameOverride) + + return ` + export SC_OVERRIDE_BRANCH_NAME=${branchNameOverride} + export SC_OVERRIDE_IS_PR=${isPrOverride} + ` +} diff --git a/packages/iac-utilities/src/scripts/upload-to-s3.function.ts b/packages/iac-utilities/src/scripts/upload-to-s3.function.ts new file mode 100644 index 00000000..6e884aa3 --- /dev/null +++ b/packages/iac-utilities/src/scripts/upload-to-s3.function.ts @@ -0,0 +1,169 @@ +import { existsSync } from 'node:fs' +import { readFile } from 'node:fs/promises' + +import { DeleteObjectsCommand, ListObjectsV2Command, PutObjectCommand, S3Client } from '@aws-sdk/client-s3' +import { Ajv, ValidateFunction } from 'ajv' +import glob from 'fast-glob' +import mime from 'mime' + +// keep import so it's copied to the dist folder +// eslint-disable-next-line import/no-internal-modules +import s3DefinitionSchema from '../json-schemas/s3-upload-definition-schema.json' with { type: 'json' } +import { colorize, readFromStackOutput } from './script-utils.js' + +export const S3_UPLOAD_DEFINITION_SCHEMA_NAME = '@shiftcode/iac-utilities/s3-upload-definition-schema.json' + +type S3UploadDefSchemaName = `${string}${typeof S3_UPLOAD_DEFINITION_SCHEMA_NAME}` + +/** + * this type reflects the json schema of {@link ./s3-upload-definition-schema.json} + */ +interface S3UploadDefinitionFile { + $schema: S3UploadDefSchemaName + definitions: S3UploadDefinition[] +} + +interface S3UploadDefinition { + include: string[] + cacheControl: string + contentType?: string +} + +const info: Console['log'] = (...a: any[]) => console.log('publishClientToS3 ::', ...a) + +const client = new S3Client({}) + +export interface UploadToS3Options { + dir: string + outputs: string + key: string + prune: boolean + definitions: string + dry: boolean + verbose: boolean +} + +export async function uploadToS3(options: UploadToS3Options | Promise) { + const opts = await options + const dryMode = opts.dry + const log: Console['log'] = + opts.verbose || opts.dry ? (...a: any[]) => console.log('publishClientToS3 ::', ...a) : () => {} + + if (!existsSync(opts.dir)) { + throw new Error(`sync dir '${opts.dir}' does not exist.`) + } + + const { definitions } = await readDefinitionsFile(opts.definitions) + const s3Bucket = await readFromStackOutput(opts.outputs, opts.key) + + if (dryMode) { + console.debug(colorize.important(`=== DRY MODE ===`)) + } + + if (opts.prune) { + info(`clear 's3://${s3Bucket}'`) + await clearBucket(s3Bucket, undefined, dryMode, log) + } + + info(`upload to 's3://${s3Bucket}'`) + for (const def of definitions) { + await upload(s3Bucket, opts.dir, def, dryMode, log) + } + + return 'DONE' +} + +async function readDefinitionsFile(fileName: string): Promise { + if (!existsSync(fileName)) { + throw new Error(`definitions file '${fileName}' does not exist.`) + } + const file = await readFile(fileName, 'utf8') + const parsed = JSON.parse(file) + + const schemaValidator: ValidateFunction = new Ajv({ allErrors: true }).compile( + s3DefinitionSchema, + ) + const valid = schemaValidator(parsed) + + if (valid) { + return parsed + } + info('invalid definitions file:', schemaValidator.errors) + throw new Error(`Definitions file does not match schema`) +} + +async function clearBucket( + s3Bucket: string, + continuationToken: string | undefined, + dryMode: boolean, + log: Console['log'], + // eslint-disable-next-line @typescript-eslint/naming-convention +): Promise> { + const listResponse = await client.send( + new ListObjectsV2Command({ + Bucket: s3Bucket, + ContinuationToken: continuationToken, + }), + ) + + if (listResponse.Contents) { + // eslint-disable-next-line @typescript-eslint/naming-convention + const deleteObjects = listResponse.Contents.map(({ Key }) => Key) + .filter((key): key is string => !!key) + .map((key) => ({ Key: key })) + + deleteObjects.forEach((o) => { + log(colorize.red(`Delete Object: ${o.Key}`)) + }) + if (!dryMode) { + await client.send(new DeleteObjectsCommand({ Bucket: s3Bucket, Delete: { Objects: deleteObjects } })) + } + + if (listResponse.ContinuationToken) { + const deletedObjects = await clearBucket(s3Bucket, listResponse.ContinuationToken, dryMode, log) + return [...deleteObjects, ...deletedObjects] + } + + return deleteObjects + } + return [] +} + +async function upload( + s3Bucket: string, + dir: string, + definition: S3UploadDefinition, + dryMode: boolean, + log: Console['log'], +): Promise { + const filePart = definition.include.length === 1 ? definition.include[0] : `{${definition.include.join(',')}}` + + const pattern = `${dir}/{**/,}${filePart}` + log(`glob pattern:`, pattern) + const paths = await glob(pattern, { absolute: false }) + + const requests = paths.map(async (path) => { + const key = path.replace(dir, '').replace(/^\//, '') + const contentType = definition.contentType || mime.getType(path) + if (!contentType) { + throw new Error(`could not get mime type of ${path}.`) + } + log(colorize.green(`upload ${path} as '${key}' (${contentType})`)) + if (!dryMode) { + const body = await readFile(path) + await client.send( + new PutObjectCommand({ + Key: key, + Bucket: s3Bucket, + Body: body, + ContentType: contentType, + CacheControl: definition.cacheControl, + }), + ) + } + }) + + await Promise.all(requests) + + return paths +} diff --git a/packages/iac-utilities/src/stage-info.ts b/packages/iac-utilities/src/stage-info.ts new file mode 100644 index 00000000..68d38f57 --- /dev/null +++ b/packages/iac-utilities/src/stage-info.ts @@ -0,0 +1,32 @@ +#!/usr/bin/env node +import { createStageInfo, getBranchInfo } from '@shiftcode/branch-utilities' +import yargs from 'yargs' + +const args = yargs(process.argv) + .option('pretty', { + type: 'boolean', + description: 'pretty print the json output', + default: true, + }) + .option('stage', { + alias: 's', + type: 'string', + description: 'generate the stage-info with provided stage', + }).argv + +interface Options { + pretty: boolean + stage?: string +} + +try { + const options: Options = await args + const originalConsoleLog = console.log + console.log = () => {} // suppress unwanted logs from getBranchInfo + const stageInfo = createStageInfo(options.stage ?? getBranchInfo(process.env).stage) + console.log = originalConsoleLog + console.info(JSON.stringify(stageInfo, undefined, options.pretty ? 2 : 0)) +} catch (err) { + console.error(err) + process.exit(1) +} diff --git a/packages/iac-utilities/src/stage-override-to-pr-base.ts b/packages/iac-utilities/src/stage-override-to-pr-base.ts new file mode 100644 index 00000000..c4174447 --- /dev/null +++ b/packages/iac-utilities/src/stage-override-to-pr-base.ts @@ -0,0 +1,11 @@ +#!/usr/bin/env node + +import { stageOverrideToPrBase } from './scripts/index.js' + +try { + const responseMsg = stageOverrideToPrBase() + console.info(responseMsg) +} catch (err) { + console.error(err) + process.exit(1) +} diff --git a/packages/iac-utilities/src/upload-to-s3.ts b/packages/iac-utilities/src/upload-to-s3.ts new file mode 100644 index 00000000..4a7306aa --- /dev/null +++ b/packages/iac-utilities/src/upload-to-s3.ts @@ -0,0 +1,60 @@ +#!/usr/bin/env node +import yargs from 'yargs' + +import { S3_UPLOAD_DEFINITION_SCHEMA_NAME, uploadToS3 } from './scripts/index.js' + +const DEFAULT_OUTPUT_KEY = 'CFO_S3_BUCKET_CLIENT' + +const args = yargs(process.argv) + .option('dir', { + type: 'string', + description: 'source dir to sync', + default: './dist', + demandOption: true, + }) + .option('definitions', { + alias: 'd', + type: 'string', + description: `the upload definitions json file (one with $schema ${S3_UPLOAD_DEFINITION_SCHEMA_NAME}`, + demandOption: true, + }) + .option('outputs', { + alias: 'o', + type: 'string', + description: `path to the outputs json file. Needs to contain the property defined with the key option (defaults to ${DEFAULT_OUTPUT_KEY})`, + demandOption: true, + }) + .option('key', { + type: 'string', + description: `key to read in the outputs.json file containing the bucket name`, + default: DEFAULT_OUTPUT_KEY, + }) + .option('prune', { + type: 'boolean', + default: true, + description: + 'By default, the bucket will be cleared before uploading files. Set this option to false to disable this behavior', + }) + .option('dry', { + type: 'boolean', + default: false, + description: 'do not delete or upload objects (in dry mode verbose is activated)', + }) + .option('verbose', { + type: 'boolean', + default: false, + description: 'Run with verbose logging', + }) + .example( + 'upload-to-s3 ./dist -d ./s3-upload-definitions.json -o my-stack-outputs.json', + 'upload ./dist folder with given config', + ) + .showHelpOnFail(true).argv + +try { + const responseMsg = await uploadToS3(args) + console.info(responseMsg) +} catch (err) { + console.error(err) + process.exit(1) +} diff --git a/packages/iac-utilities/test/aws-sso-profiles-definition-schema.test.ts b/packages/iac-utilities/test/aws-sso-profiles-definition-schema.test.ts new file mode 100644 index 00000000..46864553 --- /dev/null +++ b/packages/iac-utilities/test/aws-sso-profiles-definition-schema.test.ts @@ -0,0 +1,29 @@ +import { Ajv, ValidateFunction } from 'ajv' +import { beforeEach, describe, expect, test } from 'vitest' + +// eslint-disable-next-line import/no-internal-modules +import awsSssoProfilesSchema from '../src/json-schemas/aws-sso-profiles-definition-schema.json' with { type: 'json' } +import invalidS3UploadDefinition from './invalid-aws-sso-profiles-definition.json' with { type: 'json' } +import validS3UploadDefinition from './valid-aws-sso-profiles-definition.json' with { type: 'json' } + +describe('AWS SSO profiles configuration ', () => { + let schemaValidator: ValidateFunction + + beforeEach(() => { + const a = new Ajv({ allErrors: true }) + schemaValidator = a.compile(awsSssoProfilesSchema) // recompile to reset errors on + }) + + test('no error when correct', () => { + const valid = schemaValidator(validS3UploadDefinition) + expect(schemaValidator.errors).toBe(null) + expect(valid).toBe(true) + }) + + test('has errors when incorrect', () => { + const valid = schemaValidator(invalidS3UploadDefinition) + expect(valid).toBe(false) + expect(schemaValidator.errors).toBeInstanceOf(Array) + expect(schemaValidator.errors?.length).toBe(2) + }) +}) diff --git a/packages/iac-utilities/test/invalid-aws-sso-profiles-definition.json b/packages/iac-utilities/test/invalid-aws-sso-profiles-definition.json new file mode 100644 index 00000000..ca1b3d8d --- /dev/null +++ b/packages/iac-utilities/test/invalid-aws-sso-profiles-definition.json @@ -0,0 +1,17 @@ +{ + "$schema": "json-schemas/aws-sso-profiles-definition-schema.json", + "profileByStage": { + "production": "fl-prod", + "development": "fl-nonProd" + }, + "profiles": { + "unknown": { + "sso_session": "sc-sso", + "sso_account_id": "123456", + "sso_role_name": "AdministratorAccess", + "region": "us-central-0", + "output": "json" + }, + "additional-property": {} + } +} diff --git a/packages/iac-utilities/test/invalid-s3-upload-definition.json b/packages/iac-utilities/test/invalid-s3-upload-definition.json new file mode 100644 index 00000000..c4d3d7bb --- /dev/null +++ b/packages/iac-utilities/test/invalid-s3-upload-definition.json @@ -0,0 +1,12 @@ +{ + "definitions": [ + { + "include": ["*.json"] + }, + { + "include": [], + "cacheControl": "max-age=0, s-maxage=300", + "contentXType": "text/html; charset=utf-8*" + } + ] +} diff --git a/packages/iac-utilities/test/s3-upload-definition-schema.test.ts b/packages/iac-utilities/test/s3-upload-definition-schema.test.ts new file mode 100644 index 00000000..eb0dedac --- /dev/null +++ b/packages/iac-utilities/test/s3-upload-definition-schema.test.ts @@ -0,0 +1,28 @@ +import { Ajv, ValidateFunction } from 'ajv' +import { beforeEach, describe, expect, test } from 'vitest' + +// eslint-disable-next-line import/no-internal-modules +import s3DefinitionSchema from '../src/json-schemas/s3-upload-definition-schema.json' with { type: 'json' } +import invalidS3UploadDefinition from './invalid-s3-upload-definition.json' with { type: 'json' } +import validS3UploadDefinition from './valid-s3-upload-definition.json' with { type: 'json' } + +describe('s3UploadDefinitionSchema', () => { + let schemaValidator: ValidateFunction + + beforeEach(() => { + schemaValidator = new Ajv({ allErrors: true }).compile(s3DefinitionSchema) + }) + + test('no error when correct', () => { + const valid = schemaValidator(validS3UploadDefinition) + expect(schemaValidator.errors).toBe(null) + expect(valid).toBe(true) + }) + + test('has errors when incorrect', () => { + const valid = schemaValidator(invalidS3UploadDefinition) + expect(valid).toBe(false) + expect(schemaValidator.errors).toBeInstanceOf(Array) + expect(schemaValidator.errors?.length).toBe(2) + }) +}) diff --git a/packages/iac-utilities/test/valid-aws-sso-profiles-definition.json b/packages/iac-utilities/test/valid-aws-sso-profiles-definition.json new file mode 100644 index 00000000..197028f4 --- /dev/null +++ b/packages/iac-utilities/test/valid-aws-sso-profiles-definition.json @@ -0,0 +1,17 @@ +{ + "$schema": "json-schemas/aws-sso-profiles-definition-schema.json", + "profileByStage": { + "prod": "fl-prod", + "dev": "fl-nonProd" + }, + "profiles": { + "prod": { + "sso_session": "sc-sso", + "sso_account_id": "123456", + "sso_role_name": "AdministratorAccess", + "region": "us-central-0", + "output": "json" + }, + "additional-property": {} + } +} diff --git a/packages/iac-utilities/test/valid-s3-upload-definition.json b/packages/iac-utilities/test/valid-s3-upload-definition.json new file mode 100644 index 00000000..b4797213 --- /dev/null +++ b/packages/iac-utilities/test/valid-s3-upload-definition.json @@ -0,0 +1,32 @@ +{ + "$schema": "json-schemas/s3-upload-definition-schema.json", + "definitions": [ + { + "include": [ + "*.css", + "*.js", + "*.js.map", + "*.woff2", + "*.woff", + "*.ttf", + "*.otf", + "*.svg", + "*.png", + "*.jpeg", + "*.jpg", + "*.ico", + "*.gif" + ], + "cacheControl": "max-age=31536000" + }, + { + "include": ["*.html"], + "cacheControl": "max-age=0, s-maxage=300", + "contentType": "text/html; charset=utf-8*" + }, + { + "include": ["*.json"], + "cacheControl": "max-age=604800" + } + ] +} diff --git a/packages/iac-utilities/tsconfig.json b/packages/iac-utilities/tsconfig.json new file mode 100644 index 00000000..6ae56790 --- /dev/null +++ b/packages/iac-utilities/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "resolveJsonModule": true, + "skipLibCheck": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/iac-utilities/tsconfig.lint.json b/packages/iac-utilities/tsconfig.lint.json new file mode 100644 index 00000000..1386dd51 --- /dev/null +++ b/packages/iac-utilities/tsconfig.lint.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.lint.json", + "compilerOptions": { "baseUrl": "." }, + "include": ["**/*.ts"] +} diff --git a/packages/iac-utilities/tsconfig.spec.json b/packages/iac-utilities/tsconfig.spec.json new file mode 100644 index 00000000..cd684dcb --- /dev/null +++ b/packages/iac-utilities/tsconfig.spec.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.spec.json", + "compilerOptions": { + "baseUrl": "." + }, + "include": ["src/**/*.spec.ts", "test/**/*.ts"] +} diff --git a/packages/iac-utilities/vitest.config.js b/packages/iac-utilities/vitest.config.js new file mode 100644 index 00000000..ec160f83 --- /dev/null +++ b/packages/iac-utilities/vitest.config.js @@ -0,0 +1,3 @@ +import CONFIG from '../../vitest.config.js' + +export default CONFIG diff --git a/packages/inversify-logger/CHANGELOG.md b/packages/inversify-logger/CHANGELOG.md new file mode 100644 index 00000000..cdcf32bb --- /dev/null +++ b/packages/inversify-logger/CHANGELOG.md @@ -0,0 +1,33 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [2.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/logger-inversify@1.1.0...@shiftcode/logger-inversify@2.0.0) (2025-05-19) + +### Features + +- update @shiftcode/logger to version ^3.0.0 and @shiftcode/utilities to version ^4.0.0 ([2e5f2d1](https://github.com/shiftcode/sc-commons/commit/2e5f2d1a78882b8885aacd7bab56b8733a13b7d6)) + +### BREAKING CHANGES + +- requires @shiftcode/logger ^3.0.0, + requires @shiftcode/utilities ^4.0.0 + +# 1.1.0 (2025-05-14) + +### Bug Fixes + +- **build:** update @shiftcode/logger to use caret versioning ([99a86c7](https://github.com/shiftcode/sc-commons/commit/99a86c78d916688964566ed9a116518ebb051e26)) +- **logger-inversify:** remove logger factory due to its support being removed in inversify^7.0.0 ([89cc94b](https://github.com/shiftcode/sc-commons/commit/89cc94b1b660523b6e9b094fddbbb92af7359756)) +- **logger-inversify:** resolve issues related to inversify^7.0.0 update ([720aff0](https://github.com/shiftcode/sc-commons/commit/720aff09dcec5f167934f7d929cde1ce1bb88111)) +- **logger-inversify:** use mock log transport for tests ([20b7841](https://github.com/shiftcode/sc-commons/commit/20b7841b38b71b842beb00cdd590ff7474516bb8)) +- **nest-logger/inversify:** include packages into ci ([a997895](https://github.com/shiftcode/sc-commons/commit/a9978954d28a24fe1393b9f754ea109b5d5e1253)) + +### Features + +- **log-transports:** update ConsoleJsonLogTransport to extend json log transport from base logger ([dd7566d](https://github.com/shiftcode/sc-commons/commit/dd7566dff1a728f7b5dc72d89dd77b2e57defcb1)) +- **logger:** add package to support the usage of inversify for the new logger ([a1967a3](https://github.com/shiftcode/sc-commons/commit/a1967a3308bb7c4078958650839b107adfaae121)) +- **logger:** add package to support the usage of nest for the new logger ([d4798b0](https://github.com/shiftcode/sc-commons/commit/d4798b07422709cd51f1f2ed13ebd20b77232de1)) +- **logger:** move logger to public repo and rename to log transports package ([1eea87c](https://github.com/shiftcode/sc-commons/commit/1eea87c237033bc734a74ad75c3b87f8419c5dec)) +- update @shiftcode/logger to version 1.1.0 ([b196b95](https://github.com/shiftcode/sc-commons/commit/b196b95dbe3757d2b6efd9d5203e21aa82a7891e)) diff --git a/packages/inversify-logger/README.md b/packages/inversify-logger/README.md new file mode 100644 index 00000000..98909b8a --- /dev/null +++ b/packages/inversify-logger/README.md @@ -0,0 +1,50 @@ +# inversify-logger + +> 🎯 Target runtime: es2023 ([Node >= 22](https://node.green/#ES2023)) + +This package provides [@shiftcode/logger](https://github.com/shiftcode/sc-commons/pkgs/npm/logger) support for InversifyJS, +allowing you to inject loggers with context-aware naming, and configure log transports using Inversify DI. + +# 🚀 Features + +- Auto-named logger instances per class +- Supports multiple transports +- Logger service injection for custom logger creation + +# Usage + +## 1. Set up your Inversify container + +```typescript +import { Container } from 'inversify' +import { loggerModule, bindLogTransport } from '@shiftcode/inversify-logger' +import { NodeConsoleLogTransport, NodeConsoleLogTransportConfig } from '@shiftcode/log-transpports' +import { LogLevel, LogTransport } from '@shiftcode/logger' + +const container = new Container() + +const consoleLogTransportConfig: NodeConsoleLogTransportConfig = { logLevel: LogLevel.DEBUG } +// Bind transports (you can bind multiple) +container.bind(LogTransport).toConstantValue(new NodeConsoleLogTransport(consoleLogTransportConfig)) + +//You can use the bindLogTransport helper +bindLogTransport(container, consoleLogTransportConfig, NodeConsoleLogTransport) + +// Load logger module (auto-wires everything) +container.load(loggerModule) +``` + +## 2. Inject the logger + +```typescript +import { injectable, inject } from 'inversify' +import { LoggerService } from '@shiftcode/inversify-logger' + +@injectable() +class MyService { + constructor(@inject(LoggerService) loggerService: LoggerService) { + const logger = this.loggerService.getInstance('CustomService') + logger.debug('Custom-named logger') + } +} +``` diff --git a/packages/publish-helper/eslint.config.mjs b/packages/inversify-logger/eslint.config.js similarity index 100% rename from packages/publish-helper/eslint.config.mjs rename to packages/inversify-logger/eslint.config.js diff --git a/packages/inversify-logger/lint-staged.config.js b/packages/inversify-logger/lint-staged.config.js new file mode 100644 index 00000000..165242df --- /dev/null +++ b/packages/inversify-logger/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['eslint --fix --cache', 'npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/packages/inversify-logger/package.json b/packages/inversify-logger/package.json new file mode 100644 index 00000000..7e722436 --- /dev/null +++ b/packages/inversify-logger/package.json @@ -0,0 +1,49 @@ +{ + "name": "@shiftcode/inversify-logger", + "version": "1.0.0-pr254.4", + "description": "InversifyJS support for the logger package", + "repository": "https://github.com/shiftcode/sc-commons-public", + "license": "MIT", + "author": "shiftcode GmbH ", + "sideEffects": false, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./test/*.js": { + "types": "./dist/test/*.d.ts", + "default": "./dist/test/*.js" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "rm -rf ./dist && tsc", + "format": "prettier --write .", + "lint": "eslint --fix --cache .", + "lint:ci": "eslint .", + "prepublish": "node ../publish-helper/dist/prepare-dist.js", + "test": "vitest --cache --run", + "test:ci": "vitest --no-cache --run && tsc -p ./tsconfig.spec.json", + "test:watch": "vitest --cache" + }, + "devDependencies": { + "@shiftcode/logger": "^5.0.0-pr254.7", + "inversify": "^7.0.0", + "reflect-metadata": "^0.2.0" + }, + "peerDependencies": { + "@shiftcode/logger": "^5.0.0 || ^5.0.0-pr254", + "inversify": "^7.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0" + }, + "engines": { + "node": ">=22.10.2" + }, + "publishConfig": { + "directory": "dist" + } +} diff --git a/packages/inversify-logger/src/index.ts b/packages/inversify-logger/src/index.ts new file mode 100644 index 00000000..a84a7b99 --- /dev/null +++ b/packages/inversify-logger/src/index.ts @@ -0,0 +1,3 @@ +export * from './module/logger.module.js' +export * from './services/logger.service.js' +export * from './utils/log-transport-helper.js' diff --git a/packages/inversify-logger/src/module/logger.module.ts b/packages/inversify-logger/src/module/logger.module.ts new file mode 100644 index 00000000..bd1bd3fc --- /dev/null +++ b/packages/inversify-logger/src/module/logger.module.ts @@ -0,0 +1,7 @@ +import { ContainerModule } from 'inversify' + +import { LoggerService } from '../services/logger.service.js' + +export const loggerModule = new ContainerModule((options) => { + options.bind(LoggerService).toSelf().inSingletonScope() +}) diff --git a/packages/inversify-logger/src/services/logger.service.spec.ts b/packages/inversify-logger/src/services/logger.service.spec.ts new file mode 100644 index 00000000..b50334c6 --- /dev/null +++ b/packages/inversify-logger/src/services/logger.service.spec.ts @@ -0,0 +1,40 @@ +import { Logger, LogLevel } from '@shiftcode/logger' +import { Container, inject, injectable } from 'inversify' +import { beforeEach, describe, expect, test } from 'vitest' + +import { MockLogTransport, MockLogTransportConfig } from '../../test/mock-log.transport.js' +import { loggerModule } from '../module/logger.module.js' +import { bindLogTransport } from '../utils/log-transport-helper.js' +import { LoggerService } from './logger.service.js' + +@injectable() +class SimpleService { + logger: Logger + constructor(@inject(LoggerService) public loggerService: LoggerService) { + this.logger = this.loggerService.getInstance('MyCustomService') + } +} + +describe('creates logger via logger service', () => { + let container: Container + + beforeEach(() => { + container = new Container() + + const mockLogTransportConfig: MockLogTransportConfig = { logLevel: LogLevel.DEBUG, mockAttribute: 'test' } + bindLogTransport(container, mockLogTransportConfig, MockLogTransport) + container.loadSync(loggerModule) + + container.bind(SimpleService).toSelf().inSingletonScope() + }) + + test('Logger should use MockLogTransport', () => { + const logger = container.get(SimpleService).logger + expect(logger['loggerTransports'][0] instanceof MockLogTransport).toBeTruthy() + }) + + test('logger instance requested from container has passed name', () => { + const logger = container.get(SimpleService).logger + expect(logger['name']).toBe('MyCustomService') + }) +}) diff --git a/packages/inversify-logger/src/services/logger.service.ts b/packages/inversify-logger/src/services/logger.service.ts new file mode 100644 index 00000000..fbed5c19 --- /dev/null +++ b/packages/inversify-logger/src/services/logger.service.ts @@ -0,0 +1,15 @@ +import { BaseLoggerService, Logger, LogTransport } from '@shiftcode/logger' +import { injectable, multiInject } from 'inversify' + +@injectable() +export class LoggerService { + private baseService: BaseLoggerService + + constructor(@multiInject(LogTransport) logTransports: LogTransport[]) { + this.baseService = new BaseLoggerService(logTransports) + } + + getInstance(name: string, hexColor?: string): Logger { + return this.baseService.getInstance(name, hexColor) + } +} diff --git a/packages/inversify-logger/src/utils/log-transport-helper.spec.ts b/packages/inversify-logger/src/utils/log-transport-helper.spec.ts new file mode 100644 index 00000000..39db367a --- /dev/null +++ b/packages/inversify-logger/src/utils/log-transport-helper.spec.ts @@ -0,0 +1,37 @@ +import { LogLevel, LogTransport } from '@shiftcode/logger' +import { Container } from 'inversify' +import { beforeEach, describe, expect, test } from 'vitest' + +import { MockLogTransport, MockLogTransportConfig } from '../../test/mock-log.transport.js' +import { bindLogTransport } from './log-transport-helper.js' + +describe('bindLogTransport Helper Function', () => { + let container: Container + let transportConfig: MockLogTransportConfig + let transportInstance: MockLogTransport + + beforeEach(() => { + container = new Container() + transportConfig = { logLevel: LogLevel.DEBUG, mockAttribute: 'test' } + bindLogTransport(container, transportConfig, MockLogTransport) + transportInstance = container.get(LogTransport) + }) + + test('should bind and retrieve the transport instance correctly', () => { + expect(transportInstance).toBeInstanceOf(MockLogTransport) + expect(transportInstance['logLevel']).toBe(LogLevel.DEBUG) + }) + + test('should correctly call the transport instance log method', () => { + const timestamp = new Date() + const args = ['Test message'] + transportInstance.log(LogLevel.INFO, 'TestService', '#FF0000', timestamp, args) + expect(transportInstance.logArgs).toEqual({ + level: LogLevel.INFO, + clazzName: 'TestService', + hexColor: '#FF0000', + timestamp, + args: ['Test message'], + }) + }) +}) diff --git a/packages/inversify-logger/src/utils/log-transport-helper.ts b/packages/inversify-logger/src/utils/log-transport-helper.ts new file mode 100644 index 00000000..f7ba65bd --- /dev/null +++ b/packages/inversify-logger/src/utils/log-transport-helper.ts @@ -0,0 +1,21 @@ +import { LogTransport } from '@shiftcode/logger' +import { Container } from 'inversify' + +/** + * A helper function to bind log transports to the container with the provided configuration. + * + * @param container - The Inversify container. + * @param transportConfig - The configuration for the transport. + * @param transportClass - The transport class to bind (e.g., NodeConsoleLogTransport). + */ +export function bindLogTransport( + container: Container, + transportConfig: ConstructorParameters[0], + transportClass: C, +): void { + // Create the transport instance using the provided config + const transportInstance = new transportClass(transportConfig) + + // Bind the transport instance to the container (hardcoded LogTransport as the service identifier) + container.bind(LogTransport).toConstantValue(transportInstance) +} diff --git a/packages/inversify-logger/test/mock-log.transport.ts b/packages/inversify-logger/test/mock-log.transport.ts new file mode 100644 index 00000000..45dbf661 --- /dev/null +++ b/packages/inversify-logger/test/mock-log.transport.ts @@ -0,0 +1,19 @@ +import { LogLevel, LogTransport } from '@shiftcode/logger' + +export interface MockLogTransportConfig { + logLevel: LogLevel + mockAttribute: string +} + +export class MockLogTransport extends LogTransport { + logArgs: any + + constructor(config: MockLogTransportConfig) { + super(config.logLevel) + } + + log(level: LogLevel, clazzName: string, hexColor: string, timestamp: Date, args: any[]) { + // Mock the log method to simply store arguments for testing + this.logArgs = { level, clazzName, hexColor, timestamp, args } + } +} diff --git a/packages/inversify-logger/tsconfig.json b/packages/inversify-logger/tsconfig.json new file mode 100644 index 00000000..8ae2d9f3 --- /dev/null +++ b/packages/inversify-logger/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "strictPropertyInitialization": false, + "experimentalDecorators": true, + "emitDecoratorMetadata": true + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/inversify-logger/tsconfig.lint.json b/packages/inversify-logger/tsconfig.lint.json new file mode 100644 index 00000000..1386dd51 --- /dev/null +++ b/packages/inversify-logger/tsconfig.lint.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.lint.json", + "compilerOptions": { "baseUrl": "." }, + "include": ["**/*.ts"] +} diff --git a/packages/inversify-logger/tsconfig.spec.json b/packages/inversify-logger/tsconfig.spec.json new file mode 100644 index 00000000..a0c9a69c --- /dev/null +++ b/packages/inversify-logger/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.spec.json", + "compilerOptions": { + "baseUrl": ".", + "experimentalDecorators": true, + "emitDecoratorMetadata": true + }, + "include": ["src/**/*.spec.ts", "test/**/*.ts"] +} diff --git a/packages/inversify-logger/vitest.config.js b/packages/inversify-logger/vitest.config.js new file mode 100644 index 00000000..ec160f83 --- /dev/null +++ b/packages/inversify-logger/vitest.config.js @@ -0,0 +1,3 @@ +import CONFIG from '../../vitest.config.js' + +export default CONFIG diff --git a/packages/lambda-utilities/CHANGELOG.md b/packages/lambda-utilities/CHANGELOG.md new file mode 100644 index 00000000..86be1707 --- /dev/null +++ b/packages/lambda-utilities/CHANGELOG.md @@ -0,0 +1,345 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [13.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@12.0.0...@shiftcode/lambda-utils@13.0.0) (2026-01-14) + +### Bug Fixes + +- **lambda-utils:** resolve non-retryable stream error ([72cee2b](https://github.com/shiftcode/sc-commons/commit/72cee2b66aad6afc91bdf93184f76adfec420dd5)) + +### BREAKING CHANGES + +- **lambda-utils:** The return types for the public functions downloadJson / readStream and readStreamDownload now also include undefined + +# [12.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@11.0.1...@shiftcode/lambda-utils@12.0.0) (2025-05-19) + +### Bug Fixes + +- **lambda-utils:** add @shiftcode/logger-inversify as optional peer-dependency ([2a5aca5](https://github.com/shiftcode/sc-commons/commit/2a5aca5413b5857010e1cddd3908de7f7134c35f)) + +### Features + +- **lambda-utils:** replace @shiftcode/lambda-logger with @shiftcode/logger ([40396e9](https://github.com/shiftcode/sc-commons/commit/40396e9526ebd7491f800c059294ef2f2772953c)) +- update @shiftcode/logger to version ^3.0.0 and @shiftcode/utilities to version ^4.0.0 ([2e5f2d1](https://github.com/shiftcode/sc-commons/commit/2e5f2d1a78882b8885aacd7bab56b8733a13b7d6)) + +### BREAKING CHANGES + +- requires @shiftcode/logger ^3.0.0, + requires @shiftcode/utilities ^4.0.0 + +## [11.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@11.0.0...@shiftcode/lambda-utils@11.0.1) (2025-05-15) + +**Note:** Version bump only for package @shiftcode/lambda-utils + +# [11.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@10.3.3...@shiftcode/lambda-utils@11.0.0) (2025-05-01) + +### Bug Fixes + +- **lambda-utils:** replace Logger with injectable token LoggerService ([d3b3f2f](https://github.com/shiftcode/sc-commons/commit/d3b3f2f472d77f02fef3ce7337b47596e719c649)) + +### Features + +- update to inversify^7.0.0 ([c6807d6](https://github.com/shiftcode/sc-commons/commit/c6807d6c21110c820f489020d41c1cbad3a2b2f6)) + +### BREAKING CHANGES + +- requires inversify^7.0.0 as a peer dependency + +## [10.3.3](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@10.3.2...@shiftcode/lambda-utils@10.3.3) (2025-03-06) + +### Bug Fixes + +- update engines definition (left over from node 22 upgrade) ([f5428ae](https://github.com/shiftcode/sc-commons/commit/f5428ae64c45567912887b8bab1e881c4312669f)) +- update version range for reflect-metadata ([9b7b0d1](https://github.com/shiftcode/sc-commons/commit/9b7b0d1056a9f47476e1ddb1ac58335094e2185f)) + +## [10.3.2](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@10.3.1...@shiftcode/lambda-utils@10.3.2) (2025-03-04) + +**Note:** Version bump only for package @shiftcode/lambda-utils + +## [10.3.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@10.3.0...@shiftcode/lambda-utils@10.3.1) (2024-08-02) + +**Note:** Version bump only for package @shiftcode/lambda-utils + +# [10.3.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@10.2.0...@shiftcode/lambda-utils@10.3.0) (2024-07-31) + +### Features + +- move start indication log to lambda-utils ([f88359e](https://github.com/shiftcode/sc-commons/commit/f88359e692fce5aaaee7ebc57d22eb22051a2923)) + +# [10.2.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@10.1.0...@shiftcode/lambda-utils@10.2.0) (2024-07-30) + +### Bug Fixes + +- **airtable-sync:** implement real batching ([62c02cc](https://github.com/shiftcode/sc-commons/commit/62c02cca0b937a181eded643ab29ca9a6e5a389a)) + +### Features + +- **exponential-backoff:** log success only when retried before ([56a9f98](https://github.com/shiftcode/sc-commons/commit/56a9f986b381fba691934cccda7c25aa4d63ba6c)) +- **s3-helper:** add retry with backoff ([63269ff](https://github.com/shiftcode/sc-commons/commit/63269ff0475c941cbd812336db0a8374f9e6450c)) +- **s3-helper:** move execute with backoff to static helper function ([1e449b6](https://github.com/shiftcode/sc-commons/commit/1e449b6b382239fb01dceedcf3a5e3206f02892e)) +- **s3-helper:** undo unnecessary line ([e40726e](https://github.com/shiftcode/sc-commons/commit/e40726e353cc8b9c075dc6657ee0afe7c9046983)) + +# [10.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@10.0.0...@shiftcode/lambda-utils@10.1.0) (2024-07-29) + +### Features + +- **lambda-utils:** added comment about using the method outside of the lambda handler method ([f56e398](https://github.com/shiftcode/sc-commons/commit/f56e398f6b7823666ccfa8ee606015eb18a2b1b6)) +- **lambda-utils:** added helper method to fetch ssm string param via lambda layer ([2b1fb6d](https://github.com/shiftcode/sc-commons/commit/2b1fb6d44050a6e01ed90472455c7d040999b26f)) +- **lambda-utils:** feedback from PR review ([40e31b0](https://github.com/shiftcode/sc-commons/commit/40e31b023e8bc44b40a5cef796bc6af4b14d383c)) + +# [10.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@9.0.3...@shiftcode/lambda-utils@10.0.0) (2024-07-13) + +### Bug Fixes + +- **lambda-utils:** add correct peer dependencies ([4d011db](https://github.com/shiftcode/sc-commons/commit/4d011dbf47434f92f6aba0e40490097de1e12433)) + +### Build System + +- **node:** upgrade to node 20 ([2899d0d](https://github.com/shiftcode/sc-commons/commit/2899d0d41ece080b276e7bf84915d4849da81a29)) + +### BREAKING CHANGES + +- **node:** Minimum required node version is 20.11.1. In general speaking the runtime (Node or Browser) must support all es2023 features. + +## [9.0.3](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@9.0.2...@shiftcode/lambda-utils@9.0.3) (2024-01-25) + +### Bug Fixes + +- **lambda-utils:** collect all chunks when downloading ([1d56ddb](https://github.com/shiftcode/sc-commons/commit/1d56ddb71e17264b1d605dd763b1497b5372c081)) + +## [9.0.2](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@9.0.1...@shiftcode/lambda-utils@9.0.2) (2023-10-18) + +**Note:** Version bump only for package @shiftcode/lambda-utils + +## [9.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@9.0.0...@shiftcode/lambda-utils@9.0.1) (2023-07-27) + +**Note:** Version bump only for package @shiftcode/lambda-utils + +# [9.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@8.1.0...@shiftcode/lambda-utils@9.0.0) (2023-05-15) + +### Code Refactoring + +- **lambda-utils:** remove depreacted functionality ([39dcfd1](https://github.com/shiftcode/sc-commons/commit/39dcfd1e350bb0d2a04b6bf2cabc41f69f3de781)) + +### Features + +- **lambda-utils:** migrate to ESM ([2b034a8](https://github.com/shiftcode/sc-commons/commit/2b034a8eaf5b166000da4551b7f50969cb2c6292)) +- **lambda-utils:** migrate to ESM (different related changes) ([590ee1e](https://github.com/shiftcode/sc-commons/commit/590ee1ef63955d9bc6b2902af2aa3988e31e479e)) +- **s3-helper:** added helper method to work directly with stream when reading file ([e22e279](https://github.com/shiftcode/sc-commons/commit/e22e279a3e9e0025eaf5d31065704861f845ce53)) + +### BREAKING CHANGES + +- **lambda-utils:** sns related functionality was removed with no replacement (didn't add any value) +- **lambda-utils:** only supported in projects using ESM +- **lambda-utils:** only supported in projects using ESM + +# [8.1.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@8.0.0...@shiftcode/lambda-utils@8.1.0) (2023-03-17) + +### Features + +- **eslint-plugin:** introduce tests to verify correct implementation of plugins ([76d5b2f](https://github.com/shiftcode/sc-commons/commit/76d5b2f2bea5a3f4450e7ce43153fc2ddba832c1)) + +# [8.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@7.0.0...@shiftcode/lambda-utils@8.0.0) (2023-03-16) + +### Build System + +- **tsconfig:** build for es2022 target ([c75651b](https://github.com/shiftcode/sc-commons/commit/c75651b2b2ca6338e71b6538616d5b0e9bbb40cc)) + +### Code Refactoring + +- **lambda-utils:** use aws-sdk v3 libs for s3/sns utils ([be7acc3](https://github.com/shiftcode/sc-commons/commit/be7acc3aa592dbba091e54a1894ff957ca2e5834)) + +### BREAKING CHANGES + +- **tsconfig:** requires ES2022 support (node@18) +- **lambda-utils:** requires @aws-sdk/client-sns^3.204.0, @aws-sdk/client-s3^3.204.0 respectively + +# [7.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@6.0.0...@shiftcode/lambda-utils@7.0.0) (2022-01-17) + +### Bug Fixes + +- **exports:** remove service exports from index to make peer dependencies actually optional ([f6c6662](https://github.com/shiftcode/sc-commons/commit/f6c6662c5b19af1061331add6d4718a4deb1ced2)) +- **peerDependencies:** make `@shiftcode/utilities` non-optional ([237d1b8](https://github.com/shiftcode/sc-commons/commit/237d1b80a4a7c10ca643ef6af4109adc6ee2ea18)) + +### BREAKING CHANGES + +- **peerDependencies:** `@shiftcode/utilities` is now required peer dependency +- **exports:** use services with deep imports + +## 6.0.0 (2022-01-11) + +- build(release): next version [skip ci] ([7fb99e3](https://github.com/shiftcode/sc-commons/commit/7fb99e3)) +- build(release): next version [skip ci] ([69f8e36](https://github.com/shiftcode/sc-commons/commit/69f8e36)) +- build(release): next version [skip ci] ([6658958](https://github.com/shiftcode/sc-commons/commit/6658958)) +- build(release): next version [skip_build] ([911da02](https://github.com/shiftcode/sc-commons/commit/911da02)) +- build(release): next version [skip_build] ([199066e](https://github.com/shiftcode/sc-commons/commit/199066e)) +- build(release): next version [skip_build] ([0c839e4](https://github.com/shiftcode/sc-commons/commit/0c839e4)) +- build(release): next version [skip_build] ([2722982](https://github.com/shiftcode/sc-commons/commit/2722982)) +- build(release): next version [skip_build] ([a0e996a](https://github.com/shiftcode/sc-commons/commit/a0e996a)) +- build(release): next version [skip_build] ([8d72402](https://github.com/shiftcode/sc-commons/commit/8d72402)) +- build(release): next version [skip_build] ([7bca45d](https://github.com/shiftcode/sc-commons/commit/7bca45d)) +- build(release): next version [skip_build] ([82c65ba](https://github.com/shiftcode/sc-commons/commit/82c65ba)) +- build(release): next version [skip_build] ([8589cd3](https://github.com/shiftcode/sc-commons/commit/8589cd3)) +- build(release): next version [skip_build] ([aaebf67](https://github.com/shiftcode/sc-commons/commit/aaebf67)) +- build(release): next version [skip_build] ([e38c9a6](https://github.com/shiftcode/sc-commons/commit/e38c9a6)) +- build(release): next version [skip_build] ([9470e94](https://github.com/shiftcode/sc-commons/commit/9470e94)) +- build(release): next version [skip_build] ([7a83884](https://github.com/shiftcode/sc-commons/commit/7a83884)) +- build(release): next version [skip_build] ([0ca65a3](https://github.com/shiftcode/sc-commons/commit/0ca65a3)) +- build(release): next version [skip_build] ([b9614a4](https://github.com/shiftcode/sc-commons/commit/b9614a4)) +- build(release): next version [skip_build] ([1483216](https://github.com/shiftcode/sc-commons/commit/1483216)) +- build(release): next version [skip_build] ([5e2b455](https://github.com/shiftcode/sc-commons/commit/5e2b455)) +- build(release): next version [skip_build] ([7470c7d](https://github.com/shiftcode/sc-commons/commit/7470c7d)) +- build(release): next version [skip_build] ([bf316bd](https://github.com/shiftcode/sc-commons/commit/bf316bd)) +- build(release): next version [skip_workflow] ([04eb9bc](https://github.com/shiftcode/sc-commons/commit/04eb9bc)) +- build(scripts): use rm -rf instead of rimraf ([de45957](https://github.com/shiftcode/sc-commons/commit/de45957)) +- chore(aws-sdk): use same version in all packages ([08ac152](https://github.com/shiftcode/sc-commons/commit/08ac152)) +- chore(deps): update ([ef20963](https://github.com/shiftcode/sc-commons/commit/ef20963)) +- chore(jest.config): fix import of utils ([29cab2c](https://github.com/shiftcode/sc-commons/commit/29cab2c)) +- chore(peer-deps): remove pr version ([ef34bce](https://github.com/shiftcode/sc-commons/commit/ef34bce)) +- refactor(peer-dependencies): use utilities lib from sc-commons-public ([2b3a142](https://github.com/shiftcode/sc-commons/commit/2b3a142)) +- fix(peer-dependencies): correct version ([99aa21e](https://github.com/shiftcode/sc-commons/commit/99aa21e)) +- fix(peer-dependencies): make all optional ([735744a](https://github.com/shiftcode/sc-commons/commit/735744a)) +- fix(peer-dependencies): update versions ([9aac1ed](https://github.com/shiftcode/sc-commons/commit/9aac1ed)) +- feat(deps): update dependencies ([ce9c2d5](https://github.com/shiftcode/sc-commons/commit/ce9c2d5)) + +### BREAKING CHANGE + +- inversify@^6.0.1 required + +## 5.0.0 (2021-12-23) + +- build(release): next version [skip ci] ([d3b33ba](https://github.com/shiftcode/sc-commons/commit/d3b33ba)) +- build(release): next version [skip ci] ([87c30b4](https://github.com/shiftcode/sc-commons/commit/87c30b4)) +- build(release): next version [skip ci] ([16d5995](https://github.com/shiftcode/sc-commons/commit/16d5995)) +- build(release): next version [skip ci] ([d7b6d61](https://github.com/shiftcode/sc-commons/commit/d7b6d61)) +- build(release): next version [skip ci] ([76a41a6](https://github.com/shiftcode/sc-commons/commit/76a41a6)) +- build(release): next version [skip ci] ([44d8085](https://github.com/shiftcode/sc-commons/commit/44d8085)) +- build(release): next version [skip ci] ([4a2a73d](https://github.com/shiftcode/sc-commons/commit/4a2a73d)) +- build(release): next version [skip ci] ([ac3ac7f](https://github.com/shiftcode/sc-commons/commit/ac3ac7f)) +- build(release): next version [skip ci] ([14622a2](https://github.com/shiftcode/sc-commons/commit/14622a2)) +- build(release): next version [skip ci] ([3199b0c](https://github.com/shiftcode/sc-commons/commit/3199b0c)) +- build(release): next version [skip ci] ([652b10b](https://github.com/shiftcode/sc-commons/commit/652b10b)) +- build(release): next version [skip ci] ([78e4b60](https://github.com/shiftcode/sc-commons/commit/78e4b60)) +- build(release): next version [skip ci] ([006c0be](https://github.com/shiftcode/sc-commons/commit/006c0be)) +- build(release): next version [skip ci] ([6285743](https://github.com/shiftcode/sc-commons/commit/6285743)) +- build(release): next version [skip ci] ([2e01006](https://github.com/shiftcode/sc-commons/commit/2e01006)) +- build(release): next version [skip ci] ([f66b3c3](https://github.com/shiftcode/sc-commons/commit/f66b3c3)) +- build(release): next version [skip ci] ([69cc0f4](https://github.com/shiftcode/sc-commons/commit/69cc0f4)) +- build(release): next version [skip ci] ([921f9f0](https://github.com/shiftcode/sc-commons/commit/921f9f0)) +- build(release): next version [skip ci] ([25993ec](https://github.com/shiftcode/sc-commons/commit/25993ec)) +- build(release): next version [skip ci] ([1fed9a1](https://github.com/shiftcode/sc-commons/commit/1fed9a1)) +- build(release): next version [skip ci] ([cd44cac](https://github.com/shiftcode/sc-commons/commit/cd44cac)) +- refactor(\*): replace npm run with yarn ([238adbc](https://github.com/shiftcode/sc-commons/commit/238adbc)) +- refactor(\*): replace yarn run with yarn ([ef0d2f7](https://github.com/shiftcode/sc-commons/commit/ef0d2f7)) +- refactor(\*): unify READMEs title ([b779764](https://github.com/shiftcode/sc-commons/commit/b779764)) +- revert(version): back to pr ([daf8058](https://github.com/shiftcode/sc-commons/commit/daf8058)) +- fix(package.json): author ([67db3f3](https://github.com/shiftcode/sc-commons/commit/67db3f3)) +- fix(package.json): set sideEffects property ([0d119cc](https://github.com/shiftcode/sc-commons/commit/0d119cc)) +- fix(peer-dependencies): depend on pr93 versions ([b36c70b](https://github.com/shiftcode/sc-commons/commit/b36c70b)) +- feat(http-response): add noContent static method ([7b4c822](https://github.com/shiftcode/sc-commons/commit/7b4c822)) +- feat(http-response): add xml static method ([9000b36](https://github.com/shiftcode/sc-commons/commit/9000b36)) +- feat(typescript): use typescript 4.4 and require tslib ^2.3 ([3524ecd](https://github.com/shiftcode/sc-commons/commit/3524ecd)) +- style(prettier): update to 2.5 and prettify ([47be5f1](https://github.com/shiftcode/sc-commons/commit/47be5f1)) +- test(jest): update rename tsconfig.spec and update jest ([30a28ff](https://github.com/shiftcode/sc-commons/commit/30a28ff)) + +### BREAKING CHANGE + +- requires tslib ^2.3 + +## 4.1.0 (2021-11-09) + +- fix(lambda-utils): aws version & linting settings ([80d8a19](https://github.com/shiftcode/sc-commons/commit/80d8a19)) +- fix(lambda-utils): fix dev dependencies version ([e44f76e](https://github.com/shiftcode/sc-commons/commit/e44f76e)) +- feat(lambda-utils): added HttpResponse ([f9b9935](https://github.com/shiftcode/sc-commons/commit/f9b9935)) + +## 4.0.2 (2021-11-08) + +**Note:** Version bump only for package @shiftcode/lambda-utils + +## 4.0.1 (2021-01-22) + +**Note:** Version bump only for package @shiftcode/lambda-utils + +## 4.0.0 (2020-10-06) + +- Merge branch 'master' into #77-reusable-utils ([baa4f26](https://github.com/shiftcode/sc-commons/commit/baa4f26)), closes [#77](https://github.com/shiftcode/sc-commons/issues/77) +- chore(lint-staged): update all configuration files ([ac86637](https://github.com/shiftcode/sc-commons/commit/ac86637)) +- refactor(s3-helper): rename method ([3c2a04c](https://github.com/shiftcode/sc-commons/commit/3c2a04c)) +- fix(s3-helper): uploadDataJson, make upload public ([051e3ca](https://github.com/shiftcode/sc-commons/commit/051e3ca)) + +### BREAKING CHANGE + +- - s3Helper method uploadDataJson renamed to uploadJson() + +## 3.0.2 (2020-06-14) + +- fix(lambda-utils): move aws-sdk to peer deps from prod dep ([2d82dfb](https://github.com/shiftcode/sc-commons/commit/2d82dfb)) + +## 3.0.1 (2020-05-19) + +- fix(peerdeps): version of peer deps update ([9dd641d](https://github.com/shiftcode/sc-commons/commit/9dd641d)) + +## 3.0.0 (2020-05-19) + +- feat(typescript): update to typescript 3.9 ([1dc45f5](https://github.com/shiftcode/sc-commons/commit/1dc45f5)) + +### BREAKING CHANGE + +- tslib 2.0.0 required for typescript update + +## 2.0.7 (2020-05-09) + +**Note:** Version bump only for package @shiftcode/lambda-utils + +## 2.0.6 (2020-04-09) + +- style(prettier): prettify all files ([a9552d0](https://github.com/shiftcode/sc-commons/commit/a9552d0)) + +## 2.0.5 (2019-12-04) + +- chore(deps): bumb a few dev dependencies ([16781af](https://github.com/shiftcode/sc-commons/commit/16781af)) + +## 2.0.4 (2019-12-04) + +**Note:** Version bump only for package @shiftcode/lambda-utils + +## 2.0.3 (2019-12-04) + +- chore(ts-config): activate the esModuleInterop flag and refactor imports ([25625df](https://github.com/shiftcode/sc-commons/commit/25625df)) +- build(\*): update tsconfig and doc ([71c35a8](https://github.com/shiftcode/sc-commons/commit/71c35a8)) +- build(tsconfig): remove unnecesarry lib declaration ([9894dc1](https://github.com/shiftcode/sc-commons/commit/9894dc1)) +- build(yarn): migrate to yarn workspace ([8811814](https://github.com/shiftcode/sc-commons/commit/8811814)) + +## 2.0.2 (2019-11-14) + +- fix(lambda-utils): lower aws-sdk dependency ([c3f8862](https://github.com/shiftcode/sc-commons/commit/c3f8862)) + +## [2.0.1](https://github.com/shiftcode/sc-commons/compare/@shiftcode/lambda-utils@2.0.0...@shiftcode/lambda-utils@2.0.1) (2019-11-07) + +**Note:** Version bump only for package @shiftcode/lambda-utils + +# [2.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcoders/lambda-utils@1.1.1...@shiftcoders/lambda-utils@2.0.0) (2019-10-24) + +### Bug Fixes + +- **airtable-sync:** remove super verbose logs ([3754e57](https://github.com/shiftcode/sc-commons/commit/3754e57721ded586543c86df1660bb0f4a92a3a4)) + +### Code Refactoring + +- **airtable:** fix stuff, split into 2 packages ([345f57b](https://github.com/shiftcode/sc-commons/commit/345f57bc86f2cd587b9da1a521cc724b3eb9d6f2)) + +### BREAKING CHANGES + +- **airtable:** - two packages + +## [1.1.1](https://github.com/shiftcode/sc-commons/compare/@shiftcoders/lambda-utils@1.1.0...@shiftcoders/lambda-utils@1.1.1) (2019-10-16) + +**Note:** Version bump only for package @shiftcoders/lambda-utils + +# 1.1.0 (2019-10-11) + +### Features + +- **lambda-utils:** new package with utils for lambdas ([c0b3d6a](https://github.com/shiftcode/sc-commons/commit/c0b3d6a13397da988113c5f64a80510625db1e73)) diff --git a/packages/lambda-utilities/README.md b/packages/lambda-utilities/README.md new file mode 100644 index 00000000..adfa5bfb --- /dev/null +++ b/packages/lambda-utilities/README.md @@ -0,0 +1,45 @@ +# lambda-utilities + +> 🎯 Target runtime: es2023 ([Node >= 22](https://node.green/#ES2023)) + +This package contains utilities for AWS Lambda functions. + +## Exports + +### Main Export + +Import from `@shiftcode/lambda-utilities` + +- **HttpResponse** - Response builder for API Gateway Lambda functions +- **isAwsLambdaEnv** - Detect if running in AWS Lambda environment + +**Required peer dependencies:** + +- `@shiftcode/utilities` +- `@types/aws-lambda` + +### Deep Imports + +#### S3 Helper + +Import from `@shiftcode/lambda-utilities/s3` + +- **S3Helper** - Injectable service for S3 operations (list, upload, download) + +**Required peer dependencies:** + +- `@aws-sdk/client-s3` +- `@shiftcode/inversify-logger` +- `@shiftcode/logger` +- `inversify` +- `reflect-metadata` + +#### SSM Parameters + +Import from `@shiftcode/lambda-utilities/ssm` + +- **fetchSsmStringParamValue** - Fetch SSM parameters via Lambda extension layer + +**Required peer dependencies:** + +- `@aws-sdk/client-ssm` diff --git a/packages/utilities/eslint.config.mjs b/packages/lambda-utilities/eslint.config.js similarity index 100% rename from packages/utilities/eslint.config.mjs rename to packages/lambda-utilities/eslint.config.js diff --git a/packages/lambda-utilities/lint-staged.config.js b/packages/lambda-utilities/lint-staged.config.js new file mode 100644 index 00000000..165242df --- /dev/null +++ b/packages/lambda-utilities/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['eslint --fix --cache', 'npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/packages/lambda-utilities/package.json b/packages/lambda-utilities/package.json new file mode 100644 index 00000000..2441436b --- /dev/null +++ b/packages/lambda-utilities/package.json @@ -0,0 +1,81 @@ +{ + "name": "@shiftcode/lambda-utilities", + "version": "1.0.0-pr254.4", + "description": "Utils for lambda functions", + "repository": "https://github.com/shiftcode/sc-commons-public", + "license": "MIT", + "author": "shiftcode GmbH ", + "sideEffects": false, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./s3": { + "types": "./dist/s3/index.d.ts", + "default": "./dist/s3/index.js" + }, + "./ssm": { + "types": "./dist/ssm/index.d.ts", + "default": "./dist/ssm/index.js" + } + }, + "scripts": { + "build": "rm -rf ./dist && tsc", + "format": "prettier --write .", + "lint": "eslint --fix --cache .", + "lint:ci": "eslint .", + "prepublish": "node ../publish-helper/dist/prepare-dist.js", + "test": "vitest --cache --run --passWithNoTests", + "test:ci": "vitest --no-cache --run --passWithNoTests", + "test:watch": "vitest --cache" + }, + "devDependencies": { + "@aws-sdk/client-s3": "^3.204.0", + "@aws-sdk/client-ssm": "^3.204.0", + "@shiftcode/inversify-logger": "^1.0.0-pr254.4", + "@shiftcode/logger": "^5.0.0-pr254.7", + "@shiftcode/utilities": "^5.0.0-pr254.7", + "@types/aws-lambda": "^8.10.89", + "inversify": "^7.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.204.0", + "@aws-sdk/client-ssm": "^3.204.0", + "@shiftcode/inversify-logger": "^1.0.0 || 1.0.0-pr254", + "@shiftcode/logger": "^5.0.0 || ^5.0.0-pr254", + "@shiftcode/utilities": "^5.0.0 || ^5.0.0-pr254", + "@types/aws-lambda": "^8.10.89", + "inversify": "^7.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "tslib": "^2.3.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-s3": { + "optional": true + }, + "@aws-sdk/client-ssm": { + "optional": true + }, + "@shiftcode/inversify-logger": { + "optional": true + }, + "@shiftcode/logger": { + "optional": true + }, + "inversify": { + "optional": true + }, + "reflect-metadata": { + "optional": true + } + }, + "engines": { + "node": ">=22.10.2" + }, + "publishConfig": { + "directory": "dist" + } +} diff --git a/packages/lambda-utilities/src/index.ts b/packages/lambda-utilities/src/index.ts new file mode 100644 index 00000000..65617819 --- /dev/null +++ b/packages/lambda-utilities/src/index.ts @@ -0,0 +1,2 @@ +export * from './lib/http-response.js' +export * from './lib/is-aws-lambda-env.function.js' diff --git a/packages/lambda-utilities/src/lib/http-response.ts b/packages/lambda-utilities/src/lib/http-response.ts new file mode 100644 index 00000000..4ad2b8e4 --- /dev/null +++ b/packages/lambda-utilities/src/lib/http-response.ts @@ -0,0 +1,135 @@ +import { CommonHttpHeader, ContentType, CorsHeader, HttpMethod, HttpStatusCode } from '@shiftcode/utilities' +import type { APIGatewayProxyResult } from 'aws-lambda' + +export class HttpResponse implements APIGatewayProxyResult { + static readonly EMPTY_204 = new HttpResponse('', HttpStatusCode.NO_CONTENT) + + body: string + + /** + * A map of response header keys and their respective values. + */ + headers: Record + + /** + * The HTTP status code of the response (e.g., 200, 404). + */ + statusCode: HttpStatusCode + + isBase64Encoded?: boolean + + static noContent() { + return new HttpResponse('', HttpStatusCode.NO_CONTENT) + } + + static json(data: any, statusCode: HttpStatusCode | number = HttpStatusCode.OK) { + return new HttpResponse(JSON.stringify(data), statusCode).withContentType(ContentType.JSON) + } + + static xml(data: string, statusCode: HttpStatusCode | number = HttpStatusCode.OK) { + return new HttpResponse(data, statusCode).withContentType(ContentType.XML) + } + + static txt(plainText: string, statusCode: HttpStatusCode | number = HttpStatusCode.OK) { + return new HttpResponse(plainText, statusCode).withContentType(ContentType.TXT) + } + + static binary( + buffer: Buffer, + contentType: string | ContentType, + statusCode: HttpStatusCode | number = HttpStatusCode.OK, + ) { + return new HttpResponse(buffer.toString('base64'), statusCode).withBase64EncodedBody().withContentType(contentType) + } + + /** TXT response with code {@link HttpStatusCode.UNAUTHORIZED} */ + static unauthorized(body: string) { + return HttpResponse.txt(body, HttpStatusCode.UNAUTHORIZED) + } + + /** TXT response with default code {@link HttpStatusCode.BAD_REQUEST} */ + static badRequest(body: string) { + return HttpResponse.txt(body, HttpStatusCode.BAD_REQUEST) + } + + /** JSON response with default code {@link HttpStatusCode.INTERNAL_SERVER_ERROR} */ + static serverError(data: any, statusCode = HttpStatusCode.INTERNAL_SERVER_ERROR) { + return HttpResponse.json(data, statusCode) + } + + /** JSON response with default code {@link HttpStatusCode.BAD_REQUEST} */ + static clientError(data: any, statusCode = HttpStatusCode.BAD_REQUEST) { + return HttpResponse.json(data, statusCode) + } + + constructor(body: string, statusCode: HttpStatusCode | number) { + this.body = body + this.statusCode = statusCode + this.headers = {} + } + + addHeader(key: string, val: string): this { + this.headers[key] = val + return this + } + + withCors( + origin = '*', + options?: { + allowCredentials?: boolean + allowedMethods?: HttpMethod[] + allowedHeaders?: string[] + exposeHeaders?: string[] + maxAge?: number + }, + ): this { + this.headers[CorsHeader.ALLOW_ORIGIN] = origin + // if origin isn't static we should ad the vary header + if (origin !== '*') { + this.headers[CommonHttpHeader.VARY] = + this.headers[CommonHttpHeader.VARY]?.concat(` ,${CommonHttpHeader.ORIGIN}`) ?? CommonHttpHeader.ORIGIN + } + + if (options) { + if (options.allowCredentials) { + this.headers[CorsHeader.ALLOW_CREDENTIALS] = options.allowCredentials.toString() + } + // should be present on OPTIONS preflight responses only + if (options.allowedMethods && options.allowedMethods.length !== 0) { + this.headers[CorsHeader.ALLOW_METHODS] = options.allowedMethods.join(', ') + } + if (options.allowedHeaders && options.allowedHeaders.length !== 0) { + this.headers[CorsHeader.ALLOW_HEADERS] = options.allowedHeaders.join(', ') + } + if (options.exposeHeaders && options.exposeHeaders.length !== 0) { + this.headers[CorsHeader.EXPOSE_HEADERS] = options.exposeHeaders.join(', ') + } + if (options.maxAge !== undefined) { + this.headers[CorsHeader.MAX_AGE] = options.maxAge.toString(10) + } + } + return this + } + + withContentType(type: string | ContentType): this { + this.headers[CommonHttpHeader.CONTENT_TYPE] = type + return this + } + + // not complete see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control + withCacheControl( + maxAge: number, + sMaxAge: number, + cacheability: Array<'public' | 'private' | 'no-store'> = [], + rules: Array<'must-revalidate' | 'proxy-revalidate' | 'immutable'> = [], + ): this { + const headerStrings = [`max-age=${maxAge}`, `s-maxage=${sMaxAge}`, ...cacheability, ...rules] + this.headers[CommonHttpHeader.CACHE_CONTROL] = headerStrings.join(', ') + return this + } + + withBase64EncodedBody(): this { + this.isBase64Encoded = true + return this + } +} diff --git a/packages/lambda-utilities/src/lib/is-aws-lambda-env.function.ts b/packages/lambda-utilities/src/lib/is-aws-lambda-env.function.ts new file mode 100644 index 00000000..f2e00107 --- /dev/null +++ b/packages/lambda-utilities/src/lib/is-aws-lambda-env.function.ts @@ -0,0 +1,5 @@ +export function isAwsLambdaEnv(): boolean { + // aws sets the AWS_EXECUTION_ENV so does the serverless framework - + // to detect local invocations SLS additionally sets IS_LOCAL env var + return process && !!process.env['AWS_EXECUTION_ENV'] && !process.env['IS_LOCAL'] +} diff --git a/packages/lambda-utilities/src/s3/index.ts b/packages/lambda-utilities/src/s3/index.ts new file mode 100644 index 00000000..5ffd0e46 --- /dev/null +++ b/packages/lambda-utilities/src/s3/index.ts @@ -0,0 +1 @@ +export * from './s3-helper.service.js' diff --git a/packages/lambda-utilities/src/s3/s3-helper.service.ts b/packages/lambda-utilities/src/s3/s3-helper.service.ts new file mode 100644 index 00000000..d769bb09 --- /dev/null +++ b/packages/lambda-utilities/src/s3/s3-helper.service.ts @@ -0,0 +1,155 @@ +import { get } from 'node:https' +import { Readable, Stream } from 'node:stream' + +import { + _Object as S3Object, + GetObjectCommand, + GetObjectCommandOutput, + ListObjectsV2CommandInput, + paginateListObjectsV2, + PutObjectCommand, + PutObjectCommandInput, + PutObjectCommandOutput, + S3Client, +} from '@aws-sdk/client-s3' +import { LoggerService } from '@shiftcode/inversify-logger' +import { Logger } from '@shiftcode/logger' +import { injectable } from 'inversify' + +@injectable() +export class S3Helper { + private static cacheNeverExpire = 'max-age=31536000' + + private readonly s3Client: S3Client + private bucket: string + private cloudFrontMaxAge: string + private mustRevalidate: string + private logger: Logger + + constructor(loggerService: LoggerService) { + this.logger = loggerService.getInstance('S3Helper') + this.s3Client = new S3Client({}) + } + + init(bucket: string, maxAge = 300) { + this.bucket = bucket + this.mustRevalidate = `max-age=${maxAge}, must-revalidate` + this.cloudFrontMaxAge = `s-maxage=${maxAge}` + } + + async listAll(prefix: string): Promise> { + this.checkIfInitializedOrThrow() + const startTime = Date.now() + this.logger.debug('starting list all objects on bucket') + + const reqConfig: ListObjectsV2CommandInput = { + Bucket: this.bucket, + Prefix: prefix, + } + const result = new Map() + + const paginator = paginateListObjectsV2({ client: this.s3Client }, reqConfig) + for await (const res of paginator) { + if (res.Contents) { + res.Contents.filter((obj) => !!obj.Key).forEach((obj) => result.set(obj.Key, obj)) + } + } + + const requestDuration = Date.now() - startTime + this.logger.info(`listing all s3 assets took ${requestDuration}ms`) + return result + } + + async downloadJson(key: string): Promise { + const data = await this.readStreamDownload(key) + return (data ? JSON.parse(data) : undefined) + } + + async downloadUrlAndSave( + url: string, + key: string, + contentType: string, + neverExpires = true, + ): Promise { + const result: Buffer = await this.httpsGet(url) + return this.upload(key, result, contentType, neverExpires) + } + + uploadJson(object: any, key: string, neverExpires = false): Promise { + const buffer = Buffer.from(JSON.stringify(object), 'utf-8') + return this.upload(key, buffer, 'application/json', neverExpires) + } + + async readStream(key: string): Promise<[GetObjectCommandOutput['Body'], string | undefined]> { + this.checkIfInitializedOrThrow() + const cmd = new GetObjectCommand({ Bucket: this.bucket, Key: key }) + const res = await this.s3Client.send(cmd) + + return [res.Body, res.ContentEncoding] + } + + async readStreamDownload(key: string): Promise { + this.checkIfInitializedOrThrow() + const [stream, encoding] = await this.readStream(key) + if (!stream) { + return undefined + } + + return stream.transformToString(encoding) + } + + async upload( + key: string, + body: Buffer | Readable, + contentType: string, + neverExpires: boolean, + ): Promise { + this.checkIfInitializedOrThrow() + + const commandInput: PutObjectCommandInput = { + Bucket: this.bucket, + Key: key, + Body: body, + ContentType: contentType, + CacheControl: neverExpires ? S3Helper.cacheNeverExpire : `${this.mustRevalidate}, ${this.cloudFrontMaxAge}`, + } + + /* + * must be provided if the size of the body cannot be determined automatically, namely for streams: + * https://docs.aws.amazon.com/codeguru/detector-library/java/s3-object-metadata-content-length-check/ + * If you run into problems with streams. Consider using SdkStream `@smithy/util-stream` (sdkStreamMixin). + */ + if (body instanceof Stream) { + commandInput.ContentLength = body.readableLength + } + + try { + this.logger.info(`Start uploading to s3: ${key}`) + const response = await this.s3Client.send(new PutObjectCommand(commandInput)) + this.logger.info(`Successfully uploaded to s3: ${key}`) + return response + } catch (err) { + this.logger.error(`Failed uploading to s3: ${key}`, err) + throw err + } + } + + private httpsGet(url: string): Promise { + this.logger.info(`download GET: ${url}`) + + return new Promise((resolve, reject) => { + const chunks: Buffer[] = [] + get(url, (res) => { + res.on('data', (chunk) => chunks.push(chunk)) + res.once('end', () => resolve(Buffer.concat(chunks))) + res.once('error', reject) + }) + }) + } + + private checkIfInitializedOrThrow() { + if (!this.bucket) { + throw new Error(`S3Helper was not initialized. First call "s3Helper.init('MyBucketName')" `) + } + } +} diff --git a/packages/lambda-utilities/src/ssm/fetch-ssm-string-param-value.function.ts b/packages/lambda-utilities/src/ssm/fetch-ssm-string-param-value.function.ts new file mode 100644 index 00000000..7a318cab --- /dev/null +++ b/packages/lambda-utilities/src/ssm/fetch-ssm-string-param-value.function.ts @@ -0,0 +1,46 @@ +import process from 'node:process' + +import { GetParameterResult } from '@aws-sdk/client-ssm' + +/** + * Fetches a ssm String/SecureString parameter through the lambda layer. See https://docs.aws.amazon.com/systems-manager/latest/userguide/ps-integration-lambda-extensions.html for more information on how to setup/configure the lambda layer. + * + * ATTENTION: Do NOT call this method outside (before) the handler method in lambda functions as the layer might not be ready to take the request yet. Results are cached, so you do not have to worry about performance. + * + * @param parameterArn ARN of the ssm parameter to fetch + * @param withDecryption Whether to decrypt the parameter (needed for SecureString parameters) + */ +export async function fetchSsmStringParamValue(parameterArn: string, withDecryption: boolean): Promise { + const sessionToken = process.env.AWS_SESSION_TOKEN + const port = process.env.PARAMETERS_SECRETS_EXTENSION_HTTP_PORT + if (!sessionToken || !port) { + throw new Error( + `No session token (AWS_SESSION_TOKEN) or port (PARAMETERS_SECRETS_EXTENSION_HTTP_PORT) found in the environment.`, + ) + } + + const parameterUrl = `http://localhost:${port}/systemsmanager/parameters/get/?name=${encodeURIComponent( + parameterArn, + )}&withDecryption=${withDecryption}` + + try { + const response = await fetch(parameterUrl, { + method: 'GET', + headers: { + 'X-Aws-Parameters-Secrets-Token': sessionToken, + }, + }) + + const result: GetParameterResult = await response.json() + if (!result?.Parameter?.Value) { + throw new Error( + `No value found for ssm parameter ${parameterArn} with local url: ${parameterUrl} via lambda layer.`, + ) + } + return result.Parameter.Value + } catch (e) { + throw new Error(`Error fetching ssm parameter ${parameterArn} with local url ${parameterUrl} via lambda layer.`, { + cause: e, + }) + } +} diff --git a/packages/lambda-utilities/src/ssm/index.ts b/packages/lambda-utilities/src/ssm/index.ts new file mode 100644 index 00000000..55844263 --- /dev/null +++ b/packages/lambda-utilities/src/ssm/index.ts @@ -0,0 +1 @@ +export * from './fetch-ssm-string-param-value.function.js' diff --git a/packages/lambda-utilities/tsconfig.json b/packages/lambda-utilities/tsconfig.json new file mode 100644 index 00000000..ec6695f3 --- /dev/null +++ b/packages/lambda-utilities/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "strictPropertyInitialization": false, + "types": ["node"] + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/lambda-utilities/tsconfig.lint.json b/packages/lambda-utilities/tsconfig.lint.json new file mode 100644 index 00000000..1386dd51 --- /dev/null +++ b/packages/lambda-utilities/tsconfig.lint.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.lint.json", + "compilerOptions": { "baseUrl": "." }, + "include": ["**/*.ts"] +} diff --git a/packages/lambda-utilities/tsconfig.spec.json b/packages/lambda-utilities/tsconfig.spec.json new file mode 100644 index 00000000..a0c9a69c --- /dev/null +++ b/packages/lambda-utilities/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.spec.json", + "compilerOptions": { + "baseUrl": ".", + "experimentalDecorators": true, + "emitDecoratorMetadata": true + }, + "include": ["src/**/*.spec.ts", "test/**/*.ts"] +} diff --git a/packages/lambda-utilities/vitest.config.js b/packages/lambda-utilities/vitest.config.js new file mode 100644 index 00000000..ec160f83 --- /dev/null +++ b/packages/lambda-utilities/vitest.config.js @@ -0,0 +1,3 @@ +import CONFIG from '../../vitest.config.js' + +export default CONFIG diff --git a/packages/logger/.lintstagedrc.yml b/packages/logger/.lintstagedrc.yml deleted file mode 100644 index 4ad7472b..00000000 --- a/packages/logger/.lintstagedrc.yml +++ /dev/null @@ -1,5 +0,0 @@ -'{src,test}/**/*.(t|j)s': - - npm run lint:staged - -'./package.json': - - sort-package-json diff --git a/packages/logger/eslint.config.js b/packages/logger/eslint.config.js new file mode 100644 index 00000000..834468ad --- /dev/null +++ b/packages/logger/eslint.config.js @@ -0,0 +1,5 @@ +import { defineScTsConfig } from '@shiftcode/eslint-config-recommended' + +export default defineScTsConfig({ + languageOptions: { parserOptions: { project: ['./tsconfig.lint.json'] } }, +}) diff --git a/packages/logger/jest.config.js b/packages/logger/jest.config.js deleted file mode 100644 index 7687c577..00000000 --- a/packages/logger/jest.config.js +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-env node,es2023 */ -import { pathsToModuleNameMapper } from 'ts-jest' -import tsConfig from './tsconfig.jest.json' with { type: 'json' } - -export default { - testEnvironment: 'node', - extensionsToTreatAsEsm: ['.ts'], - transform: { - '^.+\\.ts$': ['ts-jest', { tsconfig: 'tsconfig.jest.json', useESM: true }], - }, - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - ...pathsToModuleNameMapper(tsConfig.compilerOptions.paths ?? {}, { prefix: '' }), - }, -} diff --git a/packages/logger/lint-staged.config.js b/packages/logger/lint-staged.config.js new file mode 100644 index 00000000..165242df --- /dev/null +++ b/packages/logger/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['eslint --fix --cache', 'npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/packages/logger/package.json b/packages/logger/package.json index 13cac623..15291d2d 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,16 +1,16 @@ { "name": "@shiftcode/logger", - "version": "4.0.0", + "version": "5.0.0-pr254.7", "description": "logger for local and aws lambda execution", "repository": "https://github.com/shiftcode/sc-commons-public", - "license": "UNLICENSED", + "license": "MIT", "author": "shiftcode GmbH ", "sideEffects": false, "type": "module", "exports": { ".": { - "types": "./dist/public-api.d.ts", - "default": "./dist/public-api.js" + "types": "./dist/index.d.ts", + "default": "./dist/index.js" }, "./node": { "types": "./dist/node/public-api.d.ts", @@ -22,28 +22,23 @@ } }, "scripts": { - "prebuild": "rm -rf ./dist", - "build": "tsc", - "format": "npm run format:base -- --write", - "format:base": "prettier --config ../../.prettierrc.yml '{src,e2e,test}/**/*.ts'", - "format:ci": "npm run format:base -- --check", - "format:staged": "prettier --write --config ../../.prettierrc.yml", - "lint": "eslint --fix --cache ./src ./test", - "lint:ci": "eslint ./src ./test", - "lint:staged": "eslint --fix --cache", + "build": "rm -rf ./dist && tsc", + "format": "prettier --write .", + "lint": "eslint --fix --cache .", + "lint:ci": "eslint .", "prepublish": "node ../publish-helper/dist/prepare-dist.js", - "test": "NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" npx jest --config jest.config.js", - "test:ci": "npm run test", - "test:watch": "npm run test -- --watch" + "test": "vitest --cache --run", + "test:ci": "vitest --no-cache --run && tsc -p ./tsconfig.spec.json", + "test:watch": "vitest --cache" }, "devDependencies": { - "@shiftcode/utilities": "^4.3.1" + "@shiftcode/utilities": "^5.0.0-pr254.7" }, "peerDependencies": { - "@shiftcode/utilities": "^4.0.0" + "@shiftcode/utilities": "^5.0.0 || ^5.0.0-pr254" }, "engines": { - "node": "^22.0.0 || ^24.0.0" + "node": ">=22.10.2" }, "publishConfig": { "directory": "dist" diff --git a/packages/logger/src/console-json-log-transport/console-json-log.transport.spec.ts b/packages/logger/src/console-json-log-transport/console-json-log.transport.spec.ts index e4e16a1e..1bf5d9ad 100644 --- a/packages/logger/src/console-json-log-transport/console-json-log.transport.spec.ts +++ b/packages/logger/src/console-json-log-transport/console-json-log.transport.spec.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, test } from '@jest/globals' +import { afterEach, beforeEach, describe, expect, test } from 'vitest' import { ConsoleMock, mockConsole, restoreConsole } from '../../test/console-mock.function.js' import { LogLevel } from '../model/log-level.enum.js' diff --git a/packages/logger/src/public-api.ts b/packages/logger/src/index.ts similarity index 100% rename from packages/logger/src/public-api.ts rename to packages/logger/src/index.ts diff --git a/packages/logger/src/model/log-transport.spec.ts b/packages/logger/src/model/log-transport.spec.ts index ef827387..0f786d2a 100644 --- a/packages/logger/src/model/log-transport.spec.ts +++ b/packages/logger/src/model/log-transport.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { SpyLogTransport } from '../testing/spy-log.transport.js' import { stringToColor } from '../utils/string-to-color.function.js' import { LogLevel } from './log-level.enum.js' diff --git a/packages/logger/src/model/logger.spec.ts b/packages/logger/src/model/logger.spec.ts index c6843aaa..a60bcbd4 100644 --- a/packages/logger/src/model/logger.spec.ts +++ b/packages/logger/src/model/logger.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { SpyLogTransport } from '../testing/spy-log.transport.js' import { stringToColor } from '../utils/string-to-color.function.js' import { LogLevel } from './log-level.enum.js' @@ -10,7 +12,7 @@ describe('Logger behavior', () => { const className = 'TestLogger' const color = stringToColor(className) - it('should send logs to all transports', () => { + test('should send logs to all transports', () => { spyTransport1 = new SpyLogTransport(LogLevel.DEBUG) spyTransport2 = new SpyLogTransport(LogLevel.INFO) logger = new Logger(className, color, [spyTransport1, spyTransport2]) @@ -19,7 +21,7 @@ describe('Logger behavior', () => { expect(spyTransport2.calls.length).toBe(1) }) - it('should respect log level', () => { + test('should respect log level', () => { spyTransport1 = new SpyLogTransport(LogLevel.DEBUG) spyTransport2 = new SpyLogTransport(LogLevel.INFO) logger = new Logger(className, color, [spyTransport1, spyTransport2]) diff --git a/packages/logger/src/node/create-console-logger.function.spec.ts b/packages/logger/src/node/create-console-logger.function.spec.ts index b36f61c2..703270ca 100644 --- a/packages/logger/src/node/create-console-logger.function.spec.ts +++ b/packages/logger/src/node/create-console-logger.function.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { ConsoleJsonLogTransport } from '../console-json-log-transport/console-json-log.transport.js' import { LogLevel } from '../model/log-level.enum.js' import { Logger } from '../model/logger.js' @@ -5,7 +7,7 @@ import { createConsoleLogger } from './create-console-logger.function.js' import { NodeConsoleLogTransport } from './node-console-log-transport/node-console-log.transport.js' describe('createConsoleLogger', () => { - it('should create logger with NodeConsoleLogTransport when type is "node"', () => { + test('should create logger with NodeConsoleLogTransport when type is "node"', () => { const logger: Logger = createConsoleLogger( 'test-logger', { node: { logLevel: LogLevel.DEBUG }, json: { logLevel: LogLevel.ERROR } }, @@ -18,7 +20,7 @@ describe('createConsoleLogger', () => { expect(logger['loggerTransports'][0]['logLevel']).toBe(LogLevel.DEBUG) }) - it('should create logger with ConsoleJsonLogTransport when type is "json"', () => { + test('should create logger with ConsoleJsonLogTransport when type is "json"', () => { const logger: Logger = createConsoleLogger( 'test-logger', { node: { logLevel: LogLevel.DEBUG }, json: { logLevel: LogLevel.ERROR } }, diff --git a/packages/logger/src/node/node-console-log-transport/node-console-log-transport.spec.ts b/packages/logger/src/node/node-console-log-transport/node-console-log-transport.spec.ts index 39f5e0e9..a1152c99 100644 --- a/packages/logger/src/node/node-console-log-transport/node-console-log-transport.spec.ts +++ b/packages/logger/src/node/node-console-log-transport/node-console-log-transport.spec.ts @@ -1,4 +1,4 @@ -import { afterEach, beforeEach, describe, expect, test } from '@jest/globals' +import { afterEach, beforeEach, describe, expect, test } from 'vitest' import { ConsoleMock, mockConsole, restoreConsole } from '../../../test/console-mock.function.js' import { LogLevel } from '../../model/log-level.enum.js' diff --git a/packages/logger/src/services/base-logger.service.spec.ts b/packages/logger/src/services/base-logger.service.spec.ts index 0985dd65..6621d9ac 100644 --- a/packages/logger/src/services/base-logger.service.spec.ts +++ b/packages/logger/src/services/base-logger.service.spec.ts @@ -1,17 +1,26 @@ +import { pickProps } from '@shiftcode/utilities' +import { describe, expect, test } from 'vitest' + import { LogLevel } from '../model/log-level.enum.js' import { Logger } from '../model/logger.js' import { SpyLogTransport } from '../testing/spy-log.transport.js' import { BaseLoggerService } from './base-logger.service.js' describe('BaseLoggerService with SpyLogTransport', () => { - it('should use the spy log transport', () => { + test('picks the correct properties from the log transport config', () => { + const logTransportConfig = { logLevel: LogLevel.DEBUG, extraProp: 'should be ignored' } + const pickedConfig = pickProps(logTransportConfig, ['logLevel']) + expect(pickedConfig).toEqual({ logLevel: LogLevel.DEBUG }) + }) + + test('should use the spy log transport', () => { const baseLoggerService = new BaseLoggerService([new SpyLogTransport(LogLevel.DEBUG)]) const logger: Logger = baseLoggerService.getInstance('MyLogger', '#abcdef') expect(logger['loggerTransports'][0] instanceof SpyLogTransport).toBeTruthy() expect(logger['loggerTransports'][0]['logLevel']).toBe(LogLevel.DEBUG) }) - it('should have the custom name and color passed to the logger service', () => { + test('should have the custom name and color passed to the logger service', () => { const baseLoggerService = new BaseLoggerService([new SpyLogTransport(LogLevel.DEBUG)]) const logger: Logger = baseLoggerService.getInstance('MyLogger', '#abcdef') expect(logger['name']).toBe('MyLogger') diff --git a/packages/logger/src/testing/spy-log.transport.ts b/packages/logger/src/testing/spy-log.transport.ts index 21a1a984..47cc4e3d 100644 --- a/packages/logger/src/testing/spy-log.transport.ts +++ b/packages/logger/src/testing/spy-log.transport.ts @@ -1,11 +1,11 @@ // eslint-disable-next-line import/no-extraneous-dependencies -import { jest } from '@jest/globals' +import { vi } from 'vitest' import { LogLevel } from '../model/log-level.enum.js' import { LogTransport } from '../model/log-transport.js' export class SpyLogTransport extends LogTransport { - private logMock = jest.fn() + private logMock = vi.fn() constructor(logLevel = LogLevel.INFO) { super(logLevel) diff --git a/packages/logger/src/utils/get-json-stringify-replacer.function.spec.ts b/packages/logger/src/utils/get-json-stringify-replacer.function.spec.ts index 97c8394a..9999db04 100644 --- a/packages/logger/src/utils/get-json-stringify-replacer.function.spec.ts +++ b/packages/logger/src/utils/get-json-stringify-replacer.function.spec.ts @@ -1,16 +1,16 @@ -import { expect } from '@jest/globals' +import { describe, expect, test } from 'vitest' import { getJsonStringifyReplacer } from './get-json-stringify-replacer.function.js' describe('getJsonStringifyReplacer', () => { - it('should handle BigInt values', () => { + test('should handle BigInt values', () => { const replacer = getJsonStringifyReplacer() const result = replacer('key', 123456789123456789n) expect(result).toBe('123456789123456789') }) - it('should format Error instances', () => { + test('should format Error instances', () => { const error = new Error('Test error') const replacer = getJsonStringifyReplacer() const result = replacer('key', error) @@ -24,7 +24,7 @@ describe('getJsonStringifyReplacer', () => { }) }) - it('should handle circular references', () => { + test('should handle circular references', () => { const obj: any = { name: 'test' } // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access obj.self = obj @@ -40,14 +40,14 @@ describe('getJsonStringifyReplacer', () => { expect(secondResult).toBe('') }) - it('should not alter null values', () => { + test('should not alter null values', () => { const replacer = getJsonStringifyReplacer() const result = replacer('key', null) expect(result).toBe(null) }) - it('should not alter primitive values', () => { + test('should not alter primitive values', () => { const replacer = getJsonStringifyReplacer() expect(replacer('key', 'string')).toBe('string') @@ -56,14 +56,14 @@ describe('getJsonStringifyReplacer', () => { expect(replacer('key', undefined)).toBe(undefined) }) - it('should not alter simple arrays', () => { + test('should not alter simple arrays', () => { const arr = [1, 2, 3] const replacer = getJsonStringifyReplacer() const result = replacer('arr', arr) expect(result).toBe(arr) }) - it('should apply custom replacer', () => { + test('should apply custom replacer', () => { const customReplacer = (key: string, value: unknown) => { if (key === 'secret') { return '***' @@ -76,7 +76,7 @@ describe('getJsonStringifyReplacer', () => { expect(replacer('secret', 'password123')).toBe('***') }) - it('should use custom replacer prior handling BigInt values', () => { + test('should use custom replacer prior handling BigInt values', () => { const doubleBigInts = (key: string, value: unknown) => { if (typeof value === 'bigint') { return value * 2n @@ -89,7 +89,7 @@ describe('getJsonStringifyReplacer', () => { expect(result).toBe('100') }) - it('should use custom replacer prior handling Error instances', () => { + test('should use custom replacer prior handling Error instances', () => { const wrapErrors = (key: string, value: unknown) => { if (value instanceof Error) { return new Error('Failed', { cause: value }) @@ -104,7 +104,7 @@ describe('getJsonStringifyReplacer', () => { expect(result).toHaveProperty('cause', expect.objectContaining({ message: 'Original error' })) }) - it('should work with JSON.stringify', () => { + test('should work with JSON.stringify', () => { const obj: any = { name: 'test', symbol: Symbol('test'), diff --git a/packages/logger/src/utils/json-log-object-data.spec.ts b/packages/logger/src/utils/json-log-object-data.spec.ts index 6f4073b1..77ff613f 100644 --- a/packages/logger/src/utils/json-log-object-data.spec.ts +++ b/packages/logger/src/utils/json-log-object-data.spec.ts @@ -1,10 +1,10 @@ -import { expect } from '@jest/globals' +import { describe, expect, test } from 'vitest' import { LogLevel } from '../model/log-level.enum.js' import { createJsonLogObjectData } from './create-json-log-object-data.function.js' describe('createJsonLogObjectData', () => { - it('should create a log object with a message', () => { + test('should create a log object with a message', () => { const result = createJsonLogObjectData(LogLevel.INFO, 'MyClass', new Date('2023-01-01T00:00:00.000Z'), [ 'Test message', ]) @@ -17,7 +17,7 @@ describe('createJsonLogObjectData', () => { }) }) - it('should create a log object with an error', () => { + test('should create a log object with an error', () => { const error = new Error('Test error') error.name = 'TestError' @@ -32,13 +32,13 @@ describe('createJsonLogObjectData', () => { name: 'TestError', message: 'Test error', cause: undefined, - location: expect.stringContaining('json-log-object-data.spec.ts'), + location: expect.any(String), stack: expect.stringContaining(error.name), }, }) }) - it('should create a log object with an message and an error', () => { + test('should create a log object with an message and an error', () => { const error = new Error('Test error') error.name = 'TestError' @@ -56,13 +56,13 @@ describe('createJsonLogObjectData', () => { name: 'TestError', message: 'Test error', cause: undefined, - location: expect.stringContaining('json-log-object-data.spec.ts'), + location: expect.any(String), stack: expect.stringContaining(error.name), }, }) }) - it('should handle additional data', () => { + test('should handle additional data', () => { const result = createJsonLogObjectData(LogLevel.DEBUG, 'MyClass', new Date('2023-01-01T00:00:00.000Z'), [ 'Test message', { key: 'value' }, diff --git a/packages/logger/src/utils/push-to-ring-buffer.function.spec.ts b/packages/logger/src/utils/push-to-ring-buffer.function.spec.ts index 946041d7..1b94d279 100644 --- a/packages/logger/src/utils/push-to-ring-buffer.function.spec.ts +++ b/packages/logger/src/utils/push-to-ring-buffer.function.spec.ts @@ -1,9 +1,9 @@ -import { describe, expect } from '@jest/globals' +import { describe, expect, test } from 'vitest' import { pushToRingBuffer } from './push-to-ring-buffer.function.js' describe('pushToRingBuffer', () => { - it('should push items to the buffer and maintain max size', () => { + test('should push items to the buffer and maintain max size', () => { const buffer: number[] = [] const maxSize = 3 @@ -16,7 +16,7 @@ describe('pushToRingBuffer', () => { expect(buffer).toEqual([2, 3, 4]) }) - it('removes all items that are too many and keeps the tail', () => { + test('removes all items that are too many and keeps the tail', () => { const buffer = [1, 2, 3, 4] const maxSize = 2 @@ -24,13 +24,13 @@ describe('pushToRingBuffer', () => { expect(buffer).toEqual([4, 5]) }) - it('does not throw or fail for negative maxSize but simply clears the buffer', () => { + test('does not throw or fail for negative maxSize but simply clears the buffer', () => { const buffer1: string[] = ['foo'] pushToRingBuffer(buffer1, 'bar', -1) expect(buffer1).toEqual([]) }) - it('does not throw or fail for zero maxSize but simply clears the buffer', () => { + test('does not throw or fail for zero maxSize but simply clears the buffer', () => { const buffer2: string[] = ['foo'] pushToRingBuffer(buffer2, 'bar', 0) expect(buffer2).toEqual([]) diff --git a/packages/logger/test/console-mock.function.ts b/packages/logger/test/console-mock.function.ts index a17f6681..cab1a4f3 100644 --- a/packages/logger/test/console-mock.function.ts +++ b/packages/logger/test/console-mock.function.ts @@ -1,21 +1,21 @@ -import { jest } from '@jest/globals' +import { type Mock, vi } from 'vitest' const originalConsole = { ...console } export interface ConsoleMock { - debug: jest.Mock - info: jest.Mock - warn: jest.Mock - error: jest.Mock - log?: jest.Mock + debug: Mock + info: Mock + warn: Mock + error: Mock + log?: Mock } export function mockConsole() { - console.log = jest.fn() - console.debug = jest.fn() - console.info = jest.fn() - console.warn = jest.fn() - console.error = jest.fn() + console.log = vi.fn() + console.debug = vi.fn() + console.info = vi.fn() + console.warn = vi.fn() + console.error = vi.fn() return (console) } diff --git a/packages/logger/tsconfig.jest.json b/packages/logger/tsconfig.jest.json deleted file mode 100644 index 141e5f51..00000000 --- a/packages/logger/tsconfig.jest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.jest.json", - "compilerOptions": { - "baseUrl": "./", - "paths": { - "@shiftcode/utilities": ["../utilities/src"] - } - }, - "include": ["src/**/*.spec.ts", "test/**/*.ts"] -} diff --git a/packages/logger/tsconfig.json b/packages/logger/tsconfig.json index 86dd6f11..76f4a097 100644 --- a/packages/logger/tsconfig.json +++ b/packages/logger/tsconfig.json @@ -1,10 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "rootDir": "./src", - "baseUrl": "./", - "outDir": "./dist", - "declarationDir": "./dist" + "baseUrl": ".", + "rootDir": "./src" }, "include": ["src/**/*.ts"] } diff --git a/packages/logger/tsconfig.lint.json b/packages/logger/tsconfig.lint.json index 69d6ac11..1386dd51 100644 --- a/packages/logger/tsconfig.lint.json +++ b/packages/logger/tsconfig.lint.json @@ -1,12 +1,5 @@ { - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": "./", - "types": ["jest", "node"], - "paths": { - "@shiftcode/utilities": ["../utilities/src/index.ts"] - } - }, - "include": ["src/**/*.ts", "test/**/*.ts"], - "exclude": [] + "extends": "../../tsconfig.lint.json", + "compilerOptions": { "baseUrl": "." }, + "include": ["**/*.ts"] } diff --git a/packages/logger/tsconfig.spec.json b/packages/logger/tsconfig.spec.json new file mode 100644 index 00000000..cd684dcb --- /dev/null +++ b/packages/logger/tsconfig.spec.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.spec.json", + "compilerOptions": { + "baseUrl": "." + }, + "include": ["src/**/*.spec.ts", "test/**/*.ts"] +} diff --git a/packages/logger/vitest.config.js b/packages/logger/vitest.config.js new file mode 100644 index 00000000..ec160f83 --- /dev/null +++ b/packages/logger/vitest.config.js @@ -0,0 +1,3 @@ +import CONFIG from '../../vitest.config.js' + +export default CONFIG diff --git a/packages/nest-logger/CHANGELOG.md b/packages/nest-logger/CHANGELOG.md new file mode 100644 index 00000000..01d930d7 --- /dev/null +++ b/packages/nest-logger/CHANGELOG.md @@ -0,0 +1,35 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [2.0.0](https://github.com/shiftcode/sc-commons/compare/@shiftcode/logger-nest@1.1.0...@shiftcode/logger-nest@2.0.0) (2025-05-19) + +### Features + +- update @shiftcode/logger to version ^3.0.0 and @shiftcode/utilities to version ^4.0.0 ([2e5f2d1](https://github.com/shiftcode/sc-commons/commit/2e5f2d1a78882b8885aacd7bab56b8733a13b7d6)) + +### BREAKING CHANGES + +- requires @shiftcode/logger ^3.0.0, + requires @shiftcode/utilities ^4.0.0 + +# 1.1.0 (2025-05-14) + +### Bug Fixes + +- **build:** update @shiftcode/logger to use caret versioning ([99a86c7](https://github.com/shiftcode/sc-commons/commit/99a86c78d916688964566ed9a116518ebb051e26)) +- **logger-nest/inversify:** include packages into ci ([a997895](https://github.com/shiftcode/sc-commons/commit/a9978954d28a24fe1393b9f754ea109b5d5e1253)) +- **logger-nest:** add test for injected instances ([88d4585](https://github.com/shiftcode/sc-commons/commit/88d4585ab3c012f3e7c736f71ab82565f3c07472)) +- **logger-nest:** define Logger provider scope as transient ([45e8739](https://github.com/shiftcode/sc-commons/commit/45e8739285ee1806dd9dd8caa04cafdc46456c97)) + +### Features + +- **log-transports:** update ConsoleJsonLogTransport to extend json log transport from base logger ([dd7566d](https://github.com/shiftcode/sc-commons/commit/dd7566dff1a728f7b5dc72d89dd77b2e57defcb1)) +- **logger-nest:** change rxjs peer dependency to the lowest necessary ([80f120f](https://github.com/shiftcode/sc-commons/commit/80f120f1f065a7eafd58d1a5c954dd85bcd28733)) +- **logger-nest:** define LoggerModule as global module ([e524465](https://github.com/shiftcode/sc-commons/commit/e524465e729e17eb8f184846bcd6af01e368d3da)) +- **logger-nest:** enhance transport configuration with type safety ([4476cca](https://github.com/shiftcode/sc-commons/commit/4476ccaf0195e7789f7f27856afca7e8ae70b790)) +- **logger-nest:** implemented NestLogger to support providing logger to NestApplication ([ace0501](https://github.com/shiftcode/sc-commons/commit/ace050117b1408d1d755c881b13ed6a7cf647cce)) +- **logger:** add package to support the usage of nest for the new logger ([d4798b0](https://github.com/shiftcode/sc-commons/commit/d4798b07422709cd51f1f2ed13ebd20b77232de1)) +- **logger:** move logger to public repo and rename to log transports package ([1eea87c](https://github.com/shiftcode/sc-commons/commit/1eea87c237033bc734a74ad75c3b87f8419c5dec)) +- update @shiftcode/logger to version 1.1.0 ([b196b95](https://github.com/shiftcode/sc-commons/commit/b196b95dbe3757d2b6efd9d5203e21aa82a7891e)) diff --git a/packages/nest-logger/README.md b/packages/nest-logger/README.md new file mode 100644 index 00000000..c88abc27 --- /dev/null +++ b/packages/nest-logger/README.md @@ -0,0 +1,82 @@ +# nest-logger + +> 🎯 Target runtime: es2023 ([Node >= 20](https://node.green/#ES2023)) + +This package provides [@shiftcode/logger](https://github.com/shiftcode/sc-commons/pkgs/npm/logger) support for NestJS, allowing you to inject loggers with context-aware naming and configure log transports using the NestJS DI system. + +# 🚀 Features + +- Auto-named logger instances per class +- Supports multiple log transports +- Logger service injection for custom logger creation + +# Usage + +## 1. Set up the module + +```typescript +import { Module } from '@nestjs/common' +import { LoggerModule } from '@shiftcode/nest-logger' +import { LogLevel, NodeConsoleLogTransport, NodeConsoleLogTransportConfig } from '@shiftcode/logger' + +@Module({ + imports: [ + // Bind transports (you can bind multiple) + LoggerModule.withTransports([ + { + transportClass: NodeConsoleLogTransport, + config: { logLevel: LogLevel.DEBUG }, + }, + ]), + ], +}) +export class AppModule {} +``` + +## 2. Inject the logger + +**Option A: Directly inject the logger (auto-named)** + +```typescript +import { Injectable, Inject } from '@nestjs/common' +import { Logger } from '@shiftcode/logger' + +@Injectable() +class MyService { + constructor(@Inject(Logger) private logger: Logger) { + this.logger.info('Initialized!') + } +} +``` + +**Option B: Inject the logger service for custom naming** + +```typescript +import { Injectable, Inject } from '@nestjs/common' +import { LoggerService } from '@shiftcode/nest-logger' + +@Injectable() +class MyService { + constructor(@Inject(LoggerService) private loggerService: LoggerService) { + const logger = this.loggerService.getInstance('CustomService') + logger.debug('Custom-named logger') + } +} +``` + +## NestLogger + +**You can also pass a NestLogger to the NestApplication in a bootstrap function** + +```typescript +import { NestFactory } from '@nestjs/core' +import { AppModule } from './app.module' +import { LoggerService } from '@shiftcode/nest-logger' + +async function bootstrap() { + const app = await NestFactory.create(AppModule) + const loggerService = app.get(LoggerService) + app.useLogger(loggerService.getInstanceNest('MyService')) + await app.listen(3000) +} +``` diff --git a/packages/nest-logger/eslint.config.js b/packages/nest-logger/eslint.config.js new file mode 100644 index 00000000..834468ad --- /dev/null +++ b/packages/nest-logger/eslint.config.js @@ -0,0 +1,5 @@ +import { defineScTsConfig } from '@shiftcode/eslint-config-recommended' + +export default defineScTsConfig({ + languageOptions: { parserOptions: { project: ['./tsconfig.lint.json'] } }, +}) diff --git a/packages/nest-logger/lint-staged.config.js b/packages/nest-logger/lint-staged.config.js new file mode 100644 index 00000000..165242df --- /dev/null +++ b/packages/nest-logger/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['eslint --fix --cache', 'npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/packages/nest-logger/package.json b/packages/nest-logger/package.json new file mode 100644 index 00000000..06e63b25 --- /dev/null +++ b/packages/nest-logger/package.json @@ -0,0 +1,51 @@ +{ + "name": "@shiftcode/nest-logger", + "version": "1.0.0-pr254.4", + "description": "NestJS support for the logger package", + "repository": "https://github.com/shiftcode/sc-commons-public", + "license": "MIT", + "author": "shiftcode GmbH ", + "sideEffects": false, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./test/*.js": { + "types": "./dist/test/*.d.ts", + "default": "./dist/test/*.js" + } + }, + "scripts": { + "build": "rm -rf ./dist && tsc", + "format": "prettier --write .", + "lint": "eslint --fix --cache .", + "lint:ci": "eslint .", + "prepublish": "node ../publish-helper/dist/prepare-dist.js", + "test": "vitest --cache --run", + "test:ci": "vitest --no-cache --run && tsc -p ./tsconfig.spec.json", + "test:watch": "vitest --cache" + }, + "devDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/testing": "^11.0.0", + "@shiftcode/logger": "^5.0.0-pr254.7", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@shiftcode/logger": "^5.0.0 || ^5.0.0-pr254", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "engines": { + "node": ">=22.10.2" + }, + "publishConfig": { + "directory": "dist" + } +} diff --git a/packages/nest-logger/src/index.ts b/packages/nest-logger/src/index.ts new file mode 100644 index 00000000..c7fe8e73 --- /dev/null +++ b/packages/nest-logger/src/index.ts @@ -0,0 +1,2 @@ +export * from './module/logger.module.js' +export * from './services/logger.service.js' diff --git a/packages/nest-logger/src/model/nest-logger.ts b/packages/nest-logger/src/model/nest-logger.ts new file mode 100644 index 00000000..64accf1c --- /dev/null +++ b/packages/nest-logger/src/model/nest-logger.ts @@ -0,0 +1,30 @@ +import { LoggerService } from '@nestjs/common' +import { Logger } from '@shiftcode/logger' + +/** + * A custom logger implementation designed to integrate seamlessly with NestJS applications. + * This logger implements the LoggerService interface required by NestApplication. + */ +export class NestLogger implements LoggerService { + constructor(private readonly logger: Logger) {} + + error(message: any, trace?: string) { + this.logger.error([message, trace]) + } + + warn(message: any) { + this.logger.warn([message]) + } + + debug(message: any) { + this.logger.debug([message]) + } + + verbose(message: any) { + this.debug([message]) + } + + log(message: any) { + this.logger.info([message]) + } +} diff --git a/packages/nest-logger/src/module/logger.module.ts b/packages/nest-logger/src/module/logger.module.ts new file mode 100644 index 00000000..3084c9e8 --- /dev/null +++ b/packages/nest-logger/src/module/logger.module.ts @@ -0,0 +1,52 @@ +import { DynamicModule, Global, Module, Provider, Scope, Type } from '@nestjs/common' +import { INQUIRER } from '@nestjs/core' +import { Logger, LogTransport } from '@shiftcode/logger' + +import { LoggerService } from '../services/logger.service.js' + +export type TransportConfig> = { + transportClass: T + config: ConstructorParameters[0] +} + +export type TransportConfigArray>> = { + [K in keyof T]: TransportConfig +} + +@Global() +@Module({ + providers: [ + LoggerService, + { + provide: Logger, + scope: Scope.TRANSIENT, + inject: [LoggerService, INQUIRER], + useFactory: (loggerService: LoggerService, inquirer: string | object | undefined) => { + const injectionPoint = typeof inquirer === 'string' ? inquirer : inquirer?.constructor?.name + return loggerService.getInstance(injectionPoint ?? 'ROOT') + }, + }, + ], + exports: [LoggerService, Logger], +}) +export class LoggerModule { + static withTransports>>(transports: TransportConfigArray): DynamicModule { + const transportProviders: Provider[] = transports.map(({ transportClass, config }) => ({ + provide: transportClass, + useFactory: () => new transportClass(config), + })) + + return { + module: LoggerModule, + providers: [ + ...transportProviders, + { + provide: LogTransport, + useFactory: (...instances: LogTransport[]) => instances, + inject: transports.map(({ transportClass }) => transportClass), + }, + ], + exports: [LogTransport], + } + } +} diff --git a/packages/nest-logger/src/services/logger.service.spec.ts b/packages/nest-logger/src/services/logger.service.spec.ts new file mode 100644 index 00000000..9a64124c --- /dev/null +++ b/packages/nest-logger/src/services/logger.service.spec.ts @@ -0,0 +1,84 @@ +import { Inject, Injectable } from '@nestjs/common' +import { Test, TestingModule } from '@nestjs/testing' +import { Logger, LogLevel } from '@shiftcode/logger' +import { beforeEach, describe, expect, test } from 'vitest' + +import { MockLogTransport } from '../../test/mock-log.transport.js' +import { LoggerModule } from '../module/logger.module.js' +import { LoggerService } from './logger.service.js' + +@Injectable() +class CustomService { + logger: Logger + constructor(@Inject(LoggerService) public loggerService: LoggerService) { + this.logger = this.loggerService.getInstance('MyCustomService') + } +} + +@Injectable() +class SimpleService { + constructor(@Inject(Logger) public logger: Logger) {} +} + +@Injectable() +class OtherSimpleService { + constructor(@Inject(Logger) public logger: Logger) {} +} + +describe('LoggerService with Mock Transport', () => { + let testingModule: TestingModule + + beforeEach(async () => { + testingModule = await Test.createTestingModule({ + imports: [ + LoggerModule.withTransports([ + { + transportClass: MockLogTransport, + config: { logLevel: LogLevel.DEBUG, mockAttribute: 'test' }, + }, + ]), + ], + providers: [CustomService, SimpleService, OtherSimpleService], + }).compile() + }) + + test('should use the mock log transport', () => { + const createdLogger = testingModule.get(CustomService).logger + + expect(createdLogger['loggerTransports'][0]).toBeInstanceOf(MockLogTransport) + // @ts-expect-error + expect(createdLogger['loggerTransports'][0].logLevel).toBe(LogLevel.DEBUG) + + const injectedLogger = testingModule.get(SimpleService).logger + expect(injectedLogger['loggerTransports'][0]).toBeInstanceOf(MockLogTransport) + // @ts-expect-error + expect(injectedLogger['loggerTransports'][0].logLevel).toBe(LogLevel.DEBUG) + }) + + test('should have the custom name passed to the logger service', () => { + const logger = testingModule.get(CustomService).logger + expect(logger['name']).toBe('MyCustomService') + }) + + test('should have the name of the requesting service', () => { + const logger = testingModule.get(SimpleService).logger + expect(logger['name']).toBe('SimpleService') + }) + + test('should use the same LoggerService instance across the application', () => { + const loggerService1 = testingModule.get(LoggerService) + const loggerService2 = testingModule.get(LoggerService) + const loggerService3 = testingModule.get(CustomService).loggerService + expect(loggerService1).toBe(loggerService2) + expect(loggerService1).toBe(loggerService3) + expect(loggerService2).toBe(loggerService3) + }) + + test('should create a new instance for every directly injected logger', () => { + const logger = testingModule.get(OtherSimpleService).logger + expect(logger['name']).toBe('OtherSimpleService') + + const logger2 = testingModule.get(SimpleService).logger + expect(logger !== logger2).toBeTruthy() + }) +}) diff --git a/packages/nest-logger/src/services/logger.service.ts b/packages/nest-logger/src/services/logger.service.ts new file mode 100644 index 00000000..123cbd06 --- /dev/null +++ b/packages/nest-logger/src/services/logger.service.ts @@ -0,0 +1,21 @@ +import { Inject, Injectable } from '@nestjs/common' +import { BaseLoggerService, Logger, LogTransport } from '@shiftcode/logger' + +import { NestLogger } from '../model/nest-logger.js' + +@Injectable() +export class LoggerService { + private baseService: BaseLoggerService + + constructor(@Inject(LogTransport) private logTransports: LogTransport[]) { + this.baseService = new BaseLoggerService(logTransports) + } + + getInstance(name: string, hexColor?: string): Logger { + return this.baseService.getInstance(name, hexColor) + } + + getInstanceNest(name: string, hexColor?: string): NestLogger { + return new NestLogger(this.baseService.getInstance(name, hexColor)) + } +} diff --git a/packages/nest-logger/test/mock-log.transport.ts b/packages/nest-logger/test/mock-log.transport.ts new file mode 100644 index 00000000..45dbf661 --- /dev/null +++ b/packages/nest-logger/test/mock-log.transport.ts @@ -0,0 +1,19 @@ +import { LogLevel, LogTransport } from '@shiftcode/logger' + +export interface MockLogTransportConfig { + logLevel: LogLevel + mockAttribute: string +} + +export class MockLogTransport extends LogTransport { + logArgs: any + + constructor(config: MockLogTransportConfig) { + super(config.logLevel) + } + + log(level: LogLevel, clazzName: string, hexColor: string, timestamp: Date, args: any[]) { + // Mock the log method to simply store arguments for testing + this.logArgs = { level, clazzName, hexColor, timestamp, args } + } +} diff --git a/packages/nest-logger/tsconfig.json b/packages/nest-logger/tsconfig.json new file mode 100644 index 00000000..cae652c8 --- /dev/null +++ b/packages/nest-logger/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "strictPropertyInitialization": false, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/nest-logger/tsconfig.lint.json b/packages/nest-logger/tsconfig.lint.json new file mode 100644 index 00000000..1386dd51 --- /dev/null +++ b/packages/nest-logger/tsconfig.lint.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.lint.json", + "compilerOptions": { "baseUrl": "." }, + "include": ["**/*.ts"] +} diff --git a/packages/nest-logger/tsconfig.spec.json b/packages/nest-logger/tsconfig.spec.json new file mode 100644 index 00000000..a0c9a69c --- /dev/null +++ b/packages/nest-logger/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.spec.json", + "compilerOptions": { + "baseUrl": ".", + "experimentalDecorators": true, + "emitDecoratorMetadata": true + }, + "include": ["src/**/*.spec.ts", "test/**/*.ts"] +} diff --git a/packages/nest-logger/vitest.config.js b/packages/nest-logger/vitest.config.js new file mode 100644 index 00000000..ec160f83 --- /dev/null +++ b/packages/nest-logger/vitest.config.js @@ -0,0 +1,3 @@ +import CONFIG from '../../vitest.config.js' + +export default CONFIG diff --git a/packages/publish-helper/.lintstagedrc.yml b/packages/publish-helper/.lintstagedrc.yml deleted file mode 100644 index 4ad7472b..00000000 --- a/packages/publish-helper/.lintstagedrc.yml +++ /dev/null @@ -1,5 +0,0 @@ -'{src,test}/**/*.(t|j)s': - - npm run lint:staged - -'./package.json': - - sort-package-json diff --git a/packages/publish-helper/eslint.config.js b/packages/publish-helper/eslint.config.js new file mode 100644 index 00000000..4044f404 --- /dev/null +++ b/packages/publish-helper/eslint.config.js @@ -0,0 +1,13 @@ +import { defineScTsConfig } from '@shiftcode/eslint-config-recommended' + +export default defineScTsConfig( + { + languageOptions: { parserOptions: { project: ['./tsconfig.lint.json'] } }, + }, + { + files: ['**/*.ts'], + rules: { + 'no-console': 'off', + }, + }, +) diff --git a/packages/publish-helper/jest.config.js b/packages/publish-helper/jest.config.js deleted file mode 100644 index 1ccdde95..00000000 --- a/packages/publish-helper/jest.config.js +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-env node,es2023 */ -import { pathsToModuleNameMapper } from 'ts-jest' -import tsConfig from './tsconfig.jest.json' with { type: 'json' } - -export default { - testEnvironment: 'node', - extensionsToTreatAsEsm: ['.ts'], - transform: { - '^.+\\.ts$': ['ts-jest', { tsconfig: 'tsconfig.jest.json', useESM: true }], - }, - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - ...pathsToModuleNameMapper(tsConfig.compilerOptions.paths ?? {}), - }, -} diff --git a/packages/publish-helper/lint-staged.config.js b/packages/publish-helper/lint-staged.config.js new file mode 100644 index 00000000..165242df --- /dev/null +++ b/packages/publish-helper/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['eslint --fix --cache', 'npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/packages/publish-helper/package.json b/packages/publish-helper/package.json index c5811b93..1a30948f 100644 --- a/packages/publish-helper/package.json +++ b/packages/publish-helper/package.json @@ -1,6 +1,6 @@ { "name": "@shiftcode/publish-helper", - "version": "5.0.0", + "version": "6.0.0-pr254.7", "description": "scripts for conventional (pre)releases", "repository": "https://github.com/shiftcode/sc-commons-public", "license": "MIT", @@ -11,35 +11,30 @@ "publish-lib": "./dist/publish-lib.js" }, "scripts": { - "prebuild": "rm -rf ./dist", - "build": "tsc", - "format": "npm run format:base -- --write", - "format:base": "prettier --config ../../.prettierrc.yml '{src,e2e,test}/**/*.ts'", - "format:ci": "npm run format:base -- --check", - "format:staged": "prettier --write --config ../../.prettierrc.yml", - "lint": "eslint --fix --cache ./src", - "lint:ci": "eslint ./src", - "lint:staged": "eslint --fix --cache", + "build": "rm -rf ./dist && tsc", + "format": "prettier --write .", + "lint": "eslint --fix --cache .", + "lint:ci": "eslint .", "prepublish": "node ./dist/prepare-dist.js", - "test": "NODE_OPTIONS=\"--experimental-vm-modules --trace-warnings\" npx jest --config jest.config.js --passWithNoTests", - "test:ci": "npm run test", - "test:watch": "npm run test -- --watch" + "test": "vitest --cache --run", + "test:ci": "vitest --no-cache --run && tsc -p ./tsconfig.spec.json", + "test:watch": "vitest --cache" }, "dependencies": { "conventional-changelog-angular": "^8.0.0", "yargs": "^17.7.2" }, "devDependencies": { - "@shiftcode/branch-utilities": "^5.1.1", + "@shiftcode/branch-utilities": "^6.0.0-pr254.7", "@types/yargs": "^17.0.32" }, "peerDependencies": { - "@shiftcode/branch-utilities": "^5.1.1", + "@shiftcode/branch-utilities": "^6.0.0 || ^6.0.0-pr254", "lerna": "^9.0.3", "tslib": "^2.3.0" }, "engines": { - "node": "^20.0.0 || ^22.0.0" + "node": ">=22.10.2" }, "publishConfig": { "directory": "dist" diff --git a/packages/publish-helper/src/helpers.ts b/packages/publish-helper/src/helpers.ts index 92af897c..24bfcfe0 100644 --- a/packages/publish-helper/src/helpers.ts +++ b/packages/publish-helper/src/helpers.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import { execSync } from 'node:child_process' /** diff --git a/packages/publish-helper/src/prepare-dist.spec.ts b/packages/publish-helper/src/prepare-dist.spec.ts index 88eb9f35..69693299 100644 --- a/packages/publish-helper/src/prepare-dist.spec.ts +++ b/packages/publish-helper/src/prepare-dist.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { fixPackageJsonPaths } from './helpers.js' describe('prepare-dist', () => { diff --git a/packages/publish-helper/src/prepare-dist.ts b/packages/publish-helper/src/prepare-dist.ts index ca3da2b7..2017c673 100644 --- a/packages/publish-helper/src/prepare-dist.ts +++ b/packages/publish-helper/src/prepare-dist.ts @@ -1,5 +1,5 @@ #!/usr/bin/env node -/* eslint-disable no-console */ + import fs from 'node:fs' import { dirname, normalize as normalizePath } from 'node:path' import process from 'node:process' diff --git a/packages/publish-helper/src/publish-lib.ts b/packages/publish-helper/src/publish-lib.ts index aec47521..fef6326c 100644 --- a/packages/publish-helper/src/publish-lib.ts +++ b/packages/publish-helper/src/publish-lib.ts @@ -1,5 +1,5 @@ #!/usr/bin/env node -/* eslint-disable no-console */ + import * as process from 'node:process' import { diff --git a/packages/publish-helper/tsconfig.jest.json b/packages/publish-helper/tsconfig.jest.json deleted file mode 100644 index a2a478b1..00000000 --- a/packages/publish-helper/tsconfig.jest.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.jest.json", - "compilerOptions": { - "baseUrl": "./", - "paths": { - "@shiftcode/branch-utilities": ["../branch-utilities/src/index.ts"] - } - }, - "include": ["src/**/*.spec.ts", "test/**/*.ts"] -} diff --git a/packages/publish-helper/tsconfig.json b/packages/publish-helper/tsconfig.json index f861ecdf..7ee9f7bf 100644 --- a/packages/publish-helper/tsconfig.json +++ b/packages/publish-helper/tsconfig.json @@ -1,8 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist", + "baseUrl": ".", "declaration": false, "declarationDir": null, "types": ["node"] diff --git a/packages/publish-helper/tsconfig.lint.json b/packages/publish-helper/tsconfig.lint.json index 27da0e0d..1386dd51 100644 --- a/packages/publish-helper/tsconfig.lint.json +++ b/packages/publish-helper/tsconfig.lint.json @@ -1,12 +1,5 @@ { - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": "./", - "types": ["jest", "node"], - "paths": { - "@shiftcode/branch-utilities": ["../branch-utilities/src/index.ts"] - } - }, - "include": ["src/**/*.ts", "test/**/*.ts"], - "exclude": [] + "extends": "../../tsconfig.lint.json", + "compilerOptions": { "baseUrl": "." }, + "include": ["**/*.ts"] } diff --git a/packages/publish-helper/tsconfig.spec.json b/packages/publish-helper/tsconfig.spec.json new file mode 100644 index 00000000..cd684dcb --- /dev/null +++ b/packages/publish-helper/tsconfig.spec.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.spec.json", + "compilerOptions": { + "baseUrl": "." + }, + "include": ["src/**/*.spec.ts", "test/**/*.ts"] +} diff --git a/packages/publish-helper/vitest.config.js b/packages/publish-helper/vitest.config.js new file mode 100644 index 00000000..ec160f83 --- /dev/null +++ b/packages/publish-helper/vitest.config.js @@ -0,0 +1,3 @@ +import CONFIG from '../../vitest.config.js' + +export default CONFIG diff --git a/packages/utilities/.lintstagedrc.yml b/packages/utilities/.lintstagedrc.yml deleted file mode 100644 index 4ad7472b..00000000 --- a/packages/utilities/.lintstagedrc.yml +++ /dev/null @@ -1,5 +0,0 @@ -'{src,test}/**/*.(t|j)s': - - npm run lint:staged - -'./package.json': - - sort-package-json diff --git a/packages/utilities/eslint.config.js b/packages/utilities/eslint.config.js new file mode 100644 index 00000000..834468ad --- /dev/null +++ b/packages/utilities/eslint.config.js @@ -0,0 +1,5 @@ +import { defineScTsConfig } from '@shiftcode/eslint-config-recommended' + +export default defineScTsConfig({ + languageOptions: { parserOptions: { project: ['./tsconfig.lint.json'] } }, +}) diff --git a/packages/utilities/jest.config.js b/packages/utilities/jest.config.js deleted file mode 100644 index 1ccdde95..00000000 --- a/packages/utilities/jest.config.js +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-env node,es2023 */ -import { pathsToModuleNameMapper } from 'ts-jest' -import tsConfig from './tsconfig.jest.json' with { type: 'json' } - -export default { - testEnvironment: 'node', - extensionsToTreatAsEsm: ['.ts'], - transform: { - '^.+\\.ts$': ['ts-jest', { tsconfig: 'tsconfig.jest.json', useESM: true }], - }, - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - ...pathsToModuleNameMapper(tsConfig.compilerOptions.paths ?? {}), - }, -} diff --git a/packages/utilities/lint-staged.config.js b/packages/utilities/lint-staged.config.js new file mode 100644 index 00000000..165242df --- /dev/null +++ b/packages/utilities/lint-staged.config.js @@ -0,0 +1,10 @@ +/** + * @see https://github.com/lint-staged/lint-staged?tab=readme-ov-file#typescript + * @type { import('lint-staged').Configuration } + */ +const config = { + 'package.json': ['npx sort-package-json'], + '*': ['eslint --fix --cache', 'npx prettier --write --ignore-unknown'], +} + +export default config diff --git a/packages/utilities/package.json b/packages/utilities/package.json index 9cab75a0..f1849070 100644 --- a/packages/utilities/package.json +++ b/packages/utilities/package.json @@ -1,6 +1,6 @@ { "name": "@shiftcode/utilities", - "version": "4.3.1", + "version": "5.0.0-pr254.7", "description": "Contains some utilities", "repository": "https://github.com/shiftcode/sc-commons-public", "license": "MIT", @@ -14,25 +14,20 @@ } }, "scripts": { - "prebuild": "rm -rf ./dist", - "build": "tsc", - "format": "npm run format:base -- --write", - "format:base": "prettier --config ../../.prettierrc.yml '{src,e2e,test}/**/*.ts'", - "format:ci": "npm run format:base -- --check", - "format:staged": "prettier --write --config ../../.prettierrc.yml", - "lint": "eslint --fix --cache ./src", - "lint:ci": "eslint ./src", - "lint:staged": "eslint --fix --cache", + "build": "rm -rf ./dist && tsc", + "format": "prettier --write .", + "lint": "eslint --fix --cache .", + "lint:ci": "eslint .", "prepublish": "node ../publish-helper/dist/prepare-dist.js", - "test": "NODE_OPTIONS=\"--experimental-vm-modules --trace-warnings\" npx jest --config jest.config.js", - "test:ci": "npm run test", - "test:watch": "npm run test -- --watch" + "test": "vitest --cache --run", + "test:ci": "vitest --no-cache --run && tsc -p ./tsconfig.spec.json", + "test:watch": "vitest --cache" }, "peerDependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^20.0.0 || ^22.0.0" + "node": ">=22.10.2" }, "publishConfig": { "directory": "dist" diff --git a/packages/utilities/src/lib/color-utils/hex-to-rgb.function.spec.ts b/packages/utilities/src/lib/color-utils/hex-to-rgb.function.spec.ts index c97190fb..eaa2aeec 100644 --- a/packages/utilities/src/lib/color-utils/hex-to-rgb.function.spec.ts +++ b/packages/utilities/src/lib/color-utils/hex-to-rgb.function.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { hexToRgb } from './hex-to-rgb.function.js' describe('hexToRgb', () => { diff --git a/packages/utilities/src/lib/compare-with/compare-with.spec.ts b/packages/utilities/src/lib/compare-with/compare-with.spec.ts index 64b1a210..956d710c 100644 --- a/packages/utilities/src/lib/compare-with/compare-with.spec.ts +++ b/packages/utilities/src/lib/compare-with/compare-with.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { compareWith } from './compare-with.js' function isGreeting(value: any) { diff --git a/packages/utilities/src/lib/cookie/parse-cookies.function.spec.ts b/packages/utilities/src/lib/cookie/parse-cookies.function.spec.ts index cb736370..c1754e5a 100644 --- a/packages/utilities/src/lib/cookie/parse-cookies.function.spec.ts +++ b/packages/utilities/src/lib/cookie/parse-cookies.function.spec.ts @@ -1,12 +1,14 @@ +import { describe, expect, test } from 'vitest' + import { parseCookies } from './parse-cookies.function.js' describe('parse-cookies', () => { - it('does not fail on empty', () => { + test('does not fail on empty', () => { expect(parseCookies('')).toEqual({}) expect(parseCookies(null)).toEqual({}) expect(parseCookies()).toEqual({}) }) - it('returns key value object of each cookie', () => { + test('returns key value object of each cookie', () => { expect(parseCookies('LANG=DE')).toEqual({ LANG: 'DE' }) expect(parseCookies('LANG=DE;OK=true;')).toEqual({ LANG: 'DE', OK: 'true' }) }) diff --git a/packages/utilities/src/lib/enum/enum.spec.ts b/packages/utilities/src/lib/enum/enum.spec.ts index 0b969c53..9c9add50 100644 --- a/packages/utilities/src/lib/enum/enum.spec.ts +++ b/packages/utilities/src/lib/enum/enum.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { getEnumKeyFromNum, getEnumKeyFromValue, getEnumKeys, getEnumValues, isValueFromEnum } from './enum.js' // string enum with key=val @@ -42,53 +44,53 @@ function assertType(_: T): void { describe('enum helper', () => { describe('getEnumValues', () => { - it('works for number enums', () => { + test('works for number enums', () => { expect(getEnumValues(Num)).toEqual([25, 26, 27]) assertType(getEnumValues(Num)) expect(getEnumValues(Num2)).toEqual([0, 1]) }) - it('works for string enums', () => { + test('works for string enums', () => { expect(getEnumValues(Str)).toEqual(['A', 'B']) assertType(getEnumValues(Str)) expect(getEnumValues(Str2)).toEqual(['200_OK', '400_ERROR']) assertType(getEnumValues(Str2)) }) - it('works for mixed enums', () => { + test('works for mixed enums', () => { expect(getEnumValues(Mix)).toEqual([7, 42, 'C', 'FOO']) assertType>(getEnumValues(Mix)) }) }) describe('getEnumKeys', () => { - it('works for number enums', () => { + test('works for number enums', () => { expect(getEnumKeys(Num)).toEqual(['A', 'B', 'C']) assertType>(getEnumKeys(Num)) expect(getEnumKeys(Num2)).toEqual(['OK', 'NOK']) }) - it('works for string enums', () => { + test('works for string enums', () => { expect(getEnumKeys(Str)).toEqual(['A', 'B']) assertType>(getEnumKeys(Str)) expect(getEnumKeys(Str2)).toEqual(['OK', 'ERROR']) }) - it('works for mixed enums', () => { + test('works for mixed enums', () => { expect(getEnumKeys(Mix)).toEqual(['A', 'B', 'C', 'D']) assertType>(getEnumKeys(Str)) }) }) describe('getEnumKeyFromValue', () => { - it('works for number enums', () => { + test('works for number enums', () => { expect(getEnumKeyFromValue(Num, Num.A)).toEqual('A') expect(getEnumKeyFromValue(Num, 'A')).toEqual(null) expect(getEnumKeyFromValue(Num2, Num2.NOK)).toEqual('NOK') expect(getEnumKeyFromValue(Num2, -1)).toEqual(null) expect(getEnumKeyFromValue(Num2, 'OK')).toEqual(null) }) - it('works for string enums', () => { + test('works for string enums', () => { expect(getEnumKeyFromValue(Str, Str.A)).toEqual('A') expect(getEnumKeyFromValue(Str2, Str2.ERROR)).toEqual('ERROR') expect(getEnumKeyFromValue(Str2, '500_SERVICE_FAIL')).toEqual(null) expect(getEnumKeyFromValue(Str2, 'OK')).toEqual(null) }) - it('works for mixed enums', () => { + test('works for mixed enums', () => { expect(getEnumKeyFromValue(Mix, Mix.B)).toEqual('B') expect(getEnumKeyFromValue(Mix, 'B')).toEqual(null) expect(getEnumKeyFromValue(Mix, Mix.C)).toEqual('C') @@ -97,13 +99,13 @@ describe('enum helper', () => { }) }) describe('getEnumKeyFromNum', () => { - it('works for number enums', () => { + test('works for number enums', () => { expect(getEnumKeyFromNum(Num, Num.A)).toEqual('A') expect(getEnumKeyFromNum(Num2, Num2.OK)).toEqual('OK') }) }) describe('isValueFromEnum', () => { - it('works for StringEnums', () => { + test('works for StringEnums', () => { expect(isValueFromEnum(Str, 'C')).toEqual(false) expect(isValueFromEnum(Str, 'A')).toEqual(true) diff --git a/packages/utilities/src/lib/group-by/group-by.spec.ts b/packages/utilities/src/lib/group-by/group-by.spec.ts index 0b23aa6d..462f801a 100644 --- a/packages/utilities/src/lib/group-by/group-by.spec.ts +++ b/packages/utilities/src/lib/group-by/group-by.spec.ts @@ -1,20 +1,22 @@ +import { describe, expect, test } from 'vitest' + import { groupBy } from './group-by.js' describe('group by', () => { - it('numbers floor', () => { + test('numbers floor', () => { expect(groupBy([3.5, 3.2, 5.1, 5.0, 6], Math.floor)).toEqual({ 3: [3.5, 3.2], 5: [5.1, 5.0], 6: [6], }) }) - it('string length', () => { + test('string length', () => { expect(groupBy(['a', 'cc', 'dd', 'b'], 'length')).toEqual({ 1: ['a', 'b'], 2: ['cc', 'dd'], }) }) - it('objects prop', () => { + test('objects prop', () => { const o1 = { a: true, b: 'ok' } const o2 = { a: false, b: 'nok' } expect(groupBy([o1, o2], 'a')).toEqual({ diff --git a/packages/utilities/src/lib/json-stringify-replacer/json-stringify-replacer.function.spec.ts b/packages/utilities/src/lib/json-stringify-replacer/json-stringify-replacer.function.spec.ts index 46f3e0ca..eb9b124e 100644 --- a/packages/utilities/src/lib/json-stringify-replacer/json-stringify-replacer.function.spec.ts +++ b/packages/utilities/src/lib/json-stringify-replacer/json-stringify-replacer.function.spec.ts @@ -1,13 +1,15 @@ +import { describe, expect, test } from 'vitest' + import { jsonMapSetStringifyReplacer } from './json-stringify-replacer.function.js' describe('jsonMapSetStringifyReplacer', () => { describe('replaces sets', () => { - it('basically works', () => { + test('basically works', () => { const val = new Set(['a', 'b']) expect(jsonMapSetStringifyReplacer('', val)).toEqual({ type: 'scStringifiedSet', values: ['a', 'b'] }) }) - it('works with JSON.stringify', () => { + test('works with JSON.stringify', () => { const val = { propA: ['a', 'b'], propB: new Set(['a', 'b']), @@ -18,12 +20,12 @@ describe('jsonMapSetStringifyReplacer', () => { }) }) describe('replaces maps', () => { - it('basically works', () => { + test('basically works', () => { const val = new Map().set(5, '5') expect(jsonMapSetStringifyReplacer('', val)).toEqual({ type: 'scStringifiedMap', entries: [[5, '5']] }) }) - it('works with JSON.stringify', () => { + test('works with JSON.stringify', () => { const val = { propA: ['5'], propB: new Map().set(5, '5'), diff --git a/packages/utilities/src/lib/map-values-deep/map-values-deep.spec.ts b/packages/utilities/src/lib/map-values-deep/map-values-deep.spec.ts index 0feaa368..d040a4c8 100644 --- a/packages/utilities/src/lib/map-values-deep/map-values-deep.spec.ts +++ b/packages/utilities/src/lib/map-values-deep/map-values-deep.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + /* eslint-disable @typescript-eslint/no-unsafe-return */ import { mapValuesDeep } from './map-values-deep.js' diff --git a/packages/utilities/src/lib/math/clamp.function.spec.ts b/packages/utilities/src/lib/math/clamp.function.spec.ts index 1fa60616..a721f994 100644 --- a/packages/utilities/src/lib/math/clamp.function.spec.ts +++ b/packages/utilities/src/lib/math/clamp.function.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { clamp } from './clamp.function.js' describe('clamp', () => { diff --git a/packages/utilities/src/lib/object/get-value-assert-defined.function.spec.ts b/packages/utilities/src/lib/object/get-value-assert-defined.function.spec.ts index 2874d960..4aba6f9a 100644 --- a/packages/utilities/src/lib/object/get-value-assert-defined.function.spec.ts +++ b/packages/utilities/src/lib/object/get-value-assert-defined.function.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { getValueAssertDefined } from './get-value-assert-defined.function.js' describe('getValueAssertDefined', () => { diff --git a/packages/utilities/src/lib/object/omit-props.function.spec.ts b/packages/utilities/src/lib/object/omit-props.function.spec.ts index c61667de..1817b584 100644 --- a/packages/utilities/src/lib/object/omit-props.function.spec.ts +++ b/packages/utilities/src/lib/object/omit-props.function.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { omitProps } from './omit-props.function.js' describe('omitProps', () => { diff --git a/packages/utilities/src/lib/object/pick-props-assert-defined.function.spec.ts b/packages/utilities/src/lib/object/pick-props-assert-defined.function.spec.ts index 1caa1044..67167a40 100644 --- a/packages/utilities/src/lib/object/pick-props-assert-defined.function.spec.ts +++ b/packages/utilities/src/lib/object/pick-props-assert-defined.function.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { pickPropsAssertDefined } from './pick-props-assert-defined.function.js' describe('pickPropsAssertDefined', () => { diff --git a/packages/utilities/src/lib/object/pick-props.function.spec.ts b/packages/utilities/src/lib/object/pick-props.function.spec.ts index 1f68b9a9..b82d1ddc 100644 --- a/packages/utilities/src/lib/object/pick-props.function.spec.ts +++ b/packages/utilities/src/lib/object/pick-props.function.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { pickProps } from './pick-props.function.js' describe('pickProps', () => { diff --git a/packages/utilities/src/lib/promise/make-deferred.function.spec.ts b/packages/utilities/src/lib/promise/make-deferred.function.spec.ts index 7129b837..2863c450 100644 --- a/packages/utilities/src/lib/promise/make-deferred.function.spec.ts +++ b/packages/utilities/src/lib/promise/make-deferred.function.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { makeDeferred } from './make-deferred.function.js' describe('makeDeferred', () => { diff --git a/packages/utilities/src/lib/string/capitalize.function.spec.ts b/packages/utilities/src/lib/string/capitalize.function.spec.ts index 0903e835..65289e93 100644 --- a/packages/utilities/src/lib/string/capitalize.function.spec.ts +++ b/packages/utilities/src/lib/string/capitalize.function.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { capitalize } from './capitalize.function.js' describe('capitalize', () => { diff --git a/packages/utilities/src/lib/string/words.spec.ts b/packages/utilities/src/lib/string/words.spec.ts index fa8a087c..b7468d41 100644 --- a/packages/utilities/src/lib/string/words.spec.ts +++ b/packages/utilities/src/lib/string/words.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { words } from './words.js' const emojiVar = '\ufe0f', diff --git a/packages/utilities/src/lib/ts-guards/is-array.spec.ts b/packages/utilities/src/lib/ts-guards/is-array.spec.ts index 02e36b1f..5e2c4926 100644 --- a/packages/utilities/src/lib/ts-guards/is-array.spec.ts +++ b/packages/utilities/src/lib/ts-guards/is-array.spec.ts @@ -1,7 +1,9 @@ +import { describe, expect, test } from 'vitest' + import { isArray } from './is-array.js' describe('isArray', () => { - it('should return true for array values', () => { + test('should return true for array values', () => { expect(isArray([])).toBe(true) expect(isArray([1, 2, 3])).toBe(true) expect(isArray(['a', 'b', 'c'])).toBe(true) @@ -10,7 +12,7 @@ describe('isArray', () => { expect(isArray(new Array())).toBe(true) }) - it('should return false for non-array values', () => { + test('should return false for non-array values', () => { expect(isArray('array')).toBe(false) expect(isArray(123)).toBe(false) expect(isArray(true)).toBe(false) diff --git a/packages/utilities/src/lib/ts-guards/is-boolean.spec.ts b/packages/utilities/src/lib/ts-guards/is-boolean.spec.ts index 520d1f6a..746b71bf 100644 --- a/packages/utilities/src/lib/ts-guards/is-boolean.spec.ts +++ b/packages/utilities/src/lib/ts-guards/is-boolean.spec.ts @@ -1,12 +1,14 @@ +import { describe, expect, test } from 'vitest' + import { isBoolean } from './is-boolean.js' describe('isBoolean', () => { - it('should return true for boolean values', () => { + test('should return true for boolean values', () => { expect(isBoolean(true)).toBe(true) expect(isBoolean(false)).toBe(true) }) - it('should return false for non-boolean values', () => { + test('should return false for non-boolean values', () => { expect(isBoolean(1)).toBe(false) expect(isBoolean(0)).toBe(false) expect(isBoolean('true')).toBe(false) diff --git a/packages/utilities/src/lib/ts-guards/is-class.spec.ts b/packages/utilities/src/lib/ts-guards/is-class.spec.ts index 93356e05..21a1347d 100644 --- a/packages/utilities/src/lib/ts-guards/is-class.spec.ts +++ b/packages/utilities/src/lib/ts-guards/is-class.spec.ts @@ -1,3 +1,5 @@ +import { describe, expect, test } from 'vitest' + import { isClass } from './is-class.js' class TestClass { @@ -7,11 +9,11 @@ class TestClass { } describe('isClass', () => { - it('should return true for classes', () => { + test('should return true for classes', () => { expect(isClass(TestClass)).toBe(true) }) - it('should return false for non-class values', () => { + test('should return false for non-class values', () => { expect(isClass('string')).toBe(false) expect(isClass(123)).toBe(false) expect(isClass(true)).toBe(false) diff --git a/packages/utilities/src/lib/ts-guards/is-date.spec.ts b/packages/utilities/src/lib/ts-guards/is-date.spec.ts index 40262915..36449ba9 100644 --- a/packages/utilities/src/lib/ts-guards/is-date.spec.ts +++ b/packages/utilities/src/lib/ts-guards/is-date.spec.ts @@ -1,14 +1,16 @@ +import { describe, expect, test } from 'vitest' + import { isDate } from './is-date.js' describe('isDate', () => { - it('should return true for Date objects', () => { + test('should return true for Date objects', () => { expect(isDate(new Date())).toBe(true) expect(isDate(new Date('2023-01-01'))).toBe(true) expect(isDate(new Date(2023, 0, 1))).toBe(true) expect(isDate(new Date(Date.now()))).toBe(true) }) - it('should return false for non-Date values', () => { + test('should return false for non-Date values', () => { expect(isDate('2023-01-01')).toBe(false) expect(isDate(1672531200000)).toBe(false) expect(isDate(true)).toBe(false) diff --git a/packages/utilities/src/lib/ts-guards/is-defined.spec.ts b/packages/utilities/src/lib/ts-guards/is-defined.spec.ts index 8e54c8c4..e45009f6 100644 --- a/packages/utilities/src/lib/ts-guards/is-defined.spec.ts +++ b/packages/utilities/src/lib/ts-guards/is-defined.spec.ts @@ -1,7 +1,9 @@ +import { describe, expect, test } from 'vitest' + import { isDefined } from './is-defined.js' describe('isDefined', () => { - it('should return true for defined values', () => { + test('should return true for defined values', () => { expect(isDefined('')).toBe(true) expect(isDefined(0)).toBe(true) expect(isDefined(false)).toBe(true) @@ -11,7 +13,7 @@ describe('isDefined', () => { expect(isDefined(123)).toBe(true) }) - it('should return false for undefined values', () => { + test('should return false for undefined values', () => { expect(isDefined(undefined)).toBe(false) expect(isDefined(null)).toBe(false) }) diff --git a/packages/utilities/src/lib/ts-guards/is-number.spec.ts b/packages/utilities/src/lib/ts-guards/is-number.spec.ts index 2061ea19..75d96c66 100644 --- a/packages/utilities/src/lib/ts-guards/is-number.spec.ts +++ b/packages/utilities/src/lib/ts-guards/is-number.spec.ts @@ -1,7 +1,9 @@ +import { describe, expect, test } from 'vitest' + import { isNumber } from './is-number.js' describe('isNumber', () => { - it('should return true for valid number values', () => { + test('should return true for valid number values', () => { expect(isNumber(0)).toBe(true) expect(isNumber(123)).toBe(true) expect(isNumber(-456)).toBe(true) @@ -10,11 +12,11 @@ describe('isNumber', () => { expect(isNumber(-Infinity)).toBe(true) }) - it('should return false for NaN', () => { + test('should return false for NaN', () => { expect(isNumber(NaN)).toBe(false) }) - it('should return false for non-number values', () => { + test('should return false for non-number values', () => { expect(isNumber('123')).toBe(false) expect(isNumber(true)).toBe(false) expect(isNumber(false)).toBe(false) diff --git a/packages/utilities/src/lib/ts-guards/is-string.spec.ts b/packages/utilities/src/lib/ts-guards/is-string.spec.ts index 75d47879..3660815a 100644 --- a/packages/utilities/src/lib/ts-guards/is-string.spec.ts +++ b/packages/utilities/src/lib/ts-guards/is-string.spec.ts @@ -1,14 +1,16 @@ +import { describe, expect, test } from 'vitest' + import { isString } from './is-string.js' describe('isString', () => { - it('should return true for string values', () => { + test('should return true for string values', () => { expect(isString('')).toBe(true) expect(isString('hello')).toBe(true) expect(isString('123')).toBe(true) expect(isString(' ')).toBe(true) }) - it('should return false for non-string values', () => { + test('should return false for non-string values', () => { expect(isString(123)).toBe(false) expect(isString(true)).toBe(false) expect(isString(false)).toBe(false) diff --git a/packages/utilities/tsconfig.json b/packages/utilities/tsconfig.json index 7ae32b79..f53f2ffe 100644 --- a/packages/utilities/tsconfig.json +++ b/packages/utilities/tsconfig.json @@ -1,10 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "baseUrl": "./", - "target": "es2023", - "outDir": "./dist/", - "declarationDir": "./dist/" + "baseUrl": ".", + "target": "es2023" }, "include": ["src/**/*.ts"] } diff --git a/packages/utilities/tsconfig.lint.json b/packages/utilities/tsconfig.lint.json index 922aad8c..1386dd51 100644 --- a/packages/utilities/tsconfig.lint.json +++ b/packages/utilities/tsconfig.lint.json @@ -1,9 +1,5 @@ { - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": "./", - "types": ["jest", "node"] - }, - "include": ["src/**/*.ts", "test/**/*.ts"], - "exclude": [] + "extends": "../../tsconfig.lint.json", + "compilerOptions": { "baseUrl": "." }, + "include": ["**/*.ts"] } diff --git a/packages/utilities/tsconfig.spec.json b/packages/utilities/tsconfig.spec.json new file mode 100644 index 00000000..cd684dcb --- /dev/null +++ b/packages/utilities/tsconfig.spec.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.spec.json", + "compilerOptions": { + "baseUrl": "." + }, + "include": ["src/**/*.spec.ts", "test/**/*.ts"] +} diff --git a/packages/utilities/vitest.config.js b/packages/utilities/vitest.config.js new file mode 100644 index 00000000..ec160f83 --- /dev/null +++ b/packages/utilities/vitest.config.js @@ -0,0 +1,3 @@ +import CONFIG from '../../vitest.config.js' + +export default CONFIG diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 00000000..3a617cd2 --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,12 @@ +/** + * @see https://prettier.io/docs/configuration + * @type { import('prettier').Config } + */ +const config = { + printWidth: 120, + singleQuote: true, + semi: false, + trailingComma: 'all', +} + +export default config diff --git a/tsconfig.jest.json b/tsconfig.jest.json deleted file mode 100644 index e67cf8f0..00000000 --- a/tsconfig.jest.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": false, - "declarationDir": null, - "noEmit": true, - "types": ["jest", "node"], - "strictPropertyInitialization": false, - "resolveJsonModule": true - }, - "exclude": [] -} diff --git a/tsconfig.json b/tsconfig.json index 45b08030..93abcba5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,8 @@ "moduleResolution": "nodenext", "target": "es2023", "strict": true, + "outDir": "${configDir}/dist", + "declarationDir": "${configDir}/dist", "sourceMap": true, "declaration": true, "importHelpers": true diff --git a/tsconfig.lint.json b/tsconfig.lint.json new file mode 100644 index 00000000..fcf91a07 --- /dev/null +++ b/tsconfig.lint.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": false, + "declarationDir": null, + "noEmit": true, + "types": ["node"], + "strictPropertyInitialization": false, + "resolveJsonModule": true, + "paths": { + "@shiftcode/airtable-mapper": ["${configDir}/../airtable-mapper/src/index.ts"], + "@shiftcode/eslint-plugin-rules": ["${configDir}/../eslint-plugin-rules/src/index.ts"], + "@shiftcode/utilities": ["${configDir}/../utilities/src/index.ts"], + "@shiftcode/logger": ["${configDir}/../logger/src/index.ts"], + "@shiftcode/inversify-logger": ["${configDir}/../inversify-logger/src/index.ts"], + "@shiftcode/branch-utilities": ["${configDir}/../branch-utilities/src/index.ts"], + "@shiftcode/lambda-utilities": ["${configDir}/../lambda-utilities/src/index.ts"], + "@shiftcode/lambda-utilities/s3": ["${configDir}/../lambda-utilities/src/s3/index.ts"] + } + }, + "exclude": [] +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 00000000..708e3426 --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "declaration": false, + "declarationDir": null, + "noEmit": true, + "types": ["node"], + "strictPropertyInitialization": false, + "resolveJsonModule": true, + "paths": { + "@shiftcode/airtable-mapper": ["${configDir}/../airtable-mapper/src/index.ts"], + "@shiftcode/eslint-plugin-rules": ["${configDir}/../eslint-plugin-rules/src/index.ts"], + "@shiftcode/utilities": ["${configDir}/../utilities/src/index.ts"], + "@shiftcode/logger": ["${configDir}/../logger/src/index.ts"], + "@shiftcode/inversify-logger": ["${configDir}/../inversify-logger/src/index.ts"], + "@shiftcode/branch-utilities": ["${configDir}/../branch-utilities/src/index.ts"], + "@shiftcode/lambda-utilities/s3": ["${configDir}/../lambda-utilities/src/s3/index.ts"], + "@shiftcode/lambda-utilities": ["${configDir}/../lambda-utilities/src/index.ts"] + } + }, + "exclude": [] +} diff --git a/vitest.config.js b/vitest.config.js new file mode 100644 index 00000000..33664fde --- /dev/null +++ b/vitest.config.js @@ -0,0 +1,24 @@ +import { defineConfig } from 'vitest/config' +import path from 'node:path' +import tsconfig from './tsconfig.spec.json' + +// hacky but works.. --> the `${configDir}` variable is a TypeScript-config feature. +// but i didnt find a way to get the tsconfig parsed with the variable resolved... + +const alias = Object.fromEntries( + Object.entries(tsconfig.compilerOptions.paths ?? {}) + // order matters. we need the more specific (=the longer) entries first (deep import) + // as it will be used with `startsWith` from vitest. + .sort((a, b) => b[0].length - a[0].length) + .map(([key, [value]]) => [ + key, + path.resolve(import.meta.dirname, value.replace('${configDir}/../', './packages/')), + ]), +) + +export default defineConfig({ + test: { + globals: false, + alias, + }, +})