diff --git a/README.md b/README.md index 89d6003..79c556b 100644 --- a/README.md +++ b/README.md @@ -5,40 +5,30 @@ [![Codecov Status](https://codecov.io/gh/msudgh/sync-cloud-storage/branch/main/graph/badge.svg?token=2BY6063VOY)](https://codecov.io/gh/msudgh/sync-cloud-storage) [![License](https://img.shields.io/github/license/msudgh/sync-cloud-storage)](LICENSE) -Synchronize files and directories between a remote computer and multiple Serverless cloud providers' storages. - -Supported cloud providers: - -- [x] AWS S3 +Synchronize files and directories between a remote machine and a cloud storage via cloud frameworks and stacks consisting of [AWS SAM (Serverless)](https://www.serverless.com/) and [AWS Cloud Development Kit (CDK)](https://aws.amazon.com/cdk/). This package supports the following cloud storage providers: [AWS S3](https://aws.amazon.com/s3/). ## Features +- Sync multiple storages at once and flexible file matching (single or multiple file/dir sync) by defining patterns of [`glob`]() to include or exclude +- Supports a set of options as following for each file based on storage: `Prefix`, `Access Control List (ACL)`, `Tags`, `Metadata` +- Select a list of specific sync actions for each storage: `uploading`, `deleting` - Modern and uses the latest official cloud provider's SDK - AWS S3: [`aws-sdk@3.x`](https://www.npmjs.com/package/@aws-sdk/client-s3) -- Sync multiple storages at once and flexible file matching (single or multiple file/dir sync) by just defining patterns of [`glob`]() to include or exclude -- Set the following configs for each synced file: - - prefix - - access control list (ACL) - - tags - - metadata -- Select a list of specific sync actions for each storage: - - upload - - delete -- Written in **TypeScript** with strong type checking -- Integration test with cloud providers ## Installation -1. [**ni**](https://github.com/antfu/ni): `ni sync-cloud-storage -D` -2. [**npm**](https://npmjs.com/): `npm i sync-cloud-storage -D` -3. [**yarn**](https://yarnpkg.com/): `yarn add sync-cloud-storage -D` -4. [**pnpm**](https://pnpm.io/): `pnpm add sync-cloud-storage -D` +- [**npm**](https://npmjs.com/): `npm i sync-cloud-storage` +- [**yarn**](https://yarnpkg.com/): `yarn add sync-cloud-storage` +- [**pnpm**](https://pnpm.io/): `pnpm add sync-cloud-storage` +- [**ni**](https://github.com/antfu/ni): `ni sync-cloud-storage` ## Usage -### Serverless +### AWS S3 + +#### Serverless -#### AWS S3 +Sync storages action as a pre-deploy hook in the `serverless.yml`: ```yaml plugins: @@ -59,79 +49,69 @@ custom: bar: foo ``` -## Configuration Reference - -This section provides a detailed reference for all configuration options. - -- `name`: - - - Type: `string` - - Required: `true` - - Minimum length: 1 - - Example: `name: assets` - -- `patterns`: File patterns to include or exclude during synchronization. - - - Type: `array` of `string` - - Required: `true` - - Minimum items: 1 - - Example: - ```yaml - patterns: - - 'assets/*' - - '!assets/temp/*' - ``` - -- `actions`: List of actions to perform during synchronization. - - - Type: `array` of `string` - - Required: `true` - - Valid Values: `upload`, `delete` - - Example: - ```yaml - actions: - - upload - - delete - ``` - -- `prefix`: The prefix to apply to all synced files in the bucket. - - - Type: `string` - - Required: `false` - - Default: `""` - - Example: `prefix: assets` - -- `enabled`: Whether to enable the sync for the storage. - - - Type: `boolean` - - Required: `false` - - Default: `true` - -- `acl`: Access control list setting for the synced files. - - - Type: `string` - - Required: `false` - - Valid Values: `private`, `public-read`, `public-read-write`, `authenticated-read` - - Reference: [AWS S3 Canned ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#canned-acl) - - Example: `acl: public-read` - -- `metadata`: Custom metadata to apply to the synced files. - - - Type: `object` - - Required: `false` - - Example: - ```yaml - metadata: - foo: bar - bar: foo - ``` - -- `tags`: Custom tags to apply to the synced files. - - Type: `object` - - Required: `false` - - Default: `{}` - - Example: - ```yaml - tags: - environment: production - ``` +#### CDK + +Call sync storages action after setting up a CDK App: + +```typescript +import { Stack, App } from '@aws-cdk/core' +import SyncCloudStorage from 'sync-cloud-storage' + +const app = new App() +const stack = new Stack(app, 'MyStack') +const syncCloudStorage = new SyncCloudStorage(stack, { + storages: [ + { + name: 'my-bucket', + patterns: ['assets/*'], + actions: ['upload', 'delete'], + prefix: 'assets', + acl: 'public-read', + metadata: { + foo: 'bar', + bar: 'foo', + }, + }, + ], +}) + +// Sync storages +syncCloudStorage.storages() + +// Sync tags +syncCloudStorage.tags() + +// Sync metadata +syncCloudStorage.metadata() +``` + +## Options + +### General + +| Option | Notes | Type | Required | Default | +| -------- | ---------------------------------- | -------------------------------- | -------- | ---------------------------------------------------- | +| storages | List of storages, Minimum items: 1 | `array` of [`storage`](#storage) | true | undefined | +| region | Cloud (AWS) region | `string` | false | undefined or `AWS_REGION` environment variable | +| endpoint | Cloud (AWS) Endpoint URL | `string` | false | undefined or `AWS_ENDPOINT_URL` environment variable | +| offline | Offline mode | `boolean` | false | false or `IS_OFFLINE` environment variable | +| disabled | Disable sync | `boolean` | false | false | +| silent | Silent output logs | `boolean` | false | false | + +### Storage + +| Option | Notes | Type | Required | Default | +| ----------- | ----------------------------------------------------------------------------------------------------------- | ------------------- | -------- | ------------------ | +| name | Name of storage (AWS S3 Bucket), Minimum length: 1 | `string` | true | undefined | +| patterns | Patterns of [`glob`][glob] paths to include or exclude on sync action, Minimum items: 1 | `array` of `string` | true | undefined | +| actions | Sync actions, Valid values: `upload`, `delete` | `array` of `string` | false | `upload`, `delete` | +| prefix | Prefix for the storage files and folders | `string` | false | `''` | +| enabled | Enable or disable the storage on sync action | `boolean` | false | `true` | +| acl | [AWS S3 Canned ACL][acl], Valid values: `private`, `public-read`, `public-read-write`, `authenticated-read` | `string` | false | undefined | +| metadata | A set of metadata key/value pair to be set or unset on the object | `object` | false | undefined | +| tags | A set of tag key/value pair to be set or unset on the object | `object` | false | `{}` | +| gitignore | Use .gitignore file to exclude files and directories | `boolean` | false | false | +| ignoreFiles | Ignore files and directories to exclude from sync action | `array` of `string` | false | undefined | + +[glob]: https://en.wikipedia.org/wiki/Glob_(programming) +[acl]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#canned-acl diff --git a/jest.config.js b/jest.config.js index 9c68c38..fb4aca0 100644 --- a/jest.config.js +++ b/jest.config.js @@ -11,6 +11,7 @@ export default { '/node_modules/', './test/setupEnvs.ts', './test/mocks', + './test/schemas/input.fixture.ts', ], transform: { '^.+\\.ts$': [ diff --git a/package.json b/package.json index c45cc9f..f6c7734 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ }, "scripts": { "prepare": "is-ci || husky", - "build": "rm -rf ./dist && tsc -p tsconfig.build.json", + "build": "pnpm run clean && tsc -p tsconfig.build.json", "build:watch": "tsc -p tsconfig.build.json -w", "build:type-check": "tsc -p tsconfig.build.json --noEmit", "test": "node --trace-warnings --experimental-vm-modules 'node_modules/jest/bin/jest.js'", @@ -34,7 +34,20 @@ "lint:fix": "eslint . --fix", "docs:build": "pnpm run build && rm -rf ./docs && ./node_modules/.bin/jsdoc -c jsdoc.json", "docs:start": "pnpm run docs:build && ./node_modules/.bin/http-server -c-1 -o docs", - "preversion": "pnpm run build && pnpm run format" + "preversion": "pnpm run lint && pnpm run build && pnpm run format && pnpm run docs:build", + "clean": "rm -rf ./dist ./docs", + "start": "node dist/esm/index.js" + }, + "lint-staged": { + "(/test/.*\\.test\\.ts)$": [ + "npm run test" + ], + "*.{ts,js}": [ + "npm run lint" + ], + "*.{ts,js,json,md,yaml}": [ + "npm run format" + ] }, "devDependencies": { "@faker-js/faker": "8.4.1", @@ -45,6 +58,8 @@ "@types/serverless": "3.12.22", "@typescript-eslint/eslint-plugin": "6.21.0", "@typescript-eslint/parser": "6.21.0", + "aws-cdk-lib": "^2.80.0", + "constructs": "^10.3.0", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "eslint-import-resolver-typescript": "3.6.1", @@ -53,12 +68,13 @@ "http-server": "14.1.1", "husky": "9.0.10", "is-ci": "3.0.1", - "jest": "v30.0.0-alpha.3", + "jest": "v30.0.0-alpha.6", "jest-mock-extended": "3.0.5", "jsdoc": "4.0.2", + "lint-staged": "^15.2.9", "prettier": "3.2.5", - "serverless": "3.38.0", - "ts-jest": "29.1.2", + "serverless": ">=3.38.0", + "ts-jest": "29.2.4", "typescript": "5.3.3" }, "dependencies": { @@ -69,15 +85,20 @@ "winston": "^3.11.0", "zod": "3.23.8" }, - "lint-staged": { - "(/test/.*\\.test\\.ts)$": [ - "npm run test" - ], - "*.{ts,js}": [ - "npm run lint" - ], - "*.{ts,js,json,md,yaml}": [ - "npm run format" - ] + "peerDependencies": { + "aws-cdk-lib": "^2.80.0", + "constructs": "^10.0.0", + "serverless": ">=3.38.0" + }, + "pnpm": { + "overrides": { + "es5-ext@>=0.10.0 <0.10.63": ">=0.10.63", + "follow-redirects@<=1.15.5": ">=1.15.6", + "tar@<6.2.1": ">=6.2.1", + "braces@<3.0.3": ">=3.0.3", + "ws@>=7.0.0 <7.5.10": ">=7.5.10", + "fast-xml-parser@<4.4.1": ">=4.4.1", + "axios@>=1.3.2 <=1.7.3": ">=1.7.4" + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 13d34a5..875040b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,15 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + es5-ext@>=0.10.0 <0.10.63: '>=0.10.63' + follow-redirects@<=1.15.5: '>=1.15.6' + tar@<6.2.1: '>=6.2.1' + braces@<3.0.3: '>=3.0.3' + ws@>=7.0.0 <7.5.10: '>=7.5.10' + fast-xml-parser@<4.4.1: '>=4.4.1' + axios@>=1.3.2 <=1.7.3: '>=1.7.4' + importers: .: @@ -51,6 +60,12 @@ importers: '@typescript-eslint/parser': specifier: 6.21.0 version: 6.21.0(eslint@8.56.0)(typescript@5.3.3) + aws-cdk-lib: + specifier: ^2.80.0 + version: 2.152.0(constructs@10.3.0) + constructs: + specifier: ^10.3.0 + version: 10.3.0 eslint: specifier: 8.56.0 version: 8.56.0 @@ -76,23 +91,26 @@ importers: specifier: 3.0.1 version: 3.0.1 jest: - specifier: v30.0.0-alpha.3 - version: 30.0.0-alpha.3(@types/node@20.11.20) + specifier: v30.0.0-alpha.6 + version: 30.0.0-alpha.6(@types/node@20.11.20) jest-mock-extended: specifier: 3.0.5 - version: 3.0.5(jest@30.0.0-alpha.3(@types/node@20.11.20))(typescript@5.3.3) + version: 3.0.5(jest@30.0.0-alpha.6(@types/node@20.11.20))(typescript@5.3.3) jsdoc: specifier: 4.0.2 version: 4.0.2 + lint-staged: + specifier: ^15.2.9 + version: 15.2.9 prettier: specifier: 3.2.5 version: 3.2.5 serverless: - specifier: 3.38.0 - version: 3.38.0 + specifier: '>=3.38.0' + version: 3.38.0(@aws-sdk/credential-provider-node@3.511.0) ts-jest: - specifier: 29.1.2 - version: 29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(jest@30.0.0-alpha.3(@types/node@20.11.20))(typescript@5.3.3) + specifier: 29.2.4 + version: 29.2.4(@babel/core@7.23.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(jest@30.0.0-alpha.6(@types/node@20.11.20))(typescript@5.3.3) typescript: specifier: 5.3.3 version: 5.3.3 @@ -110,6 +128,15 @@ packages: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} + '@aws-cdk/asset-awscli-v1@2.2.202': + resolution: {integrity: sha512-JqlF0D4+EVugnG5dAsNZMqhu3HW7ehOXm5SDMxMbXNDMdsF0pxtQKNHRl52z1U9igsHmaFpUgSGjbhAJ+0JONg==} + + '@aws-cdk/asset-kubectl-v20@2.1.2': + resolution: {integrity: sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==} + + '@aws-cdk/asset-node-proxy-agent-v6@2.0.3': + resolution: {integrity: sha512-twhuEG+JPOYCYPx/xy5uH2+VUsIEhPTzDY0F1KuB+ocjWWB/KEDiOVL19nHvbPCB6fhWnkykXEMJ4HHcKvjtvg==} + '@aws-crypto/crc32@3.0.0': resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} @@ -601,6 +628,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -609,12 +640,12 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/console@30.0.0-alpha.3': - resolution: {integrity: sha512-YswdyaJ3/6sVYe4n3iClqiuq3M2jA3FevbwBr1CE/QrRUuZFAd58sxRnW/XD2bS7pr5zI0dviaSLsFCkUfuuiA==} + '@jest/console@30.0.0-alpha.6': + resolution: {integrity: sha512-08BeAnuabmauj5B+Xa4GNPAotQUGm3PLKSE3rnpnmxniZzR4tXhx8+AA2+HGTri4bbVRY/r3Jl0vJnkhvHTkeQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - '@jest/core@30.0.0-alpha.3': - resolution: {integrity: sha512-nqtDVDXpwlt8vXG7Fw4WsI81157BnOZGW7B4svpqseEptLSfSbCRkrsTs63bXI2SHiljoqgl8rqNvghsGZoATw==} + '@jest/core@30.0.0-alpha.6': + resolution: {integrity: sha512-Qsvu9/I0hUOpeelp3jlTmg6cg3C+w18v4hxWVGchCRJAChvuxmsomB1Cm+DKB6NiMy2EvUvpwdT8X31lERtemw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -626,44 +657,48 @@ packages: resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/environment@30.0.0-alpha.3': - resolution: {integrity: sha512-AcJ9kUhN0lVlm/cJCr59AUrsqT2ZlszG1W+ENssqkueQLObCkpv5Jpv5ISM1F2FOt136OG0vLMTAp+V+r+gPYA==} + '@jest/environment@30.0.0-alpha.6': + resolution: {integrity: sha512-pjNYNkzq761hh8D2grrG77L6nhe2VBCFFM+G1hyqhaJ2MAzhp2Gh+G94uF3px7luSzLh8GYvGJQGYy197EUOGQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} '@jest/expect-utils@29.7.0': resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/expect-utils@30.0.0-alpha.3': - resolution: {integrity: sha512-1KoDS+Mc/7Jjb6r77wvHRCRK2LGxEidNw9IseyD79UDX8nwVw5t494sxnlUOQ2qGB7GNtZz0znwGX7BwjYFgLw==} + '@jest/expect-utils@30.0.0-alpha.6': + resolution: {integrity: sha512-QMySMhaCUl0ZQd7Tx5X3fVWY5jtQxZNrTll0OyavdQ70ZTLgk0kU9K+XovcMWO26MK9R5EX7bBgD/j7w9hUM4w==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} '@jest/expect@29.7.0': resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/expect@30.0.0-alpha.3': - resolution: {integrity: sha512-4O6/gzB6y6MvHVnLjQQNsMLOxN1B7ynaOEdOD7GSlDcMThm+ecIkQ1Rsh7hS3SOpssugRZSzQgWlN0+vWO+1cw==} + '@jest/expect@30.0.0-alpha.6': + resolution: {integrity: sha512-3O74pygTwUBzUjO958IgNwmp0WrjASbiWdMEfUMePVqtiGoyS4Nxj9hsx4uKsNVivNJSZiiayYoP6dLhWerJXQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} '@jest/fake-timers@29.7.0': resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/fake-timers@30.0.0-alpha.3': - resolution: {integrity: sha512-B9Oov0Bk1YRJaawZEcwXuupHIViX49pZhghdN+m1KFwuZ9smstD9VI9gXFBRtF1fHNu+1HmtD361LuDEHifzIw==} + '@jest/fake-timers@30.0.0-alpha.6': + resolution: {integrity: sha512-deka0RmhJgEKPJM6cXPd4TJQ6fLczErdMN7Oxzr16UTDFHxtFd79tduJ8uP92dQyO4zy63N/dlFK6d+FHyWUDw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} '@jest/globals@29.7.0': resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/globals@30.0.0-alpha.3': - resolution: {integrity: sha512-moTQi5Iq/DM8kr0rMbpvLuejonVakL7498+LORlcW8ZSpTwUSO1SIiJa81AU1PWbLR6MtrUNACk9KS2DbetqNQ==} + '@jest/globals@30.0.0-alpha.6': + resolution: {integrity: sha512-+uJMoPUos9RH6+52iNgKJBbx1Hd2QsCZjExi5XpVvTjJ/gE4eJ1X7irUMt+14sH0QkeZ3GnjeTJFopyjOCsu+Q==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - '@jest/reporters@30.0.0-alpha.3': - resolution: {integrity: sha512-Tnf432yBdGivksMfzc9y0p0SeJ+vEIBzxlXrnOou2+kM3vNqFvuH2RedNarFHQumFKtNKXe/S4WcpOCyITFFAA==} + '@jest/pattern@30.0.0-alpha.6': + resolution: {integrity: sha512-eoV3sjS1M5k3YdrFWezqdndfgepwB86gwyXC0BzV2saZdJ42ySUoEDBGKuwta8A6Zh3w8tVHNFxz1BqiFraHCQ==} + engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} + + '@jest/reporters@30.0.0-alpha.6': + resolution: {integrity: sha512-jzW0t2OtEzBYwlG4EMJKG4q5RPaVvLPDm/nBS08hd+XPoLJJ9b5thyo/MoThIqJfdi0lHqFlDQUmlL205CMoSw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -675,36 +710,40 @@ packages: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/schemas@30.0.0-alpha.3': - resolution: {integrity: sha512-7C75tiHmJcycvqQcRVIyTHOW45uj63SOnZbRaNRBLMFB6NOfzQz98F6Hgo832G0EfdY0ZuSRnoaXH7Fybd4epQ==} + '@jest/schemas@30.0.0-alpha.6': + resolution: {integrity: sha512-Ukr3kR/VsBq8+JHU92xArhSJeFQHVHs5T1laPO00GrrNzv3DvoHn3/EVVagGn9CHbLeAyJHXFRHYxq3+520kiA==} + engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} + + '@jest/snapshot-utils@30.0.0-alpha.6': + resolution: {integrity: sha512-iDtIFCyRT8ZyLmz6kYbS8GR/MBXKA6uZPBfdTcnd2y0T987DV3GVlvwkAC+iFTc1w3HgwQe8LTf+y3i+O2ISCw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - '@jest/source-map@30.0.0-alpha.3': - resolution: {integrity: sha512-OBF2rx9pkcbhoUfeXI7GPB6Gd+Olajj/VMGv9w0VTtAJ/KL6s1kmFgefYi6bzGOlB2Z/UWNR65oY/JWAEc69fQ==} + '@jest/source-map@30.0.0-alpha.6': + resolution: {integrity: sha512-7rSrxehVyzqw5O+F2ds7wLAm9f6QxqYsJU42LNyUpaFlJqtWz3PeQ2Wu3DVoPzGu0C66EhDHKYmeN0mXnRDZmQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - '@jest/test-result@30.0.0-alpha.3': - resolution: {integrity: sha512-ZBE3+LAqQ/498FJPqPMJOEaxi0lHTSSxhXYR8LC50WKJZYT2GlR7irPMfHm8pb5m3LgVfqPfgJ9mtm4uwWJgLQ==} + '@jest/test-result@30.0.0-alpha.6': + resolution: {integrity: sha512-Jlg8lCm7VQ6YvQ0eZx2nQEtej/ng+ulV8cXH7Nj5i33hNZq8EZvWM4gQDWDzRe1X7cVE3Bd42On5f6s2rqqIjw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - '@jest/test-sequencer@30.0.0-alpha.3': - resolution: {integrity: sha512-yH/S3G0iEcHTgWxK6eM/5cehSepQe+X8KK+a2QMAwj5TWsGNsPPNdGnhCpSmzWB9v+bNvwVC4nSWsh+T9uwMwg==} + '@jest/test-sequencer@30.0.0-alpha.6': + resolution: {integrity: sha512-5M89jbSQWkBjGlFrRk2wXjRJVxR+uN553sFN0q2TglH0/a4OMSVxRBcCmnIqqDMDizGAlYTxW6BaXxHGHpvrRQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} '@jest/transform@29.7.0': resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/transform@30.0.0-alpha.3': - resolution: {integrity: sha512-oTjlUPmqCdxqQqKYgBdedHOraGxYe0h83a4gt/zqmDKU+0/rmwI8Cy1bW62ZslP9faUqyv+mU11grA60WJlvlQ==} + '@jest/transform@30.0.0-alpha.6': + resolution: {integrity: sha512-4L8BZm38BJASswsqruc4c3F0AExYLvp0xq8067e7fIyg4hfwa4zUA+N2idf+eTTjDWevVVdIBfELzJ8b7nvO4Q==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} '@jest/types@29.6.3': resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/types@30.0.0-alpha.3': - resolution: {integrity: sha512-z8oValFWEGDRslYtcU+4rgTPin8NyHuXaOrDWWDCIrYWPISaa7CLrdA6tS6o1GnywHH7kgYMCpb39cMsqP4R8w==} + '@jest/types@30.0.0-alpha.6': + resolution: {integrity: sha512-qUjAm8uvIR7oExn/Fp7/bvn58HSZng5itQDM9x0vaxXWxxGH/8MDmqX/h7OUBz9ka+KfYRaTxe4Y6wiM8+nphw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} '@jridgewell/gen-mapping@0.3.3': @@ -725,6 +764,9 @@ packages: '@jridgewell/trace-mapping@0.3.21': resolution: {integrity: sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jsdoc/salty@0.2.7': resolution: {integrity: sha512-mh8LbS9d4Jq84KLw8pzho7XC2q2/IJGiJss3xwRoLD1A+EE16SjN4PfaG4jRCzKegTFLlN0Zd8SdUPE6XdoPFg==} engines: {node: '>=v12.0.0'} @@ -773,8 +815,8 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sinclair/typebox@0.32.14': - resolution: {integrity: sha512-EC77Mw8huT2z9YlYbWfpIQgN6shZE1tH4NP4/Trig8UBel9FZNMZRJ42ubJI8PLor2uIU+waLml1dce5ReCOPg==} + '@sinclair/typebox@0.33.7': + resolution: {integrity: sha512-et38XPs6GMoB6XugH+Spp/HRv5gHYffw7rXC3caen/dIKC7Q6sqs6eEH9Yd9UKziUkOQdrLr9OXUULAc+pRMng==} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} @@ -960,10 +1002,6 @@ packages: resolution: {integrity: sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==} engines: {node: '>=14.0.0'} - '@smithy/util-middleware@2.0.9': - resolution: {integrity: sha512-PnCnBJ07noMX1lMDTEefmxSlusWJUiLfrme++MfK5TD0xz8NYmakgoXy5zkF/16zKGmiwOeKAztWT/Vjk1KRIQ==} - engines: {node: '>=14.0.0'} - '@smithy/util-middleware@2.1.1': resolution: {integrity: sha512-mKNrk8oz5zqkNcbcgAAepeJbmfUW6ogrT2Z2gDbIUzVzNAHKJQTYmH9jcy0jbWb+m7ubrvXKb6uMjkSgAqqsFA==} engines: {node: '>=14.0.0'} @@ -1174,6 +1212,10 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1271,15 +1313,33 @@ packages: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} + aws-cdk-lib@2.152.0: + resolution: {integrity: sha512-w8Dn92xYCUWSRL9ncoXzpGzyDAHbljnrhXFm/pTR1YZTxdbLHvIOdh7D9b9qhtghUnq2i522I6/z2NJggPcNWQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + constructs: ^10.0.0 + bundledDependencies: + - '@balena/dockerignore' + - case + - fs-extra + - ignore + - jsonschema + - minimatch + - punycode + - semver + - table + - yaml + - mime-types + aws-sdk@2.1546.0: resolution: {integrity: sha512-v9fZehIMQRCvojbD1BNN4YiUjoj/KtD0/7KUPEyTQpuzpD8/QI6CSJx71hC8ad1y8ObDf+OntPvmtvXBnPES5g==} engines: {node: '>= 10.0.0'} - axios@1.6.5: - resolution: {integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==} + axios@1.7.4: + resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} - babel-jest@30.0.0-alpha.3: - resolution: {integrity: sha512-22NEFug9CD3C8tbTOPy2LjdZfWd63pdWedEodtjf6K0u922i4rThsCFblV1/afmBwCaeOZTPdLbp71ftPe0EpQ==} + babel-jest@30.0.0-alpha.6: + resolution: {integrity: sha512-WOQkqpBz2q8d/AT6D6rZXW5xnKHDmk3kIukaXlzUyoBBIvLh1SEvi2RGS4fboEtS0kNkyL+zf1rSfkt5OCIgmw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: '@babel/core': ^7.11.0 @@ -1288,8 +1348,12 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} - babel-plugin-jest-hoist@30.0.0-alpha.3: - resolution: {integrity: sha512-XIy+DV/1gpXSdJcSiNhq10+MKpevarPun90sW4Ch/1wFyma6nXsIk8Nwax7GYwz0mLTand+bY59I+DBfBi8n+Q==} + babel-plugin-istanbul@7.0.0: + resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==} + engines: {node: '>=12'} + + babel-plugin-jest-hoist@30.0.0-alpha.6: + resolution: {integrity: sha512-e/aPv0pmnvJqXM5SfCBpyMwZFEZrKW1Mb4unwTkxewk6/0TjwBk6l3B3F9H9OKZ3ErhkH4b+Epd3IIM5E53I2g==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} babel-preset-current-node-syntax@1.0.1: @@ -1297,8 +1361,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - babel-preset-jest@30.0.0-alpha.3: - resolution: {integrity: sha512-1ySm/kw6hjNddygeHSNmwObOipFDDrmx/ADNjQjptO6SWmqV33iWwf8Usz+zQxb70+zbgEBI31Sk2BBFtTmAGA==} + babel-preset-jest@30.0.0-alpha.6: + resolution: {integrity: sha512-Xsis7RI2oT2zlyCIEzMtjDiES0wKoQxTUo5BGzx1q3ZemnDE1/7xTC4/lI4eBLmAtwk/hpZLRYwltvbQEvyRWw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: '@babel/core': ^7.11.0 @@ -1335,8 +1399,8 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} browserslist@4.22.2: @@ -1424,6 +1488,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -1442,9 +1510,9 @@ packages: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} @@ -1465,6 +1533,10 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + cli-progress-footer@2.3.2: resolution: {integrity: sha512-uzHGgkKdeA9Kr57eyH1W5HGiNShP8fV1ETq04HDNM1Un6ShXbHhwi/H8LNV9L1fQXKjEw0q5FUkEVNuZ+yZdSw==} engines: {node: '>=10.0'} @@ -1477,6 +1549,10 @@ packages: resolution: {integrity: sha512-BbEjY9BEdA6wagVwTqPvmAwGB24U93rQPBFZUT8lNCDxXzre5LFHQUTJc70czjgUomVg8u8R5kW8oY9DYRFNeg==} engines: {node: '>=6.0'} + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} @@ -1518,6 +1594,9 @@ packages: color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colorspace@1.1.4: resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} @@ -1525,6 +1604,10 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -1542,6 +1625,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + constructs@10.3.0: + resolution: {integrity: sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==} + engines: {node: '>= 16.14.0'} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -1599,6 +1686,15 @@ packages: supports-color: optional: true + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -1675,8 +1771,8 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff-sequences@30.0.0-alpha.3: - resolution: {integrity: sha512-yaGzjI+ifv9vL61+Lyu4k3i2G6/4wWyAbOees2JAf7Qh5zD95bF9BKbrog5tTNj6EDk7AVy7K8Aj2K0Z13fq6g==} + diff-sequences@30.0.0-alpha.6: + resolution: {integrity: sha512-DVGt3/yzbneMUTuupsMqyfSXMnU2fE0lVsC9uFsJmRpluvSi7ZhrS0GX5tnMna6Ta788FGfOUx+irI/+cAZ4EA==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} dir-glob@3.0.1: @@ -1705,6 +1801,11 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + electron-to-chromium@1.4.636: resolution: {integrity: sha512-NLE0GIy1OL9wRiKL20h9TkctBEYZuc99tquSS9MVdTahnuHputoETHeqDzgqGqyOY9NUH0g9wjfEuw5OD+wRcQ==} @@ -1712,6 +1813,9 @@ packages: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1731,6 +1835,10 @@ packages: entities@2.1.0: resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -1749,8 +1857,8 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} - es5-ext@0.10.62: - resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} engines: {node: '>=0.10'} es6-iterator@2.0.3: @@ -1860,6 +1968,10 @@ packages: resolution: {integrity: sha512-SLBLpfE7xWgF/HbzhVuAwqnJDRqSCNZqcqaIMVm+f+PbTp1kFRWu6BuT83SATb4Tp+ovr+S+u7vDH7/UErAOkw==} engines: {node: '>=0.10'} + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1898,6 +2010,9 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events@1.1.1: resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==} engines: {node: '>=0.4.x'} @@ -1910,6 +2025,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -1918,8 +2037,8 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - expect@30.0.0-alpha.3: - resolution: {integrity: sha512-pwdFUH14bNs/y2x7YYhhAd1y7My9BvyzaGDTHHjRcDRW2qwIKFPjpjxdS4pwWHb8ROeWvXOxom6a7CPrcR/FFg==} + expect@30.0.0-alpha.6: + resolution: {integrity: sha512-WVi2V4iHKw/vHEyye00Q9CSZz7KHDbJkJyteUI8kTih9jiyMl3bIk7wLYFcY9D1Blnadlyb5w5NBuNjQBow99g==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} ext-list@2.2.2: @@ -1956,8 +2075,8 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-xml-parser@4.2.5: - resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} + fast-xml-parser@4.4.1: + resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true fastest-levenshtein@1.0.16: @@ -2004,6 +2123,9 @@ packages: resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} engines: {node: '>=4'} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filename-reserved-regex@2.0.0: resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} engines: {node: '>=4'} @@ -2016,8 +2138,8 @@ packages: resolution: {integrity: sha512-GTLKYyBSDz3nPhlLVPjPWZCnhkd9TrrRArNcy8Z+J2cqScB7h2McAzR6NBX6nYOoWafql0roY8hrocxnZBv9CQ==} engines: {node: '>= 10.4.0'} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} find-requires@1.0.0: @@ -2046,8 +2168,8 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.4: - resolution: {integrity: sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==} + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -2080,10 +2202,6 @@ packages: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2114,6 +2232,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + get-intrinsic@1.2.2: resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} @@ -2137,6 +2259,10 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -2266,6 +2392,10 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + husky@9.0.10: resolution: {integrity: sha512-TQGNknoiy6bURzIO77pPRu+XHi6zI7T93rX+QnJsoYFf3xdjKOur+IlfqzJGMHIK/wXrLg+GsvMs8Op7vI2jVA==} engines: {node: '>=18'} @@ -2372,6 +2502,14 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} @@ -2429,6 +2567,10 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -2464,7 +2606,7 @@ packages: isomorphic-ws@4.0.1: resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} peerDependencies: - ws: '*' + ws: '>=7.5.10' istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} @@ -2478,12 +2620,16 @@ packages: resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} engines: {node: '>=10'} + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} istanbul-reports@3.1.6: @@ -2494,16 +2640,21 @@ packages: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} - jest-changed-files@30.0.0-alpha.3: - resolution: {integrity: sha512-C48A0AuLOacGfzXJp+Ur46ftlylSQZaFaefxnpzBYR117mnH14Br1wBUGEp89hQGVZFpc3ZJGr62u78mSk/Vmg==} + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@30.0.0-alpha.6: + resolution: {integrity: sha512-Fmyt6W27L4fRBl/gReFC4WU+3XIqB7ySHu+a9QxrERapfCb43o7y81TCvTwJHSw5dxGzXLOObVB0tRMDWMafnw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - jest-circus@30.0.0-alpha.3: - resolution: {integrity: sha512-CLbl1SOAnlYn7d/r1jj23+OW1c1XPi4Icf3nO7n3rYSsrHbkm2PA3GYsk8vR4jIgGlTTLkDKKkKZeSUTfkcS1g==} + jest-circus@30.0.0-alpha.6: + resolution: {integrity: sha512-1C62WeTyWinn6zR61syYKe5yqVbV+ftf21vOgj8AtTxGfMUAlGCpeZ5zh4Kc9Qk7r/PiPiHWZtgZmeT4oe9Dug==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - jest-cli@30.0.0-alpha.3: - resolution: {integrity: sha512-z1aQDxDe0VeDSEUeMr9MrfI5cc2SSCiKtG0Rt3XDfTgWrzyoakVds/9QMkkpNKHryCBzZZKOMe5W2uy7qM4WOA==} + jest-cli@30.0.0-alpha.6: + resolution: {integrity: sha512-3VYzI2KgpMNAsf+LdRAQtAbhH3IDyFnT36U6URXot+2JWwoCGQQ6w4HIfqyOSlH4aejKgTPSfxki2shRPDFtlQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} hasBin: true peerDependencies: @@ -2512,15 +2663,18 @@ packages: node-notifier: optional: true - jest-config@30.0.0-alpha.3: - resolution: {integrity: sha512-3eqS6gcsaPtcpU/VVlkLx1se1JiH18uh1Xg+oOf6FhlLDvAT5h6+dvWa2IpyucCN46dHHEw3E85qfjogq4XLtw==} + jest-config@30.0.0-alpha.6: + resolution: {integrity: sha512-Tq9rH1mg9+nlIhh3efGwMSogFVKZ9z7c6P33ZlK74iJlnqqIAKYERZL2nNmNC5+5p8uxlTPSFZfBz9O8NGKotw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: '@types/node': '*' + esbuild-register: '>=3.4.0' ts-node: '>=9.0.0' peerDependenciesMeta: '@types/node': optional: true + esbuild-register: + optional: true ts-node: optional: true @@ -2528,56 +2682,56 @@ packages: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-diff@30.0.0-alpha.3: - resolution: {integrity: sha512-cY3JM566pqIjfjww9OKYu4dExYGxsDI53/II57d+R1OpikffSAKvliqoejeCpivVwOir6qkcq5jY0l6pq90Orw==} + jest-diff@30.0.0-alpha.6: + resolution: {integrity: sha512-43j1DoYwVKrkbB67a2gC0ijjIY9biF0JSPXv7H6zlOkzNlqYg8hSDzrurLNo6zGKatW4JSBLE79LmXPJPj1m6A==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - jest-docblock@30.0.0-alpha.3: - resolution: {integrity: sha512-kVMYlUpTIYCPUdl++XuEfAAew+1KWLTdkNiq2bwq8PsAU4rWMYDKuGOBIBxOHP0UcEN+zeObCmXspudpAG2xJQ==} + jest-docblock@30.0.0-alpha.6: + resolution: {integrity: sha512-KXRLgRo7/rF1wqxQupsFCZa6wOp1qrDg4GdSXKfIHODYQb0dpi4rYaYA8xV5l2g9KwYc9/zV7l1tPe9TOr27ew==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - jest-each@30.0.0-alpha.3: - resolution: {integrity: sha512-IwwuX9YSUoV6tvdyVW9My1b6RZKZ6mCOohIcBq39ckIoJSHRi5VBvwWdglvVoeZZsK3nfcsWdszxNt4zyFEBSg==} + jest-each@30.0.0-alpha.6: + resolution: {integrity: sha512-snLI2JNYkoBMlZRrNk67XiauUy+uEzRCszKdj+cqHyZ4/MU8fz7gCxbn3g0zmiGUxr0RX0534UxMjc82Sk++tg==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - jest-environment-node@30.0.0-alpha.3: - resolution: {integrity: sha512-tVk/QvWg4fy0flNxFffOB4ZgtA6QDCL3HWe4a7vlupI9ZfSgcns5N7TmCep/fLHpEIZuKMFNVc/GVPSxPpb26g==} + jest-environment-node@30.0.0-alpha.6: + resolution: {integrity: sha512-UN9W3dFzO150Bqj1x+1pq7dMUqw/QhpqhdtmC3B1P6GD9eKEMFGuRw3EButx5SGzrZOqRNlF+tUNC8CoWGW2Og==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-get-type@30.0.0-alpha.3: - resolution: {integrity: sha512-K6bJS51wUJf6t6cKhfWnt4UfStZjWGNsfab9XEEvPZhlTrM37eDO3ekcVJFuR1/g4QCKm9T8p0ob77dNfDV1zQ==} + jest-get-type@30.0.0-alpha.6: + resolution: {integrity: sha512-lJEoQdCY4ICN6+T0lJ9BODKuqPOEpCv2NnJsEO1nmsK0fbWZmN/pgOPHVqLfK8i3jZpUmgupJ1w8r36mc8iiBQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} jest-haste-map@29.7.0: resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-haste-map@30.0.0-alpha.3: - resolution: {integrity: sha512-aCf8+nM4OdOtnhPE9qkggRzVmNmYmCrxKIEF4BfU1h5LECCa7arOVI0+GMf1HyQ4N2CJejCuCwKdj+bFakyPeQ==} + jest-haste-map@30.0.0-alpha.6: + resolution: {integrity: sha512-NR/Kw8HyOkuWIdT8ynsp9KnsTDvWnlz8WSOmtQxySTIzOWbZaeJ2FJi9LoDL6+vhKpdlLfUvhgZVtnFJSLCzew==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - jest-leak-detector@30.0.0-alpha.3: - resolution: {integrity: sha512-g9ATCuifGCIKwlyct2GogQZQA+QEK0CESkM9MfZ4+6heJDtHijJ9XBvmAonVFUA7wPAVp3hx6oM6YUxfEEHZgQ==} + jest-leak-detector@30.0.0-alpha.6: + resolution: {integrity: sha512-a6fh/6h6dCDyj+aplGqkajVqzmi+qYHs5X8orMZv+u56++gUezJZJf8GCiQqw2vtxcsWVPUuQXa3kF33tAYzNQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} jest-matcher-utils@29.7.0: resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-matcher-utils@30.0.0-alpha.3: - resolution: {integrity: sha512-TT86Qf9nZMW9DR+kBYpIdhpHweMC0Sn76Qlo1BA9CSeq0IiX7Oe3eTzN0hOHroiIIv4NzIPqOE+FCDnDWLvxaQ==} + jest-matcher-utils@30.0.0-alpha.6: + resolution: {integrity: sha512-jaq7+HznsK54G0qzu96ZwfMEKHmlPiDqg6qG2p/hVQzr6Y/qVMRh8abI9Y1lX6SSXkr+S9mPAkmOsuJNLTLYmQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} jest-message-util@29.7.0: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-message-util@30.0.0-alpha.3: - resolution: {integrity: sha512-+/Ajvi4E/0xI1gbX3q1cNTnRiweAWvsruZo/WaL1zNutu8LlMn/1p1CJAVI4jxIr9E6CMDOVSvScTsnDU5L9iQ==} + jest-message-util@30.0.0-alpha.6: + resolution: {integrity: sha512-XAGJqkrBo7m3bFxWqiNqL0PyAWGf1XHR6bTve90MjBKJuIzhJsounGTzBNUw8JoU7Uzcj5Z6ZmEhaE3CDnwjfw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} jest-mock-extended@3.0.5: @@ -2590,8 +2744,8 @@ packages: resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-mock@30.0.0-alpha.3: - resolution: {integrity: sha512-hDIm/0ITW/WIyFudj9Dz9eS+vg9tgw51dab4Ild6ME7kBZXQS4AMgXf1AoqQY0amSyxnIZ17G7RLKft88cvkRQ==} + jest-mock@30.0.0-alpha.6: + resolution: {integrity: sha512-ezW02IXiKyFYAgDuxfAlONWULitSaB66t411fq2BJxQtgyMGtv59CsnhgbKb0gQp+9vig5MO5ytDCUPalTbarg==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} jest-pnp-resolver@1.2.3: @@ -2607,60 +2761,60 @@ packages: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-regex-util@30.0.0-alpha.3: - resolution: {integrity: sha512-XFCQrDRreQmrU/HCDxVdTlz9nFaLSJJSBbBoxTfKz7coMyPw2s0Zag2LwrslNJBPfuTtbokXbS1e2RtDAwPv+A==} + jest-regex-util@30.0.0-alpha.6: + resolution: {integrity: sha512-XcsAVaqc69QyMz1/FChyhWSoAMaKcDPhFOuWJz/H51LppsyZRAJPXkPnMopsS+qfut8cggExr9QLcsYaX6hqqA==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - jest-resolve-dependencies@30.0.0-alpha.3: - resolution: {integrity: sha512-ueaenJkiY+8kk0q5PkpdV/2q1Bx+A83VgJWmeyo/rT0YmRMiv0VApmYzjcTlmx6OFwqJBVZXZmnoQm1l/FkOdw==} + jest-resolve-dependencies@30.0.0-alpha.6: + resolution: {integrity: sha512-G+st0nBR4FNIvVCHq8YNJBiG6t7u0+cxM099lbtOoJNJU+ZTdIxSyzPnnmp/C+YHd1QOlDNlplvL+xe1KHhPUA==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - jest-resolve@30.0.0-alpha.3: - resolution: {integrity: sha512-xsUEYnDhzKgke5i2hgX+9xJpBcZYric6QoEIYj6zRpbZcpbOCZEfd1cru4icwAp0s8bH88A19+6n+xdTilPWMw==} + jest-resolve@30.0.0-alpha.6: + resolution: {integrity: sha512-0EyeId+RFng52qHvuxOzKjZd2uDF/2Hdzpzt54+biGgY/VVAvf8mYE9UV7g6154Ozpq6KLztSqqMCfPgVs4CbA==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - jest-runner@30.0.0-alpha.3: - resolution: {integrity: sha512-shkjuClZlDmMd8TWVg2ZI+EhUuaxGLoMrynd1/POL4VD1m5RUazN2UqSvMJCO0ACE40yKJfbHNYQ2pA/U/VdSQ==} + jest-runner@30.0.0-alpha.6: + resolution: {integrity: sha512-SoADy4YnspMpXLNnRCXNIoinm1N5SMci+iF6Y29Duv3wnWhcL14XjEOcyUKBB+AIL52YwouLeUHkCyCspbBk1Q==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - jest-runtime@30.0.0-alpha.3: - resolution: {integrity: sha512-vo5X1cppTuxgqmOpaPtWJKAZARrMwj1rzORAkcxQ4MkWXCMo8LI9nL2jAPRCHMPqdde/2Hl0gc5uAIgvoUJ7xw==} + jest-runtime@30.0.0-alpha.6: + resolution: {integrity: sha512-p7w7DSFFzwHyR4HsNXca/p32VpL9MLT1c71+VplFJIEgeRHvyqxrARentlul6uJniwtlqvZrVVf5baCQ5a5GUw==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} jest-snapshot@29.7.0: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-snapshot@30.0.0-alpha.3: - resolution: {integrity: sha512-/IhF7s664OMEBfT44aPZt/BmjDA0mzK+Qpv0d/LjBOpuXNL2NoV1sBNW+JCAv0vWYsaaxNgHxAZidoNEO6Fdlg==} + jest-snapshot@30.0.0-alpha.6: + resolution: {integrity: sha512-YCBUxSNJ9YGch3tyQdxQkOUitbmXahHL6UhSQeSMERFfX1UMrHyEDHggglocCUg4G3jdU8YzshxOJ/oaR6Ph8w==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-util@30.0.0-alpha.3: - resolution: {integrity: sha512-5562Xr2X8UeJL12W2UR1Mj1/Z78wPm8erPoaS29ksMh0IsDe2dVboJld0zLOulcm6zTAqHbgphCOGLDsTbG14A==} + jest-util@30.0.0-alpha.6: + resolution: {integrity: sha512-JlimakOVDyoMC8TEG+knoufxUqLG+Btihf1G8o5sHxz54C6oL54Wetfepp+Nhuj/1hSL0sQtkovvjlEycf9i0w==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - jest-validate@30.0.0-alpha.3: - resolution: {integrity: sha512-UcjJVDJiJAKtEHoqy2wH/+wQzZ3k2N2GToeg7WaZHSfPUvQW7U+atCCOiNbK4e7e3eXbvK8pL7zV3aa7FZwG2A==} + jest-validate@30.0.0-alpha.6: + resolution: {integrity: sha512-sINLwCenOUeJVzS5p+o1NhwKsY0de5Es0J7bsaSuZJQGRY67W20idceflr+aZ2akrKgvvqU8Tsg6lkFQyq+a6Q==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - jest-watcher@30.0.0-alpha.3: - resolution: {integrity: sha512-prny+JoMv+1jtIpLP3CxHPseXPlUGPGOrslFPWCDJ9NoIMqmjxwe5KlTrNwbDnP/zMUPPYfaIbKZD9XiSmq78g==} + jest-watcher@30.0.0-alpha.6: + resolution: {integrity: sha512-+zL1y3GSJG8EOxVSc2p0dndis0rNDcwKTs4b1bpNTI0XneeTiZlCpRBNYI+sqBl/eZtJBrQdiBRSYz7kJqg7NQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-worker@30.0.0-alpha.3: - resolution: {integrity: sha512-8lS9LxbEjOyBRz0Pdi6m3HYJ3feIi1tv0u7oqxjXvB1lMksq+IcSxaPTCcvJbIqt3WAFFYQnDs5I3NkJiEG5Ow==} + jest-worker@30.0.0-alpha.6: + resolution: {integrity: sha512-qlzX7zFT/QdUV/LWsJwZBlaIBaJ+E2VH3d1gArGVP+9hUHGpJkEzCSBK7yuZrkt+M/U0Jre5+maPRmkinEF4DA==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - jest@30.0.0-alpha.3: - resolution: {integrity: sha512-oJndFRnG1Xsc1ybac44hGGj7+O4nT9losg8+8YDjNwDAXbYwvzyRgmCiPo6L/BROiAD8Z9qGgFRsFuGdpmQuFw==} + jest@30.0.0-alpha.6: + resolution: {integrity: sha512-9T3nAcIAcEpCX2MdxcjG2IDfG/0tjumnCkVNGh+AKkRXcWF4Er5jLROKvXsgXUJCmr/nMqLF6LG0GrDJ0kjFag==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} hasBin: true peerDependencies: @@ -2769,12 +2923,25 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} linkify-it@3.0.3: resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} + lint-staged@15.2.9: + resolution: {integrity: sha512-BZAt8Lk3sEnxw7tfxM7jeZlPRuT4M68O0/CwZhhaw6eeWu0Lz5eERE3m386InivXB64fp/mDID452h48tvKlRQ==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.2.4: + resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==} + engines: {node: '>=18.0.0'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -2820,6 +2987,10 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + log@6.3.1: resolution: {integrity: sha512-McG47rJEWOkXTDioZzQNydAVvZNeEkSyLJ1VWkFwfW+o1knW+QSi8D1KjPn/TnctV+q99lkvJNe1f0E1IjfY2A==} @@ -2895,6 +3066,10 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -2917,6 +3092,14 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} @@ -2939,17 +3122,17 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + engines: {node: '>= 18'} mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} @@ -2960,6 +3143,11 @@ packages: engines: {node: '>=10'} hasBin: true + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + mrmime@2.0.0: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} engines: {node: '>=10'} @@ -3023,6 +3211,10 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3063,6 +3255,14 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} @@ -3150,6 +3350,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-loader@1.0.12: resolution: {integrity: sha512-n7oDG8B+k/p818uweWrOixY9/Dsr89o2TkCm6tOTex3fpdo2+BFDgR+KpB37mGKBRsBAlR8CIJMFN0OEy/7hIQ==} @@ -3185,9 +3389,14 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@3.0.1: - resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} - engines: {node: '>=10'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} @@ -3234,8 +3443,8 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-format@30.0.0-alpha.3: - resolution: {integrity: sha512-b1mhTF/vbYJaXOdRY0nFMwzHHpWCs0QNYJA5ImcOpQ99QZqCHqU8C+lbGoWwC3X9QEjAYJ+N5+Vmc/MXbXCZDA==} + pretty-format@30.0.0-alpha.6: + resolution: {integrity: sha512-xkeffkZoqQmRrcNewpOsUCKNOl+CkPqjt3Ld749uz1S7/O7GuPNPv2fZk3v/1U/FE8/B4Zz0llVL80MKON1tOQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} process-nextick-args@2.0.1: @@ -3358,15 +3567,26 @@ packages: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -3480,6 +3700,14 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + sort-keys-length@1.0.1: resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} engines: {node: '>=0.10.0'} @@ -3521,6 +3749,10 @@ packages: stream-promise@3.2.0: resolution: {integrity: sha512-P+7muTGs2C8yRcgJw/PPt61q7O517tDHiwYEzMWo1GSBCcZedUMT/clz7vUNsSxFphIlJ6QUL4GexQKlfJoVtA==} + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -3533,6 +3765,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + string.prototype.trim@1.2.8: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} @@ -3572,6 +3808,10 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -3632,9 +3872,9 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} - engines: {node: '>=10'} + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} @@ -3703,12 +3943,13 @@ packages: peerDependencies: typescript: '>=3.7.0' - ts-jest@29.1.2: - resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} - engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} + ts-jest@29.2.4: + resolution: {integrity: sha512-3d6tgDyhCI29HlpwIq87sNuI+3Q6GLTTCeYRHCs7vDz+/3GCMwEtV9jezLyl4ZtnBgx00I7hm8PCP8cTksMGrw==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 '@jest/types': ^29.0.0 babel-jest: ^29.0.0 esbuild: '*' @@ -3717,6 +3958,8 @@ packages: peerDependenciesMeta: '@babel/core': optional: true + '@jest/transform': + optional: true '@jest/types': optional: true babel-jest: @@ -3901,6 +4144,10 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -3912,12 +4159,12 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true @@ -3949,9 +4196,18 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml-ast-parser@0.0.43: resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + engines: {node: '>= 14'} + hasBin: true + yamljs@0.3.0: resolution: {integrity: sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==} hasBin: true @@ -3983,7 +4239,7 @@ snapshots: 2-thenable@1.0.0: dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.64 '@aashutoshrathi/word-wrap@1.2.6': {} @@ -3992,6 +4248,12 @@ snapshots: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.21 + '@aws-cdk/asset-awscli-v1@2.2.202': {} + + '@aws-cdk/asset-kubectl-v20@2.1.2': {} + + '@aws-cdk/asset-node-proxy-agent-v6@2.0.3': {} + '@aws-crypto/crc32@3.0.0': dependencies: '@aws-crypto/util': 3.0.0 @@ -4087,7 +4349,7 @@ snapshots: '@smithy/util-retry': 2.1.1 '@smithy/util-utf8': 2.1.1 '@smithy/util-waiter': 2.1.1 - fast-xml-parser: 4.2.5 + fast-xml-parser: 4.4.1 tslib: 2.6.2 uuid: 8.3.2 transitivePeerDependencies: @@ -4151,7 +4413,7 @@ snapshots: '@smithy/util-stream': 2.1.1 '@smithy/util-utf8': 2.1.1 '@smithy/util-waiter': 2.1.1 - fast-xml-parser: 4.2.5 + fast-xml-parser: 4.4.1 tslib: 2.6.2 transitivePeerDependencies: - aws-crt @@ -4322,10 +4584,10 @@ snapshots: '@smithy/util-defaults-mode-browser': 2.1.1 '@smithy/util-defaults-mode-node': 2.1.1 '@smithy/util-endpoints': 1.1.1 - '@smithy/util-middleware': 2.0.9 + '@smithy/util-middleware': 2.1.1 '@smithy/util-retry': 2.1.1 '@smithy/util-utf8': 2.1.1 - fast-xml-parser: 4.2.5 + fast-xml-parser: 4.4.1 tslib: 2.6.2 transitivePeerDependencies: - aws-crt @@ -4370,7 +4632,7 @@ snapshots: '@smithy/util-middleware': 2.1.1 '@smithy/util-retry': 2.1.1 '@smithy/util-utf8': 2.1.1 - fast-xml-parser: 4.2.5 + fast-xml-parser: 4.4.1 tslib: 2.6.2 transitivePeerDependencies: - aws-crt @@ -5106,6 +5368,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -5116,47 +5382,49 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/console@30.0.0-alpha.3': + '@jest/console@30.0.0-alpha.6': dependencies: - '@jest/types': 30.0.0-alpha.3 + '@jest/types': 30.0.0-alpha.6 '@types/node': 20.11.20 chalk: 4.1.2 - jest-message-util: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 + jest-message-util: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 slash: 3.0.0 - '@jest/core@30.0.0-alpha.3': + '@jest/core@30.0.0-alpha.6': dependencies: - '@jest/console': 30.0.0-alpha.3 - '@jest/reporters': 30.0.0-alpha.3 - '@jest/test-result': 30.0.0-alpha.3 - '@jest/transform': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 + '@jest/console': 30.0.0-alpha.6 + '@jest/pattern': 30.0.0-alpha.6 + '@jest/reporters': 30.0.0-alpha.6 + '@jest/test-result': 30.0.0-alpha.6 + '@jest/transform': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 '@types/node': 20.11.20 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.0.0 exit: 0.1.2 graceful-fs: 4.2.11 - jest-changed-files: 30.0.0-alpha.3 - jest-config: 30.0.0-alpha.3(@types/node@20.11.20) - jest-haste-map: 30.0.0-alpha.3 - jest-message-util: 30.0.0-alpha.3 - jest-regex-util: 30.0.0-alpha.3 - jest-resolve: 30.0.0-alpha.3 - jest-resolve-dependencies: 30.0.0-alpha.3 - jest-runner: 30.0.0-alpha.3 - jest-runtime: 30.0.0-alpha.3 - jest-snapshot: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 - jest-validate: 30.0.0-alpha.3 - jest-watcher: 30.0.0-alpha.3 - micromatch: 4.0.5 - pretty-format: 30.0.0-alpha.3 + jest-changed-files: 30.0.0-alpha.6 + jest-config: 30.0.0-alpha.6(@types/node@20.11.20) + jest-haste-map: 30.0.0-alpha.6 + jest-message-util: 30.0.0-alpha.6 + jest-regex-util: 30.0.0-alpha.6 + jest-resolve: 30.0.0-alpha.6 + jest-resolve-dependencies: 30.0.0-alpha.6 + jest-runner: 30.0.0-alpha.6 + jest-runtime: 30.0.0-alpha.6 + jest-snapshot: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 + jest-validate: 30.0.0-alpha.6 + jest-watcher: 30.0.0-alpha.6 + micromatch: 4.0.7 + pretty-format: 30.0.0-alpha.6 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: - babel-plugin-macros + - esbuild-register - supports-color - ts-node @@ -5167,20 +5435,20 @@ snapshots: '@types/node': 20.11.20 jest-mock: 29.7.0 - '@jest/environment@30.0.0-alpha.3': + '@jest/environment@30.0.0-alpha.6': dependencies: - '@jest/fake-timers': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 + '@jest/fake-timers': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 '@types/node': 20.11.20 - jest-mock: 30.0.0-alpha.3 + jest-mock: 30.0.0-alpha.6 '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 - '@jest/expect-utils@30.0.0-alpha.3': + '@jest/expect-utils@30.0.0-alpha.6': dependencies: - jest-get-type: 30.0.0-alpha.3 + jest-get-type: 30.0.0-alpha.6 '@jest/expect@29.7.0': dependencies: @@ -5189,10 +5457,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/expect@30.0.0-alpha.3': + '@jest/expect@30.0.0-alpha.6': dependencies: - expect: 30.0.0-alpha.3 - jest-snapshot: 30.0.0-alpha.3 + expect: 30.0.0-alpha.6 + jest-snapshot: 30.0.0-alpha.6 transitivePeerDependencies: - supports-color @@ -5205,14 +5473,14 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 - '@jest/fake-timers@30.0.0-alpha.3': + '@jest/fake-timers@30.0.0-alpha.6': dependencies: - '@jest/types': 30.0.0-alpha.3 + '@jest/types': 30.0.0-alpha.6 '@sinonjs/fake-timers': 11.2.2 '@types/node': 20.11.20 - jest-message-util: 30.0.0-alpha.3 - jest-mock: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 + jest-message-util: 30.0.0-alpha.6 + jest-mock: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 '@jest/globals@29.7.0': dependencies: @@ -5223,22 +5491,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/globals@30.0.0-alpha.3': + '@jest/globals@30.0.0-alpha.6': dependencies: - '@jest/environment': 30.0.0-alpha.3 - '@jest/expect': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 - jest-mock: 30.0.0-alpha.3 + '@jest/environment': 30.0.0-alpha.6 + '@jest/expect': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 + jest-mock: 30.0.0-alpha.6 transitivePeerDependencies: - supports-color - '@jest/reporters@30.0.0-alpha.3': + '@jest/pattern@30.0.0-alpha.6': + dependencies: + '@types/node': 20.11.20 + jest-regex-util: 30.0.0-alpha.6 + + '@jest/reporters@30.0.0-alpha.6': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.0.0-alpha.3 - '@jest/test-result': 30.0.0-alpha.3 - '@jest/transform': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 + '@jest/console': 30.0.0-alpha.6 + '@jest/test-result': 30.0.0-alpha.6 + '@jest/transform': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 '@jridgewell/trace-mapping': 0.3.21 '@types/node': 20.11.20 chalk: 4.1.2 @@ -5249,11 +5522,11 @@ snapshots: istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.1 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 + istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.6 - jest-message-util: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 - jest-worker: 30.0.0-alpha.3 + jest-message-util: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 + jest-worker: 30.0.0-alpha.6 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 @@ -5265,28 +5538,35 @@ snapshots: dependencies: '@sinclair/typebox': 0.27.8 - '@jest/schemas@30.0.0-alpha.3': + '@jest/schemas@30.0.0-alpha.6': dependencies: - '@sinclair/typebox': 0.32.14 + '@sinclair/typebox': 0.33.7 - '@jest/source-map@30.0.0-alpha.3': + '@jest/snapshot-utils@30.0.0-alpha.6': + dependencies: + '@jest/types': 30.0.0-alpha.6 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + + '@jest/source-map@30.0.0-alpha.6': dependencies: '@jridgewell/trace-mapping': 0.3.21 callsites: 3.1.0 graceful-fs: 4.2.11 - '@jest/test-result@30.0.0-alpha.3': + '@jest/test-result@30.0.0-alpha.6': dependencies: - '@jest/console': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 + '@jest/console': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@30.0.0-alpha.3': + '@jest/test-sequencer@30.0.0-alpha.6': dependencies: - '@jest/test-result': 30.0.0-alpha.3 + '@jest/test-result': 30.0.0-alpha.6 graceful-fs: 4.2.11 - jest-haste-map: 30.0.0-alpha.3 + jest-haste-map: 30.0.0-alpha.6 slash: 3.0.0 '@jest/transform@29.7.0': @@ -5309,20 +5589,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/transform@30.0.0-alpha.3': + '@jest/transform@30.0.0-alpha.6': dependencies: '@babel/core': 7.23.9 - '@jest/types': 30.0.0-alpha.3 + '@jest/types': 30.0.0-alpha.6 '@jridgewell/trace-mapping': 0.3.21 - babel-plugin-istanbul: 6.1.1 + babel-plugin-istanbul: 7.0.0 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 30.0.0-alpha.3 - jest-regex-util: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 - micromatch: 4.0.5 + jest-haste-map: 30.0.0-alpha.6 + jest-regex-util: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 + micromatch: 4.0.7 pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 5.0.1 @@ -5338,9 +5618,10 @@ snapshots: '@types/yargs': 17.0.32 chalk: 4.1.2 - '@jest/types@30.0.0-alpha.3': + '@jest/types@30.0.0-alpha.6': dependencies: - '@jest/schemas': 30.0.0-alpha.3 + '@jest/pattern': 30.0.0-alpha.6 + '@jest/schemas': 30.0.0-alpha.6 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 '@types/node': 20.11.20 @@ -5364,6 +5645,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jsdoc/salty@0.2.7': dependencies: lodash: 4.17.21 @@ -5393,10 +5679,10 @@ snapshots: '@pkgr/core@0.1.1': {} - '@serverless/dashboard-plugin@7.2.0(supports-color@8.1.1)': + '@serverless/dashboard-plugin@7.2.0(@aws-sdk/credential-provider-node@3.511.0)(supports-color@8.1.1)': dependencies: '@aws-sdk/client-cloudformation': 3.490.0 - '@aws-sdk/client-sts': 3.490.0 + '@aws-sdk/client-sts': 3.511.0(@aws-sdk/credential-provider-node@3.511.0) '@serverless/event-mocks': 1.1.1 '@serverless/platform-client': 4.5.1(supports-color@8.1.1) '@serverless/utils': 6.15.0 @@ -5419,6 +5705,7 @@ snapshots: uuid: 8.3.2 yamljs: 0.3.0 transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' - aws-crt - bufferutil - debug @@ -5435,11 +5722,11 @@ snapshots: dependencies: adm-zip: 0.5.10 archiver: 5.3.2 - axios: 1.6.5 + axios: 1.7.4 fast-glob: 3.3.2 https-proxy-agent: 5.0.1(supports-color@8.1.1) ignore: 5.3.0 - isomorphic-ws: 4.0.1(ws@7.5.9) + isomorphic-ws: 4.0.1(ws@8.18.0) js-yaml: 3.14.1 jwt-decode: 2.2.0 minimatch: 3.1.2 @@ -5447,7 +5734,7 @@ snapshots: run-parallel-limit: 1.1.0 throat: 5.0.0 traverse: 0.6.8 - ws: 7.5.9 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - debug @@ -5494,7 +5781,7 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sinclair/typebox@0.32.14': {} + '@sinclair/typebox@0.33.7': {} '@sindresorhus/is@4.6.0': {} @@ -5789,11 +6076,6 @@ snapshots: dependencies: tslib: 2.6.2 - '@smithy/util-middleware@2.0.9': - dependencies: - '@smithy/types': 2.9.1 - tslib: 2.6.2 - '@smithy/util-middleware@2.1.1': dependencies: '@smithy/types': 2.9.1 @@ -6055,6 +6337,10 @@ snapshots: dependencies: type-fest: 0.21.3 + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} @@ -6183,6 +6469,13 @@ snapshots: available-typed-arrays@1.0.5: {} + aws-cdk-lib@2.152.0(constructs@10.3.0): + dependencies: + '@aws-cdk/asset-awscli-v1': 2.2.202 + '@aws-cdk/asset-kubectl-v20': 2.1.2 + '@aws-cdk/asset-node-proxy-agent-v6': 2.0.3 + constructs: 10.3.0 + aws-sdk@2.1546.0: dependencies: buffer: 4.9.2 @@ -6196,21 +6489,21 @@ snapshots: uuid: 8.0.0 xml2js: 0.6.2 - axios@1.6.5: + axios@1.7.4: dependencies: - follow-redirects: 1.15.4 + follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - babel-jest@30.0.0-alpha.3(@babel/core@7.23.9): + babel-jest@30.0.0-alpha.6(@babel/core@7.23.9): dependencies: '@babel/core': 7.23.9 - '@jest/transform': 30.0.0-alpha.3 + '@jest/transform': 30.0.0-alpha.6 '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 30.0.0-alpha.3(@babel/core@7.23.9) + babel-plugin-istanbul: 7.0.0 + babel-preset-jest: 30.0.0-alpha.6(@babel/core@7.23.9) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -6227,12 +6520,21 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@30.0.0-alpha.3: + babel-plugin-istanbul@7.0.0: + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 6.0.3 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@30.0.0-alpha.6: dependencies: '@babel/template': 7.23.9 '@babel/types': 7.23.9 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.5 babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): dependencies: @@ -6250,10 +6552,10 @@ snapshots: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) - babel-preset-jest@30.0.0-alpha.3(@babel/core@7.23.9): + babel-preset-jest@30.0.0-alpha.6(@babel/core@7.23.9): dependencies: '@babel/core': 7.23.9 - babel-plugin-jest-hoist: 30.0.0-alpha.3 + babel-plugin-jest-hoist: 30.0.0-alpha.6 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) balanced-match@1.0.2: {} @@ -6290,9 +6592,9 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 browserslist@4.22.2: dependencies: @@ -6385,6 +6687,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.3.0: {} + char-regex@1.0.2: {} chardet@0.7.0: {} @@ -6392,7 +6696,7 @@ snapshots: child-process-ext@2.1.1: dependencies: cross-spawn: 6.0.5 - es5-ext: 0.10.62 + es5-ext: 0.10.64 log: 6.3.1 split2: 3.2.2 stream-promise: 3.2.0 @@ -6400,7 +6704,7 @@ snapshots: child-process-ext@3.0.2: dependencies: cross-spawn: 7.0.3 - es5-ext: 0.10.62 + es5-ext: 0.10.64 log: 6.3.1 split2: 3.2.2 stream-promise: 3.2.0 @@ -6408,7 +6712,7 @@ snapshots: chokidar@3.5.3: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -6417,7 +6721,7 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chownr@2.0.0: {} + chownr@3.0.0: {} ci-info@3.9.0: {} @@ -6428,7 +6732,7 @@ snapshots: cli-color@2.0.3: dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.64 es6-iterator: 2.0.3 memoizee: 0.4.15 timers-ext: 0.1.7 @@ -6437,11 +6741,15 @@ snapshots: dependencies: restore-cursor: 3.1.0 + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + cli-progress-footer@2.3.2: dependencies: cli-color: 2.0.3 d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.64 mute-stream: 0.0.8 process-utils: 4.0.0 timers-ext: 0.1.7 @@ -6452,10 +6760,15 @@ snapshots: cli-sprintf-format@1.1.1: dependencies: cli-color: 2.0.3 - es5-ext: 0.10.62 + es5-ext: 0.10.64 sprintf-kit: 2.0.1 supports-color: 6.1.0 + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + cli-width@3.0.0: {} cliui@8.0.1: @@ -6496,6 +6809,8 @@ snapshots: color-convert: 1.9.3 color-string: 1.9.1 + colorette@2.0.20: {} + colorspace@1.1.4: dependencies: color: 3.2.1 @@ -6505,6 +6820,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + commander@12.1.0: {} + commander@2.20.3: {} commander@4.1.1: {} @@ -6520,6 +6837,8 @@ snapshots: concat-map@0.0.1: {} + constructs@10.3.0: {} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -6555,7 +6874,7 @@ snapshots: d@1.0.1: dependencies: - es5-ext: 0.10.62 + es5-ext: 0.10.64 type: 1.2.0 dayjs@1.11.10: {} @@ -6570,6 +6889,10 @@ snapshots: optionalDependencies: supports-color: 8.1.1 + debug@4.3.6: + dependencies: + ms: 2.1.2 + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -6627,7 +6950,7 @@ snapshots: deferred@0.7.11: dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.64 event-emitter: 0.3.5 next-tick: 1.1.0 timers-ext: 0.1.7 @@ -6657,7 +6980,7 @@ snapshots: diff-sequences@29.6.3: {} - diff-sequences@30.0.0-alpha.3: {} + diff-sequences@30.0.0-alpha.6: {} dir-glob@3.0.1: dependencies: @@ -6678,14 +7001,20 @@ snapshots: duration@0.2.2: dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.64 eastasianwidth@0.2.0: {} + ejs@3.1.10: + dependencies: + jake: 10.9.2 + electron-to-chromium@1.4.636: {} emittery@0.13.1: {} + emoji-regex@10.3.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -6703,6 +7032,8 @@ snapshots: entities@2.1.0: {} + environment@1.1.0: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -6765,22 +7096,23 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - es5-ext@0.10.62: + es5-ext@0.10.64: dependencies: es6-iterator: 2.0.3 es6-symbol: 3.1.3 + esniff: 2.0.1 next-tick: 1.1.0 es6-iterator@2.0.3: dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.64 es6-symbol: 3.1.3 es6-set@0.1.6: dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.64 es6-iterator: 2.0.3 es6-symbol: 3.1.3 event-emitter: 0.3.5 @@ -6794,7 +7126,7 @@ snapshots: es6-weak-map@2.0.3: dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.64 es6-iterator: 2.0.3 es6-symbol: 3.1.3 @@ -6935,7 +7267,14 @@ snapshots: esniff@1.1.3: dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.64 + + esniff@2.0.1: + dependencies: + d: 1.0.1 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.2 espree@9.6.1: dependencies: @@ -6964,12 +7303,14 @@ snapshots: event-emitter@0.3.5: dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.64 event-target-shim@5.0.1: {} eventemitter3@4.0.7: {} + eventemitter3@5.0.1: {} + events@1.1.1: {} events@3.3.0: {} @@ -6986,6 +7327,18 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + exit@0.1.2: {} expect@29.7.0: @@ -6996,13 +7349,14 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - expect@30.0.0-alpha.3: + expect@30.0.0-alpha.6: dependencies: - '@jest/expect-utils': 30.0.0-alpha.3 - jest-get-type: 30.0.0-alpha.3 - jest-matcher-utils: 30.0.0-alpha.3 - jest-message-util: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 + '@jest/expect-utils': 30.0.0-alpha.6 + jest-get-type: 30.0.0-alpha.6 + jest-matcher-utils: 30.0.0-alpha.6 + jest-message-util: 30.0.0-alpha.6 + jest-mock: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 ext-list@2.2.2: dependencies: @@ -7041,7 +7395,7 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-xml-parser@4.2.5: + fast-xml-parser@4.4.1: dependencies: strnum: 1.0.5 @@ -7083,6 +7437,10 @@ snapshots: file-type@6.2.0: {} + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + filename-reserved-regex@2.0.0: {} filenamify@4.3.0: @@ -7093,13 +7451,13 @@ snapshots: filesize@10.1.0: {} - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 find-requires@1.0.0: dependencies: - es5-ext: 0.10.62 + es5-ext: 0.10.64 esniff: 1.1.3 find-up@4.1.0: @@ -7124,7 +7482,7 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.15.4: {} + follow-redirects@1.15.6: {} for-each@0.3.3: dependencies: @@ -7163,17 +7521,13 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fs.realpath@1.0.0: {} fs2@0.3.9: dependencies: d: 1.0.1 deferred: 0.7.11 - es5-ext: 0.10.62 + es5-ext: 0.10.64 event-emitter: 0.3.5 ignore: 5.3.0 memoizee: 0.4.15 @@ -7197,6 +7551,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.2.0: {} + get-intrinsic@1.2.2: dependencies: function-bind: 1.1.2 @@ -7219,6 +7575,8 @@ snapshots: get-stream@6.0.1: {} + get-stream@8.0.1: {} + get-symbol-description@1.0.0: dependencies: call-bind: 1.0.5 @@ -7344,7 +7702,7 @@ snapshots: http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.4 + follow-redirects: 1.15.6 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -7382,6 +7740,8 @@ snapshots: human-signals@2.1.0: {} + human-signals@5.0.0: {} + husky@9.0.10: {} iconv-lite@0.4.24: @@ -7491,6 +7851,12 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + is-generator-fn@2.1.0: {} is-generator-function@1.0.10: @@ -7532,6 +7898,8 @@ snapshots: is-stream@2.0.1: {} + is-stream@3.0.0: {} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.0 @@ -7560,9 +7928,9 @@ snapshots: isexe@2.0.0: {} - isomorphic-ws@4.0.1(ws@7.5.9): + isomorphic-ws@4.0.1(ws@8.18.0): dependencies: - ws: 7.5.9 + ws: 8.18.0 istanbul-lib-coverage@3.2.2: {} @@ -7586,17 +7954,27 @@ snapshots: transitivePeerDependencies: - supports-color + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.23.9 + '@babel/parser': 7.23.9 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@4.0.1: + istanbul-lib-source-maps@5.0.6: dependencies: + '@jridgewell/trace-mapping': 0.3.25 debug: 4.3.4(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 transitivePeerDependencies: - supports-color @@ -7611,31 +7989,38 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jest-changed-files@30.0.0-alpha.3: + jake@10.9.2: + dependencies: + async: 3.2.5 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-changed-files@30.0.0-alpha.6: dependencies: execa: 5.1.1 - jest-util: 30.0.0-alpha.3 + jest-util: 30.0.0-alpha.6 p-limit: 3.1.0 - jest-circus@30.0.0-alpha.3: + jest-circus@30.0.0-alpha.6: dependencies: - '@jest/environment': 30.0.0-alpha.3 - '@jest/expect': 30.0.0-alpha.3 - '@jest/test-result': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 + '@jest/environment': 30.0.0-alpha.6 + '@jest/expect': 30.0.0-alpha.6 + '@jest/test-result': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 '@types/node': 20.11.20 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 is-generator-fn: 2.1.0 - jest-each: 30.0.0-alpha.3 - jest-matcher-utils: 30.0.0-alpha.3 - jest-message-util: 30.0.0-alpha.3 - jest-runtime: 30.0.0-alpha.3 - jest-snapshot: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 + jest-each: 30.0.0-alpha.6 + jest-matcher-utils: 30.0.0-alpha.6 + jest-message-util: 30.0.0-alpha.6 + jest-runtime: 30.0.0-alpha.6 + jest-snapshot: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 p-limit: 3.1.0 - pretty-format: 30.0.0-alpha.3 + pretty-format: 30.0.0-alpha.6 pure-rand: 6.0.4 slash: 3.0.0 stack-utils: 2.0.6 @@ -7643,46 +8028,49 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.0.0-alpha.3(@types/node@20.11.20): + jest-cli@30.0.0-alpha.6(@types/node@20.11.20): dependencies: - '@jest/core': 30.0.0-alpha.3 - '@jest/test-result': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 + '@jest/core': 30.0.0-alpha.6 + '@jest/test-result': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 chalk: 4.1.2 exit: 0.1.2 import-local: 3.1.0 - jest-config: 30.0.0-alpha.3(@types/node@20.11.20) - jest-util: 30.0.0-alpha.3 - jest-validate: 30.0.0-alpha.3 + jest-config: 30.0.0-alpha.6(@types/node@20.11.20) + jest-util: 30.0.0-alpha.6 + jest-validate: 30.0.0-alpha.6 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' - babel-plugin-macros + - esbuild-register - supports-color - ts-node - jest-config@30.0.0-alpha.3(@types/node@20.11.20): + jest-config@30.0.0-alpha.6(@types/node@20.11.20): dependencies: '@babel/core': 7.23.9 - '@jest/test-sequencer': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 - babel-jest: 30.0.0-alpha.3(@babel/core@7.23.9) + '@jest/pattern': 30.0.0-alpha.6 + '@jest/test-sequencer': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 + babel-jest: 30.0.0-alpha.6(@babel/core@7.23.9) chalk: 4.1.2 ci-info: 4.0.0 deepmerge: 4.3.1 glob: 10.3.10 graceful-fs: 4.2.11 - jest-circus: 30.0.0-alpha.3 - jest-environment-node: 30.0.0-alpha.3 - jest-get-type: 30.0.0-alpha.3 - jest-regex-util: 30.0.0-alpha.3 - jest-resolve: 30.0.0-alpha.3 - jest-runner: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 - jest-validate: 30.0.0-alpha.3 - micromatch: 4.0.5 + jest-circus: 30.0.0-alpha.6 + jest-docblock: 30.0.0-alpha.6 + jest-environment-node: 30.0.0-alpha.6 + jest-get-type: 30.0.0-alpha.6 + jest-regex-util: 30.0.0-alpha.6 + jest-resolve: 30.0.0-alpha.6 + jest-runner: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 + jest-validate: 30.0.0-alpha.6 + micromatch: 4.0.7 parse-json: 5.2.0 - pretty-format: 30.0.0-alpha.3 + pretty-format: 30.0.0-alpha.6 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: @@ -7698,37 +8086,37 @@ snapshots: jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-diff@30.0.0-alpha.3: + jest-diff@30.0.0-alpha.6: dependencies: chalk: 4.1.2 - diff-sequences: 30.0.0-alpha.3 - jest-get-type: 30.0.0-alpha.3 - pretty-format: 30.0.0-alpha.3 + diff-sequences: 30.0.0-alpha.6 + jest-get-type: 30.0.0-alpha.6 + pretty-format: 30.0.0-alpha.6 - jest-docblock@30.0.0-alpha.3: + jest-docblock@30.0.0-alpha.6: dependencies: detect-newline: 3.1.0 - jest-each@30.0.0-alpha.3: + jest-each@30.0.0-alpha.6: dependencies: - '@jest/types': 30.0.0-alpha.3 + '@jest/types': 30.0.0-alpha.6 chalk: 4.1.2 - jest-get-type: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 - pretty-format: 30.0.0-alpha.3 + jest-get-type: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 + pretty-format: 30.0.0-alpha.6 - jest-environment-node@30.0.0-alpha.3: + jest-environment-node@30.0.0-alpha.6: dependencies: - '@jest/environment': 30.0.0-alpha.3 - '@jest/fake-timers': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 + '@jest/environment': 30.0.0-alpha.6 + '@jest/fake-timers': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 '@types/node': 20.11.20 - jest-mock: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 + jest-mock: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 jest-get-type@29.6.3: {} - jest-get-type@30.0.0-alpha.3: {} + jest-get-type@30.0.0-alpha.6: {} jest-haste-map@29.7.0: dependencies: @@ -7746,25 +8134,25 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - jest-haste-map@30.0.0-alpha.3: + jest-haste-map@30.0.0-alpha.6: dependencies: - '@jest/types': 30.0.0-alpha.3 + '@jest/types': 30.0.0-alpha.6 '@types/node': 20.11.20 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 - jest-regex-util: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 - jest-worker: 30.0.0-alpha.3 - micromatch: 4.0.5 + jest-regex-util: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 + jest-worker: 30.0.0-alpha.6 + micromatch: 4.0.7 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 - jest-leak-detector@30.0.0-alpha.3: + jest-leak-detector@30.0.0-alpha.6: dependencies: - jest-get-type: 30.0.0-alpha.3 - pretty-format: 30.0.0-alpha.3 + jest-get-type: 30.0.0-alpha.6 + pretty-format: 30.0.0-alpha.6 jest-matcher-utils@29.7.0: dependencies: @@ -7773,12 +8161,12 @@ snapshots: jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-matcher-utils@30.0.0-alpha.3: + jest-matcher-utils@30.0.0-alpha.6: dependencies: chalk: 4.1.2 - jest-diff: 30.0.0-alpha.3 - jest-get-type: 30.0.0-alpha.3 - pretty-format: 30.0.0-alpha.3 + jest-diff: 30.0.0-alpha.6 + jest-get-type: 30.0.0-alpha.6 + pretty-format: 30.0.0-alpha.6 jest-message-util@29.7.0: dependencies: @@ -7792,21 +8180,21 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-message-util@30.0.0-alpha.3: + jest-message-util@30.0.0-alpha.6: dependencies: '@babel/code-frame': 7.23.5 - '@jest/types': 30.0.0-alpha.3 + '@jest/types': 30.0.0-alpha.6 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 30.0.0-alpha.3 + micromatch: 4.0.7 + pretty-format: 30.0.0-alpha.6 slash: 3.0.0 stack-utils: 2.0.6 - jest-mock-extended@3.0.5(jest@30.0.0-alpha.3(@types/node@20.11.20))(typescript@5.3.3): + jest-mock-extended@3.0.5(jest@30.0.0-alpha.6(@types/node@20.11.20))(typescript@5.3.3): dependencies: - jest: 30.0.0-alpha.3(@types/node@20.11.20) + jest: 30.0.0-alpha.6(@types/node@20.11.20) ts-essentials: 7.0.3(typescript@5.3.3) typescript: 5.3.3 @@ -7816,87 +8204,87 @@ snapshots: '@types/node': 20.11.20 jest-util: 29.7.0 - jest-mock@30.0.0-alpha.3: + jest-mock@30.0.0-alpha.6: dependencies: - '@jest/types': 30.0.0-alpha.3 + '@jest/types': 30.0.0-alpha.6 '@types/node': 20.11.20 - jest-util: 30.0.0-alpha.3 + jest-util: 30.0.0-alpha.6 - jest-pnp-resolver@1.2.3(jest-resolve@30.0.0-alpha.3): + jest-pnp-resolver@1.2.3(jest-resolve@30.0.0-alpha.6): optionalDependencies: - jest-resolve: 30.0.0-alpha.3 + jest-resolve: 30.0.0-alpha.6 jest-regex-util@29.6.3: {} - jest-regex-util@30.0.0-alpha.3: {} + jest-regex-util@30.0.0-alpha.6: {} - jest-resolve-dependencies@30.0.0-alpha.3: + jest-resolve-dependencies@30.0.0-alpha.6: dependencies: - jest-regex-util: 30.0.0-alpha.3 - jest-snapshot: 30.0.0-alpha.3 + jest-regex-util: 30.0.0-alpha.6 + jest-snapshot: 30.0.0-alpha.6 transitivePeerDependencies: - supports-color - jest-resolve@30.0.0-alpha.3: + jest-resolve@30.0.0-alpha.6: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 30.0.0-alpha.3 - jest-pnp-resolver: 1.2.3(jest-resolve@30.0.0-alpha.3) - jest-util: 30.0.0-alpha.3 - jest-validate: 30.0.0-alpha.3 + jest-haste-map: 30.0.0-alpha.6 + jest-pnp-resolver: 1.2.3(jest-resolve@30.0.0-alpha.6) + jest-util: 30.0.0-alpha.6 + jest-validate: 30.0.0-alpha.6 resolve: 1.22.8 resolve.exports: 2.0.2 slash: 3.0.0 - jest-runner@30.0.0-alpha.3: + jest-runner@30.0.0-alpha.6: dependencies: - '@jest/console': 30.0.0-alpha.3 - '@jest/environment': 30.0.0-alpha.3 - '@jest/test-result': 30.0.0-alpha.3 - '@jest/transform': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 + '@jest/console': 30.0.0-alpha.6 + '@jest/environment': 30.0.0-alpha.6 + '@jest/test-result': 30.0.0-alpha.6 + '@jest/transform': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 '@types/node': 20.11.20 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 - jest-docblock: 30.0.0-alpha.3 - jest-environment-node: 30.0.0-alpha.3 - jest-haste-map: 30.0.0-alpha.3 - jest-leak-detector: 30.0.0-alpha.3 - jest-message-util: 30.0.0-alpha.3 - jest-resolve: 30.0.0-alpha.3 - jest-runtime: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 - jest-watcher: 30.0.0-alpha.3 - jest-worker: 30.0.0-alpha.3 + jest-docblock: 30.0.0-alpha.6 + jest-environment-node: 30.0.0-alpha.6 + jest-haste-map: 30.0.0-alpha.6 + jest-leak-detector: 30.0.0-alpha.6 + jest-message-util: 30.0.0-alpha.6 + jest-resolve: 30.0.0-alpha.6 + jest-runtime: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 + jest-watcher: 30.0.0-alpha.6 + jest-worker: 30.0.0-alpha.6 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@30.0.0-alpha.3: + jest-runtime@30.0.0-alpha.6: dependencies: - '@jest/environment': 30.0.0-alpha.3 - '@jest/fake-timers': 30.0.0-alpha.3 - '@jest/globals': 30.0.0-alpha.3 - '@jest/source-map': 30.0.0-alpha.3 - '@jest/test-result': 30.0.0-alpha.3 - '@jest/transform': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 + '@jest/environment': 30.0.0-alpha.6 + '@jest/fake-timers': 30.0.0-alpha.6 + '@jest/globals': 30.0.0-alpha.6 + '@jest/source-map': 30.0.0-alpha.6 + '@jest/test-result': 30.0.0-alpha.6 + '@jest/transform': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 '@types/node': 20.11.20 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 glob: 10.3.10 graceful-fs: 4.2.11 - jest-haste-map: 30.0.0-alpha.3 - jest-message-util: 30.0.0-alpha.3 - jest-mock: 30.0.0-alpha.3 - jest-regex-util: 30.0.0-alpha.3 - jest-resolve: 30.0.0-alpha.3 - jest-snapshot: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 + jest-haste-map: 30.0.0-alpha.6 + jest-message-util: 30.0.0-alpha.6 + jest-mock: 30.0.0-alpha.6 + jest-regex-util: 30.0.0-alpha.6 + jest-resolve: 30.0.0-alpha.6 + jest-snapshot: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: @@ -7927,27 +8315,27 @@ snapshots: transitivePeerDependencies: - supports-color - jest-snapshot@30.0.0-alpha.3: + jest-snapshot@30.0.0-alpha.6: dependencies: '@babel/core': 7.23.9 '@babel/generator': 7.23.6 '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.9) '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.9) '@babel/types': 7.23.9 - '@jest/expect-utils': 30.0.0-alpha.3 - '@jest/transform': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 + '@jest/expect-utils': 30.0.0-alpha.6 + '@jest/snapshot-utils': 30.0.0-alpha.6 + '@jest/transform': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) chalk: 4.1.2 - expect: 30.0.0-alpha.3 + expect: 30.0.0-alpha.6 graceful-fs: 4.2.11 - jest-diff: 30.0.0-alpha.3 - jest-get-type: 30.0.0-alpha.3 - jest-matcher-utils: 30.0.0-alpha.3 - jest-message-util: 30.0.0-alpha.3 - jest-util: 30.0.0-alpha.3 - natural-compare: 1.4.0 - pretty-format: 30.0.0-alpha.3 + jest-diff: 30.0.0-alpha.6 + jest-get-type: 30.0.0-alpha.6 + jest-matcher-utils: 30.0.0-alpha.6 + jest-message-util: 30.0.0-alpha.6 + jest-util: 30.0.0-alpha.6 + pretty-format: 30.0.0-alpha.6 semver: 7.5.4 synckit: 0.9.0 transitivePeerDependencies: @@ -7962,33 +8350,33 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 - jest-util@30.0.0-alpha.3: + jest-util@30.0.0-alpha.6: dependencies: - '@jest/types': 30.0.0-alpha.3 + '@jest/types': 30.0.0-alpha.6 '@types/node': 20.11.20 chalk: 4.1.2 ci-info: 4.0.0 graceful-fs: 4.2.11 - picomatch: 3.0.1 + picomatch: 4.0.2 - jest-validate@30.0.0-alpha.3: + jest-validate@30.0.0-alpha.6: dependencies: - '@jest/types': 30.0.0-alpha.3 + '@jest/types': 30.0.0-alpha.6 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 30.0.0-alpha.3 + jest-get-type: 30.0.0-alpha.6 leven: 3.1.0 - pretty-format: 30.0.0-alpha.3 + pretty-format: 30.0.0-alpha.6 - jest-watcher@30.0.0-alpha.3: + jest-watcher@30.0.0-alpha.6: dependencies: - '@jest/test-result': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 + '@jest/test-result': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 '@types/node': 20.11.20 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 30.0.0-alpha.3 + jest-util: 30.0.0-alpha.6 string-length: 4.0.2 jest-worker@29.7.0: @@ -7998,22 +8386,24 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest-worker@30.0.0-alpha.3: + jest-worker@30.0.0-alpha.6: dependencies: '@types/node': 20.11.20 - jest-util: 30.0.0-alpha.3 + '@ungap/structured-clone': 1.2.0 + jest-util: 30.0.0-alpha.6 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.0.0-alpha.3(@types/node@20.11.20): + jest@30.0.0-alpha.6(@types/node@20.11.20): dependencies: - '@jest/core': 30.0.0-alpha.3 - '@jest/types': 30.0.0-alpha.3 + '@jest/core': 30.0.0-alpha.6 + '@jest/types': 30.0.0-alpha.6 import-local: 3.1.0 - jest-cli: 30.0.0-alpha.3(@types/node@20.11.20) + jest-cli: 30.0.0-alpha.6(@types/node@20.11.20) transitivePeerDependencies: - '@types/node' - babel-plugin-macros + - esbuild-register - supports-color - ts-node @@ -8132,12 +8522,38 @@ snapshots: dependencies: immediate: 3.0.6 + lilconfig@3.1.2: {} + lines-and-columns@1.2.4: {} linkify-it@3.0.3: dependencies: uc.micro: 1.0.6 + lint-staged@15.2.9: + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + debug: 4.3.6 + execa: 8.0.1 + lilconfig: 3.1.2 + listr2: 8.2.4 + micromatch: 4.0.7 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.5.0 + transitivePeerDependencies: + - supports-color + + listr2@8.2.4: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -8170,7 +8586,7 @@ snapshots: cli-color: 2.0.3 cli-sprintf-format: 1.1.1 d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.64 log: 6.3.1 sprintf-kit: 2.0.1 supports-color: 8.1.1 @@ -8181,11 +8597,19 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + log@6.3.1: dependencies: d: 1.0.1 duration: 0.2.2 - es5-ext: 0.10.62 + es5-ext: 0.10.64 event-emitter: 0.3.5 sprintf-kit: 2.0.1 type: 2.7.2 @@ -8214,7 +8638,7 @@ snapshots: lru-queue@0.1.0: dependencies: - es5-ext: 0.10.62 + es5-ext: 0.10.64 make-dir@1.3.0: dependencies: @@ -8250,7 +8674,7 @@ snapshots: memoizee@0.4.15: dependencies: d: 1.0.1 - es5-ext: 0.10.62 + es5-ext: 0.10.64 es6-weak-map: 2.0.3 event-emitter: 0.3.5 is-promise: 2.2.2 @@ -8266,7 +8690,12 @@ snapshots: micromatch@4.0.5: dependencies: - braces: 3.0.2 + braces: 3.0.3 + picomatch: 2.3.1 + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} @@ -8281,6 +8710,10 @@ snapshots: mimic-fn@2.1.0: {} + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + mimic-response@1.0.1: {} mimic-response@3.1.0: {} @@ -8299,16 +8732,14 @@ snapshots: minimist@1.2.8: {} - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - minipass@5.0.0: {} - minizlib@2.1.2: + minipass@7.1.2: {} + + minizlib@3.0.1: dependencies: - minipass: 3.3.6 - yallist: 4.0.0 + minipass: 7.1.2 + rimraf: 5.0.10 mkdirp@0.5.6: dependencies: @@ -8316,6 +8747,8 @@ snapshots: mkdirp@1.0.4: {} + mkdirp@3.0.1: {} + mrmime@2.0.0: {} ms@2.1.2: {} @@ -8332,7 +8765,7 @@ snapshots: dependencies: builtin-modules: 3.3.0 deferred: 0.7.11 - es5-ext: 0.10.62 + es5-ext: 0.10.64 es6-set: 0.1.6 ext: 1.7.0 find-requires: 1.0.0 @@ -8375,6 +8808,10 @@ snapshots: dependencies: path-key: 3.1.1 + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -8421,6 +8858,14 @@ snapshots: dependencies: mimic-fn: 2.1.0 + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + open@7.4.2: dependencies: is-docker: 2.2.1 @@ -8508,6 +8953,8 @@ snapshots: path-key@3.1.1: {} + path-key@4.0.0: {} + path-loader@1.0.12(supports-color@8.1.1): dependencies: native-promise-only: 0.8.1 @@ -8536,7 +8983,9 @@ snapshots: picomatch@2.3.1: {} - picomatch@3.0.1: {} + picomatch@4.0.2: {} + + pidtree@0.6.0: {} pify@2.3.0: {} @@ -8576,9 +9025,9 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.2.0 - pretty-format@30.0.0-alpha.3: + pretty-format@30.0.0-alpha.6: dependencies: - '@jest/schemas': 30.0.0-alpha.3 + '@jest/schemas': 30.0.0-alpha.6 ansi-styles: 5.2.0 react-is: 18.2.0 @@ -8693,12 +9142,23 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + reusify@1.0.4: {} + rfdc@1.4.1: {} + rimraf@3.0.2: dependencies: glob: 7.2.3 + rimraf@5.0.10: + dependencies: + glob: 10.3.10 + run-async@2.4.1: {} run-parallel-limit@1.1.0: @@ -8750,9 +9210,9 @@ snapshots: dependencies: lru-cache: 6.0.0 - serverless@3.38.0: + serverless@3.38.0(@aws-sdk/credential-provider-node@3.511.0): dependencies: - '@serverless/dashboard-plugin': 7.2.0(supports-color@8.1.1) + '@serverless/dashboard-plugin': 7.2.0(@aws-sdk/credential-provider-node@3.511.0)(supports-color@8.1.1) '@serverless/platform-client': 4.5.1(supports-color@8.1.1) '@serverless/utils': 6.15.0 abort-controller: 3.0.0 @@ -8787,7 +9247,7 @@ snapshots: json-refs: 3.0.15(supports-color@8.1.1) lodash: 4.17.21 memoizee: 0.4.15 - micromatch: 4.0.5 + micromatch: 4.0.7 node-fetch: 2.7.0 npm-registry-utilities: 1.0.0 object-hash: 3.0.0 @@ -8801,14 +9261,15 @@ snapshots: stream-buffers: 3.0.2 strip-ansi: 6.0.1 supports-color: 8.1.1 - tar: 6.2.0 + tar: 7.4.3 timers-ext: 0.1.7 type: 2.7.2 untildify: 4.0.0 uuid: 9.0.1 - ws: 7.5.9 + ws: 8.18.0 yaml-ast-parser: 0.0.43 transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' - aws-crt - bufferutil - debug @@ -8868,6 +9329,16 @@ snapshots: slash@5.1.0: {} + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + sort-keys-length@1.0.1: dependencies: sort-keys: 1.1.2 @@ -8891,7 +9362,7 @@ snapshots: sprintf-kit@2.0.1: dependencies: - es5-ext: 0.10.62 + es5-ext: 0.10.64 stack-trace@0.0.10: {} @@ -8909,9 +9380,11 @@ snapshots: stream-promise@3.2.0: dependencies: 2-thenable: 1.0.0 - es5-ext: 0.10.62 + es5-ext: 0.10.64 is-stream: 1.1.0 + string-argv@0.3.2: {} + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -8929,6 +9402,12 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string-width@7.2.0: + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + string.prototype.trim@1.2.8: dependencies: call-bind: 1.0.5 @@ -8973,6 +9452,8 @@ snapshots: strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} + strip-json-comments@3.1.1: {} strip-outer@1.0.1: @@ -9050,14 +9531,14 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - tar@6.2.0: + tar@7.4.3: dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 test-exclude@6.0.0: dependencies: @@ -9075,7 +9556,7 @@ snapshots: timers-ext@0.1.7: dependencies: - es5-ext: 0.10.62 + es5-ext: 0.10.64 next-tick: 1.1.0 tmp@0.0.33: @@ -9115,11 +9596,12 @@ snapshots: dependencies: typescript: 5.3.3 - ts-jest@29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(jest@30.0.0-alpha.3(@types/node@20.11.20))(typescript@5.3.3): + ts-jest@29.2.4(@babel/core@7.23.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(jest@30.0.0-alpha.6(@types/node@20.11.20))(typescript@5.3.3): dependencies: bs-logger: 0.2.6 + ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 30.0.0-alpha.3(@types/node@20.11.20) + jest: 30.0.0-alpha.6(@types/node@20.11.20) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -9129,6 +9611,7 @@ snapshots: yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.23.9 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 tsconfig-paths@3.15.0: @@ -9341,6 +9824,12 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} write-file-atomic@4.0.2: @@ -9353,7 +9842,7 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 - ws@7.5.9: {} + ws@8.18.0: {} xml2js@0.6.2: dependencies: @@ -9372,8 +9861,12 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + yaml-ast-parser@0.0.43: {} + yaml@2.5.0: {} + yamljs@0.3.0: dependencies: argparse: 1.0.10 diff --git a/src/errors.ts b/src/errors.ts index 8cd1df2..b6cf942 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -1,6 +1,6 @@ import { ZodError } from 'zod' -import logger from './utils/logger' +import { logger } from './utils/logger' export class InvalidConfigError extends Error { constructor(message: string, issues: ZodError) { diff --git a/src/index.ts b/src/index.ts index e265804..1574e0b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,209 +1,48 @@ -'use strict' - -import { S3Client } from '@aws-sdk/client-s3' +import { Construct } from 'constructs' import Serverless from 'serverless' import ServerlessPlugin from 'serverless/classes/Plugin' -import { InvalidConfigError } from './errors' -import { sync, syncMetadata, syncTags } from './providers/s3/buckets' -import { Custom, Storage, custom } from './schemas/input' -import { IServerless, MethodReturn, SyncResult, TagsSyncResults } from './types' -import logger from './utils/logger' - -/** - * Sync Cloud Storage module. - * @module SyncCloudStorage - */ -class SyncCloudStorage implements ServerlessPlugin { - readonly serverless!: Serverless - readonly options!: Serverless.Options - readonly hooks: ServerlessPlugin.Hooks - readonly commands: ServerlessPlugin.Commands - readonly servicePath: string - readonly config: Custom - readonly logging: ServerlessPlugin.Logging - readonly client: S3Client - readonly _storages: Storage[] = [] - - /** - * @class SyncCloudStorage - * @param {Serverless} serverless - Serverless instance - * @param {Object} options - Serverless CLI options - * @param {Object} logging - Serverless logging module - */ - constructor( - serverless: IServerless, - options: Serverless.Options, - logging: ServerlessPlugin.Logging - ) { - // Typing with *as* makes testing enable to use a DI version of instance - this.serverless = serverless as unknown as Serverless - this.options = options - this.logging = logging - this.servicePath = this.serverless.service.serverless.config.servicePath - - const config = this.serverless.service.custom - const validatedConfig = custom.safeParse(config) - const { success } = validatedConfig - - if (!success) { - const { error } = validatedConfig - throw new InvalidConfigError(error.message, error) - } - - const { data: validConfig } = validatedConfig - - this.config = validConfig - this.client = this.getS3Client() - this._storages = this.config.syncCloudStorage.storages.filter( - (bucket) => bucket.enabled - ) - this.commands = this.setCommands() - this.hooks = this.setHooks() - } - - /** - * Get S3 client. - * @returns {S3Client} - * @memberof SyncCloudStorage - * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3 - * - * @example - * const client = this.getS3Client() - */ - getS3Client(): S3Client { - const endpoint = this.config.syncCloudStorage.offline - ? this.config.syncCloudStorage.endpoint ?? process.env.AWS_ENDPOINT_URL - : undefined - - return new S3Client({ - endpoint, - }) - } - - /** - * Set commands. - * @returns {ServerlessPlugin.Commands} Commands - * @memberof SyncCloudStorage - * - * @example - * const commands = this.setCommands() - */ - setCommands(): ServerlessPlugin.Commands { - return { - scs: { - usage: 'Sync Cloud Storage', - lifecycleEvents: ['storages', 'tags'], - }, - } - } - - /** - * Set hooks. - * @returns {ServerlessPlugin.Hooks} Hooks - * @memberof SyncCloudStorage - * - * @example - * const hooks = this.setHooks() - */ - setHooks(): ServerlessPlugin.Hooks { - const syncStoragesHook = () => this.storages() - const syncTagsHook = () => this.tags() - - return { - 'scs:storages': syncStoragesHook, - 'scs:tags': syncTagsHook, - 'before:offline:start:init': syncStoragesHook, - 'before:deploy:deploy': syncStoragesHook, - } - } - - /** - * Sync storages. - * @private - * @memberof SyncCloudStorage - * - * @example - * const result = await this.storages() - */ - async storages() { - const isPluginDisable = this.disableCheck().result - let result: SyncResult[] = [] - - if (isPluginDisable) { - result.push({ reason: 'Plugin is disabled', status: 'rejected' }) - return { result } - } +import { SyncCloudStorageCdk } from './providers/cdk' +import { SyncCloudStorageServerless } from './providers/serverless' +import { CdkOptions, IServerless, Provider } from './types' - const storagesToSync = this._storages.map((bucket) => - sync(this.client, bucket, this.servicePath) - ) +const isProvider = (provider: Provider): provider is Provider => + provider !== undefined - result = await Promise.allSettled(storagesToSync) +export const isServerlessProvider = ( + provider: IServerless +): provider is IServerless => + isProvider(provider) && + Object.hasOwnProperty.call(provider, 'getProvider') && + provider.getProvider('aws') !== undefined && + provider.service.custom.syncCloudStorage !== undefined - await this.onExit() - - return { result } - } +export const isCdkProvider = (provider: Construct): provider is Construct => + isProvider(provider) && Construct.isConstruct(provider) +export default class SyncCloudStorage { /** - * Sync metadata. - * @memberof SyncCloudStorage - * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3 - * - * @example - * const result = await this.metadata() + * @param {Provider | unknown} provider - Either a Serverless instance or a CDK Construct. + * @param {Serverless.Options | CdkOptions | undefined} [options] - Options for Serverless or CDK. + * @param {ServerlessPlugin.Logging | undefined} [logging] - Optional logging instance (for Serverless). */ - async metadata() { - return await Promise.allSettled( - this._storages.map((bucket) => syncMetadata(this.client, bucket)) - ) - } - - /** - * Sync tags. - * @private - * @memberof SyncCloudStorage - * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3 - * @returns {Promise} - * @example - * const result = await this.tags() - */ - async tags(): Promise { - const isPluginDisable = this.disableCheck().result - - if (isPluginDisable) { - return [{ error: 'Plugin is disabled' }] - } - - return (await Promise.allSettled( - this._storages.map((bucket) => syncTags(this.client, bucket)) - )) as TagsSyncResults - } - - /** - * On exit. - * @private - * @returns {Promise} - * @memberof SyncCloudStorage - * - * @example - * await this.onExit() - */ - async onExit(): Promise { - if (this.client) { - this.client.destroy() - } - } - - private disableCheck(): MethodReturn { - if (this.config.syncCloudStorage.disabled) { - logger.warning('SyncCloudStorage is disabled!') - return { result: true } + constructor( + provider: Provider, + options: Serverless.Options | CdkOptions = {}, + logging?: ServerlessPlugin.Logging + ) { + if (isServerlessProvider(provider as IServerless)) { + return new SyncCloudStorageServerless( + provider as IServerless, + options as Serverless.Options, + logging as ServerlessPlugin.Logging + ) + } else if (isCdkProvider(provider as Construct)) { + return new SyncCloudStorageCdk(provider as Construct, { + syncCloudStorage: options as CdkOptions, + }) + } else { + throw new Error('Provider not found') } - - return { result: false } } } - -export default SyncCloudStorage diff --git a/src/providers/base.ts b/src/providers/base.ts new file mode 100644 index 0000000..d2d6324 --- /dev/null +++ b/src/providers/base.ts @@ -0,0 +1,150 @@ +'use strict' + +import { S3Client } from '@aws-sdk/client-s3' + +import { InvalidConfigError } from '../errors' +import { Storage, customOptions } from '../schemas/input' +import { sync, syncMetadata, syncTags } from '../storages/s3/buckets' +import { + IBaseProvider, + MethodReturn, + ProviderOptions, + SyncMetadataReturn, + SyncResult, + TagsSyncResults, +} from '../types' +import { logger } from '../utils/logger' + +/** + * Base provider class for cloud frameworks. + * @implements {IBaseProvider} + */ +export abstract class BaseProvider implements IBaseProvider { + readonly servicePath: string + readonly options: ProviderOptions + readonly client: S3Client + private readonly _storages: Storage[] = [] + + /** + * @class BaseProvider + * @param {ProviderOptions} options + * @param {string} servicePath - path as working directory + */ + constructor(options: ProviderOptions, servicePath: string) { + this.options = options + this.servicePath = servicePath + const validatedConfig = customOptions.safeParse(options) + const { success } = validatedConfig + + if (!success) { + const { error } = validatedConfig + throw new InvalidConfigError(error.message, error) + } + + logger.silent = !this.options.syncCloudStorage.silent + + this.client = this.getS3Client() + this._storages = this.options.syncCloudStorage.storages.filter( + (bucket) => bucket.enabled + ) + } + + /** + * Get S3 client. + * @memberof BaseProvider + * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3 + * @returns {S3Client} + */ + getS3Client(): S3Client { + const endpoint = this.options.syncCloudStorage.offline + ? this.options.syncCloudStorage.endpoint + : undefined + const region = + this.options.syncCloudStorage.region ?? process.env.AWS_REGION + return new S3Client({ + endpoint, + ...(region ? { region } : {}), + }) + } + + /** + * Sync storages. + * @memberof BaseProvider + * @returns {Promise<{ result: SyncResult[] }>} + */ + async storages(): Promise<{ result: SyncResult[] }> { + const isPluginDisable = this.disableCheck().result + let result: SyncResult[] = [] + + if (isPluginDisable) { + result.push({ reason: 'Plugin is disabled', status: 'rejected' }) + return { result } + } + + const storagesToSync = this._storages.map((bucket) => + sync(this.client, bucket, this.servicePath) + ) + + result = await Promise.allSettled(storagesToSync) + + await this.onExit() + + return { result } + } + /** + * Sync metadata. + * @memberof BaseProvider + * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3 + * @returns {Promise[]>} + */ + async metadata(): Promise[]> { + return await Promise.allSettled( + this._storages.map((bucket) => syncMetadata(this.client, bucket)) + ) + } + + /** + * Sync tags. + * @memberof BaseProvider + * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3 + * @returns {Promise} + */ + async tags(): Promise { + const isPluginDisable = this.disableCheck().result + + if (isPluginDisable) { + return [{ error: 'Plugin is disabled' }] + } + + return (await Promise.allSettled( + this._storages.map((bucket) => syncTags(this.client, bucket)) + )) as TagsSyncResults + } + + /** + * On exit. + * @private + * @returns {Promise} + * @memberof BaseProvider + */ + private async onExit(): Promise { + if (this.client) { + this.client.destroy() + } + } + + /** + * Check if the plugin is disabled. + * @private + * @memberof BaseProvider + * @returns {MethodReturn} + */ + private disableCheck(): MethodReturn { + if (this.options.syncCloudStorage.disabled) { + logger.warning('SyncCloudStorage is disabled!') + return { result: true } + } + + return { result: false } + } +} diff --git a/src/providers/cdk.ts b/src/providers/cdk.ts new file mode 100644 index 0000000..d0a0b82 --- /dev/null +++ b/src/providers/cdk.ts @@ -0,0 +1,10 @@ +import { Construct } from 'constructs' + +import { BaseProvider } from './base' +import { ProviderOptions } from '../types' + +export class SyncCloudStorageCdk extends BaseProvider { + constructor(construct: Construct, options: ProviderOptions) { + super(options, construct.node.path) + } +} diff --git a/src/providers/serverless.ts b/src/providers/serverless.ts new file mode 100644 index 0000000..c8ad76c --- /dev/null +++ b/src/providers/serverless.ts @@ -0,0 +1,64 @@ +import Serverless from 'serverless' +import ServerlessPlugin from 'serverless/classes/Plugin' + +import { BaseProvider } from './base' +import { IServerless } from '../types' + +export class SyncCloudStorageServerless extends BaseProvider { + readonly hooks: ServerlessPlugin.Hooks + readonly commands: ServerlessPlugin.Commands + + constructor( + serverless: IServerless, + options: Serverless.Options, + // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars, @typescript-eslint/naming-convention + _logging?: ServerlessPlugin.Logging + ) { + const pluginOptions = serverless.service.custom.syncCloudStorage + super( + { + syncCloudStorage: { + ...pluginOptions, + region: options['region'] || pluginOptions.region, + }, + }, + serverless.service.serverless.config.servicePath + ) + this.commands = this.setCommands() + this.hooks = this.setHooks() + } + + /** + * Set commands. + * @returns {ServerlessPlugin.Commands} Commands + * @memberof SyncCloudStorage + * + * @example + * const commands = this.setCommands() + */ + setCommands(): ServerlessPlugin.Commands { + return { + scs: { + usage: 'Sync Cloud Storage', + lifecycleEvents: ['storages', 'tags'], + }, + } + } + + /** + * Set hooks. + * @returns {ServerlessPlugin.Hooks} Hooks + * @memberof SyncCloudStorage + * + * @example + * const hooks = this.setHooks() + */ + setHooks(): ServerlessPlugin.Hooks { + return { + 'scs:storages': () => this.storages(), + 'scs:tags': () => this.tags(), + 'before:offline:start:init': () => this.storages(), + 'before:deploy:deploy': () => this.storages(), + } + } +} diff --git a/src/schemas/input.ts b/src/schemas/input.ts index 2559923..2122264 100644 --- a/src/schemas/input.ts +++ b/src/schemas/input.ts @@ -12,35 +12,68 @@ const objectCannedACLs = Object.values(ObjectCannedACL).map( const tags = z.record(z.string(), z.string()) const storage = z.object({ - name: z.string().min(1), - patterns: z.array(z.string()).min(1), - actions: z.array(z.string()).default(['upload', 'delete']), - prefix: z.string().default(''), - enabled: z.boolean().default(true), - acl: z.enum(objectCannedACLs).optional(), - metadata: z.record(z.string(), z.string()).optional(), - tags: z.record(z.string(), z.string()).default({}), - gitignore: z.boolean().default(false), - ignoreFiles: z.array(z.string()).optional(), + name: z.string().min(1).describe('Storage name'), + patterns: z + .array(z.string()) + .min(1) + .describe('Patterns of glob paths to include or exclude on sync action'), + actions: z + .array(z.enum(['upload', 'delete'])) + .default(['upload', 'delete']) + .describe('Sync actions'), + prefix: z + .string() + .default('') + .describe('Prefix for the storage files and folders'), + enabled: z + .boolean() + .default(true) + .describe('Enable or disable the storage on sync action'), + acl: z.enum(objectCannedACLs).optional().describe('Access control list'), + metadata: z + .record(z.string(), z.string()) + .optional() + .describe( + 'A set of metadata key/value pair to be set or unset on the object' + ), + tags: z + .record(z.string(), z.string()) + .default({}) + .describe('A set of tag key/value pair to be set or unset on the object'), + gitignore: z + .boolean() + .default(false) + .describe('Use .gitignore file to exclude files and directories'), + ignoreFiles: z + .array(z.string()) + .optional() + .describe('Ignore files and directories to exclude from sync action'), }) -const storages = z.array(storage).min(1) +const storages = z.array(storage).min(1).describe('List of storages') -const custom = z.object({ +const customOptions = z.object({ syncCloudStorage: z.object({ - disabled: z.boolean().optional().default(false), + disabled: z.boolean().optional().default(false).describe('Disable sync'), storages: storages, - endpoint: z.string().optional(), + endpoint: z + .string() + .optional() + .default(process.env.AWS_ENDPOINT_URL ?? '') + .describe('Cloud (AWS) Endpoint URL'), offline: z .boolean() .optional() - .default(process.env.IS_OFFLINE === 'true'), + .default(process.env.IS_OFFLINE === 'true') + .describe('Offline mode'), + region: z.string().optional().describe('Cloud (AWS) region'), + silent: z.boolean().optional().describe('Silent output logs'), }), }) -type Custom = z.infer +type CustomOptions = z.infer type Storage = z.infer type Tags = z.infer -export type { Custom, Storage, Tags } -export { custom, tags, storage, storages, objectCannedACLs } +export type { CustomOptions, Storage, Tags } +export { customOptions, tags, storage, storages, objectCannedACLs } diff --git a/src/providers/local/objects.ts b/src/storages/local/objects.ts similarity index 100% rename from src/providers/local/objects.ts rename to src/storages/local/objects.ts diff --git a/src/providers/s3/buckets.ts b/src/storages/s3/buckets.ts similarity index 99% rename from src/providers/s3/buckets.ts rename to src/storages/s3/buckets.ts index 35be13e..29ad827 100644 --- a/src/providers/s3/buckets.ts +++ b/src/storages/s3/buckets.ts @@ -23,7 +23,7 @@ import { TagsSyncResult, UploadedObject, } from '../../types' -import logger from '../../utils/logger' +import { logger } from '../../utils/logger' import { getChecksum, getContentType } from '../../utils/objects' import { mergeTags } from '../../utils/tags' import { getLocalFiles } from '../local/objects' diff --git a/src/providers/s3/credentials.ts b/src/storages/s3/credentials.ts similarity index 100% rename from src/providers/s3/credentials.ts rename to src/storages/s3/credentials.ts diff --git a/src/providers/s3/objects.ts b/src/storages/s3/objects.ts similarity index 98% rename from src/providers/s3/objects.ts rename to src/storages/s3/objects.ts index a48133e..d6e3e9c 100644 --- a/src/providers/s3/objects.ts +++ b/src/storages/s3/objects.ts @@ -12,7 +12,7 @@ import { Upload } from '@aws-sdk/lib-storage' import { Storage } from '../../schemas/input' import { LocalFile } from '../../types' -import logger from '../../utils/logger' +import { logger } from '../../utils/logger' import { getChecksum, getContentType } from '../../utils/objects' /** diff --git a/src/types.ts b/src/types.ts index 7075ccd..d7339b6 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,33 +1,33 @@ import { DeletedObject, Tag, _Object } from '@aws-sdk/client-s3' +import { Construct } from 'constructs' import Serverless from 'serverless' -import { Custom, Storage } from './schemas/input' +import { CustomOptions, Storage } from './schemas/input' -export type IServerlessProvider = ReturnType< - typeof Serverless.prototype.getProvider -> +export type AWSProvider = ReturnType +// Instance definition of AWS Serverless with the the custom options. export type IServerless = { service: { - custom: Custom + custom: CustomOptions serverless: { config: { servicePath: string } } } - getProvider(name: string): IServerlessProvider + getProvider(name: string): AWSProvider } -export interface ExtendedServerlessProvider extends IServerlessProvider { - cachedCredentials?: { - accessKeyId?: string - secretAccessKey?: string - sessionToken?: string - region?: string - } +export interface IBaseProvider { + storages(servicePath: string): Promise<{ result: SyncResult[] }> + metadata(): Promise[]> + tags(): Promise } +export type Provider = IServerless | Construct +export type CdkOptions = CustomOptions['syncCloudStorage'] +export type ProviderOptions = CustomOptions export type LocalFile = { fileName: string localPath: string @@ -59,16 +59,6 @@ export type StoragesSyncResult = { metadata?: Record } -export type DeepPartial = { - [K in keyof T]?: T[K] extends object ? DeepPartial : T[K] -} - -export interface MethodReturn { - storage?: Storage - result?: T - error?: Error | string -} - export interface MethodReturn { storage?: Storage result?: T @@ -99,6 +89,20 @@ interface SyncRejectedResult { export type SyncResult = SyncFulfilledResult | SyncRejectedResult +// Testing utilities and types +export interface ExtendedServerlessProvider extends AWSProvider { + cachedCredentials?: { + accessKeyId?: string + secretAccessKey?: string + sessionToken?: string + region?: string + } +} + +export type DeepPartial = { + [K in keyof T]?: T[K] extends object ? DeepPartial : T[K] +} + export const isFulfilledSyncResult = ( result: SyncResult ): result is SyncFulfilledResult => result.status === 'fulfilled' diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 38985ec..0c80897 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -1,13 +1,19 @@ -import winston from 'winston' +import { createLogger, format, transports } from 'winston' -const logger = winston.createLogger({ - format: winston.format.combine( - winston.format.timestamp(), - winston.format.json() - ), - transports: [new winston.transports.Console()], - level: process.env.LOG_LEVEL ?? 'info', - levels: winston.config.syslog.levels, -}) +const getFormat = () => { + const jsonLogging = process.env.ENABLE_LOG_JSON === 'true' + const enableTimestamp = process.env.ENABLE_LOG_TIMESTAMP === 'true' + return format.combine( + format.colorize(), + ...(enableTimestamp ? [format.timestamp()] : []), + jsonLogging + ? (format.json(), format.prettyPrint()) + : (format.splat(), format.simple()) + ) +} -export default logger +export const logger = createLogger({ + format: getFormat(), + level: 'info', + transports: [new transports.Console()], +}) diff --git a/test/index.test.ts b/test/index.test.ts index 6fe19f2..6e1ecb8 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -1,10 +1,12 @@ import { DeletedObject, PutObjectCommand, S3Client } from '@aws-sdk/client-s3' +import { App, Stack } from 'aws-cdk-lib' import { mock } from 'jest-mock-extended' import { Options } from 'serverless' import { Logging } from 'serverless/classes/Plugin' import { getServerlessMock } from './mocks/serverless' import { + createValidCdkInputFixture, createValidDisabledInputFixture, createValidInputFixture, createValidInputFixtureWithACLBucketOwner, @@ -13,24 +15,28 @@ import { sampleStorage, sampleStoragePatterns, } from './schemas/input.fixture' -import { setupAWSEnvs } from './setupAWSEnvs' +import { setupEnvs } from './setupEnvs' import { InvalidConfigError } from '../src/errors' import SyncCloudStorage from '../src/index' -import { createStorage, deleteStorage } from '../src/providers/s3/buckets' -import * as objects from '../src/providers/s3/objects' +import { SyncCloudStorageCdk } from '../src/providers/cdk' +import { SyncCloudStorageServerless } from '../src/providers/serverless' import { Storage } from '../src/schemas/input' +import { createStorage, deleteStorage } from '../src/storages/s3/buckets' +import * as objects from '../src/storages/s3/objects' import { TagsMethodPromiseResult, UploadedObject, isFulfilledSyncResult, } from '../src/types' -import logger from '../src/utils/logger' +import { logger } from '../src/utils/logger' import { mergeTags } from '../src/utils/tags' const cwd = process.cwd() const optionsMock = mock() const loggingMock = mock() +jest.mock('./src/utils/logger') + const setupStorage = async (client: S3Client, storage: Storage) => { try { await deleteStorage(client, storage) @@ -86,19 +92,87 @@ const deletedFilesExpects = ( } } -describe('SyncCloudStorage', () => { +describe('Providers', () => { + let logSpy: jest.SpyInstance + + afterEach(() => { + // Reset environment variables after each test + delete process.env.STAGE + delete process.env.AWS_EXECUTION_ENV + }) + + it('should return SyncCloudStorageServerless when instance is Serverless', () => { + const cdkInputCustom = createValidInputFixture({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + }) + const mockServerless = getServerlessMock(cdkInputCustom, cwd) + const instance = new SyncCloudStorage(mockServerless) + expect(instance).toBeInstanceOf(SyncCloudStorageServerless) + }) + + it('should return SyncCloudStorageCdk when provider is Construct', () => { + // Use a CDK App and Stack as scope + const app = new App() + const stack = new Stack(app, 'TestStack') + const cdkInputCustom = createValidCdkInputFixture({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + }) + const instance = new SyncCloudStorage(stack, cdkInputCustom) + expect(instance).toBeInstanceOf(SyncCloudStorageCdk) + }) + + it('should throw an error when neither Serverless nor Construct is instance', () => { + try { + new SyncCloudStorage({} as never) + } catch (error) { + expect((error as Error).message).toBe('Provider not found') + } + }) + + it('should throw an error when provider is not found', () => { + try { + new SyncCloudStorage({} as never) + } catch (error) { + expect((error as Error).message).toBe('Provider not found') + } + }) + + it.only('should keep logger silent when silent set to false', async () => { + logSpy = jest.spyOn(logger, 'info') + + const stack = new Stack(new App(), 'TestStack') + const expectedsilent = false + const cdkInputCustom = createValidCdkInputFixture({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + silent: expectedsilent, + }) + const instance = new SyncCloudStorage( + stack, + cdkInputCustom + ) as SyncCloudStorageCdk + expect(instance).toBeInstanceOf(SyncCloudStorageCdk) + expect(instance.options.syncCloudStorage.silent).toBe(expectedsilent) + expect(logger.silent).toBe(!expectedsilent) + expect(logSpy).not.toHaveBeenCalled() + }) +}) + +describe.skip('Operations', () => { beforeAll(async () => { - await setupAWSEnvs() + await setupEnvs() }) describe('Constructor Related Tests', () => { it('should properly configure S3 client for offline mode', async () => { - const inputCustom = createValidInputFixture( - sampleStoragePatterns.single, - sampleStorage.name - ) - const mockServerless = getServerlessMock(inputCustom, cwd) - const syncCloudStorage = new SyncCloudStorage( + const serverlessInputCustom = createValidInputFixture({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + }) + const mockServerless = getServerlessMock(serverlessInputCustom, cwd) + const syncCloudStorage = new SyncCloudStorageServerless( mockServerless, optionsMock, loggingMock @@ -107,19 +181,19 @@ describe('SyncCloudStorage', () => { expect(syncCloudStorage.client).toBeInstanceOf(S3Client) if ( - inputCustom.syncCloudStorage.offline === true && - inputCustom.syncCloudStorage.endpoint !== undefined + serverlessInputCustom.syncCloudStorage.offline === true && + serverlessInputCustom.syncCloudStorage.endpoint !== undefined ) { const configuredEndpoint = await syncCloudStorage.client?.config?.endpoint?.() expect( - inputCustom.syncCloudStorage.endpoint.includes( + serverlessInputCustom.syncCloudStorage.endpoint.includes( `${configuredEndpoint?.hostname}` ) ).toBe(true) expect( - inputCustom.syncCloudStorage.endpoint.includes( + serverlessInputCustom.syncCloudStorage.endpoint.includes( `${configuredEndpoint?.port}` ) ).toBe(true) @@ -127,9 +201,9 @@ describe('SyncCloudStorage', () => { }) it('should not sync when plugin is disabled', async () => { - const inputCustom = createValidDisabledInputFixture() - const mockServerless = getServerlessMock(inputCustom, cwd) - const syncCloudStorage = new SyncCloudStorage( + const serverlessInputCustom = createValidDisabledInputFixture() + const mockServerless = getServerlessMock(serverlessInputCustom, cwd) + const syncCloudStorage = new SyncCloudStorageServerless( mockServerless, optionsMock, loggingMock @@ -144,15 +218,15 @@ describe('SyncCloudStorage', () => { }) it("should not sync when there's no bucket", async () => { - const inputCustom = createValidInputFixture( - sampleStoragePatterns.single, - sampleStorage.name - ) - inputCustom.syncCloudStorage.storages = [] - const mockServerless = getServerlessMock(inputCustom, cwd) + const serverlessInputCustom = createValidInputFixture({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + }) + serverlessInputCustom.syncCloudStorage.storages = [] + const mockServerless = getServerlessMock(serverlessInputCustom, cwd) try { - new SyncCloudStorage(mockServerless, optionsMock, loggingMock) + new SyncCloudStorageServerless(mockServerless, optionsMock, loggingMock) } catch (error) { const typedError = error as InvalidConfigError expect(typedError).toBeInstanceOf(InvalidConfigError) @@ -163,12 +237,12 @@ describe('SyncCloudStorage', () => { describe('Error Handling', () => { it("should throw an error when the bucket doesn't exist", async () => { - const inputCustom = createValidInputFixture( - sampleStoragePatterns.single, - 'non-existent-bucket' - ) - const mockServerless = getServerlessMock(inputCustom, cwd) - const syncCloudStorage = new SyncCloudStorage( + const serverlessInputCustom = createValidInputFixture({ + patterns: sampleStoragePatterns.single, + name: 'non-existent-bucket', + }) + const mockServerless = getServerlessMock(serverlessInputCustom, cwd) + const syncCloudStorage = new SyncCloudStorageServerless( mockServerless, optionsMock, loggingMock @@ -191,12 +265,12 @@ describe('SyncCloudStorage', () => { }) it("should not sync tags when storage doesn't exist", async () => { - const inputCustom = createValidInputFixture( - sampleStoragePatterns.single, - 'non-existent-bucket' - ) - const mockServerless = getServerlessMock(inputCustom, cwd) - const syncCloudStorage = new SyncCloudStorage( + const serverlessInputCustom = createValidInputFixture({ + patterns: sampleStoragePatterns.single, + name: 'non-existent-bucket', + }) + const mockServerless = getServerlessMock(serverlessInputCustom, cwd) + const syncCloudStorage = new SyncCloudStorageServerless( mockServerless, optionsMock, loggingMock @@ -221,12 +295,12 @@ describe('SyncCloudStorage', () => { describe('Synchronization', () => { it('should sync when there is a new bucket and acl set to bucket owner', async () => { - const inputCustom = createValidInputFixtureWithACLBucketOwner( - sampleStoragePatterns.single, - sampleStorage.name - ) - const mockServerless = getServerlessMock(inputCustom, cwd) - const syncCloudStorage = new SyncCloudStorage( + const serverlessInputCustom = createValidInputFixtureWithACLBucketOwner({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + }) + const mockServerless = getServerlessMock(serverlessInputCustom, cwd) + const syncCloudStorage = new SyncCloudStorageServerless( mockServerless, optionsMock, loggingMock @@ -234,7 +308,7 @@ describe('SyncCloudStorage', () => { await setupStorage( syncCloudStorage.getS3Client(), - inputCustom.syncCloudStorage.storages[0] + serverlessInputCustom.syncCloudStorage.storages[0] ) const syncStoragesSpy = jest.spyOn(syncCloudStorage, 'storages') @@ -254,22 +328,46 @@ describe('SyncCloudStorage', () => { } } }) + + it('should sync when there is a new bucket (cdk)', async () => { + const cdkInputCustom = createValidCdkInputFixture({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + }) + const app = new App() + const stack = new Stack(app, 'TestStack') + const syncCloudStorage = new SyncCloudStorage( + stack, + cdkInputCustom + ) as SyncCloudStorageCdk + const { result } = await syncCloudStorage.storages() + expect(result).toEqual([ + expect.objectContaining({ + status: 'fulfilled', + value: expect.objectContaining({ + uploaded: expect.arrayContaining([]), + deleted: expect.arrayContaining([]), + }), + }), + ]) + }) + it('should sync when the prefix', async () => { const prefix = 'animals' - const inputCustom = createValidInputFixture( - sampleStoragePatterns.single, - sampleStorage.name, - prefix - ) - const mockServerless = getServerlessMock(inputCustom, cwd) - const syncCloudStorage = new SyncCloudStorage( + const serverlessInputCustom = createValidInputFixture({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + prefix, + }) + const mockServerless = getServerlessMock(serverlessInputCustom, cwd) + const syncCloudStorage = new SyncCloudStorageServerless( mockServerless, optionsMock, loggingMock ) await setupStorage( syncCloudStorage.getS3Client(), - inputCustom.syncCloudStorage.storages[0] + serverlessInputCustom.syncCloudStorage.storages[0] ) const syncStoragesSpy = jest.spyOn(syncCloudStorage, 'storages') @@ -292,24 +390,24 @@ describe('SyncCloudStorage', () => { }) it('should sync tags', async () => { - const inputCustom = createValidInputFixtureWithTags( - sampleStoragePatterns.single, - sampleStorage.name - ) - const mockServerless = getServerlessMock(inputCustom, cwd) - const syncCloudStorage = new SyncCloudStorage( + const serverlessInputCustom = createValidInputFixtureWithTags({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + }) + const mockServerless = getServerlessMock(serverlessInputCustom, cwd) + const syncCloudStorage = new SyncCloudStorageServerless( mockServerless, optionsMock, loggingMock ) await setupStorage( syncCloudStorage.getS3Client(), - inputCustom.syncCloudStorage.storages[0] + serverlessInputCustom.syncCloudStorage.storages[0] ) const expectedTags = mergeTags( [], - inputCustom.syncCloudStorage.storages[0].tags + serverlessInputCustom.syncCloudStorage.storages[0].tags ) const tagsSpy = jest.spyOn(syncCloudStorage, 'tags') const newTags = await syncCloudStorage.tags() @@ -328,16 +426,16 @@ describe('SyncCloudStorage', () => { expect( await deleteStorage( syncCloudStorage.getS3Client(), - inputCustom.syncCloudStorage.storages[0] + serverlessInputCustom.syncCloudStorage.storages[0] ) ).not.toBe(undefined) } }) it('should not sync tags when plugin is disabled', async () => { - const inputCustom = createValidDisabledInputFixture() - const mockServerless = getServerlessMock(inputCustom, cwd) - const syncCloudStorage = new SyncCloudStorage( + const serverlessInputCustom = createValidDisabledInputFixture() + const mockServerless = getServerlessMock(serverlessInputCustom, cwd) + const syncCloudStorage = new SyncCloudStorageServerless( mockServerless, optionsMock, loggingMock @@ -351,19 +449,19 @@ describe('SyncCloudStorage', () => { }) it('should sync metadata', async () => { - const inputCustom = createValidInputFixtureWithMetadata( - sampleStoragePatterns.single, - sampleStorage.name - ) - const mockServerless = getServerlessMock(inputCustom, cwd) - const syncCloudStorage = new SyncCloudStorage( + const serverlessInputCustom = createValidInputFixtureWithMetadata({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + }) + const mockServerless = getServerlessMock(serverlessInputCustom, cwd) + const syncCloudStorage = new SyncCloudStorageServerless( mockServerless, optionsMock, loggingMock ) await setupStorage( syncCloudStorage.getS3Client(), - inputCustom.syncCloudStorage.storages[0] + serverlessInputCustom.syncCloudStorage.storages[0] ) const metadataSpy = jest.spyOn(syncCloudStorage, 'metadata') @@ -380,8 +478,9 @@ describe('SyncCloudStorage', () => { value: existingObjects.map(({ Key: key }) => { return { Key: key, - Metadata: inputCustom.syncCloudStorage.storages[0].metadata, - Bucket: inputCustom.syncCloudStorage.storages[0].name, + Metadata: + serverlessInputCustom.syncCloudStorage.storages[0].metadata, + Bucket: serverlessInputCustom.syncCloudStorage.storages[0].name, } }), }), @@ -392,28 +491,28 @@ describe('SyncCloudStorage', () => { await deleteStorage( syncCloudStorage.getS3Client(), - inputCustom.syncCloudStorage.storages[0] + serverlessInputCustom.syncCloudStorage.storages[0] ) }) }) describe('Action Limitation', () => { it('should limit sync to specified actions: upload', async () => { - const inputCustom = createValidInputFixture( - sampleStoragePatterns.single, - sampleStorage.name - ) - inputCustom.syncCloudStorage.storages[0].actions = ['upload'] - const mockServerless = getServerlessMock(inputCustom, cwd) + const serverlessInputCustom = createValidInputFixture({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + }) + serverlessInputCustom.syncCloudStorage.storages[0].actions = ['upload'] + const mockServerless = getServerlessMock(serverlessInputCustom, cwd) - const syncCloudStorage = new SyncCloudStorage( + const syncCloudStorage = new SyncCloudStorageServerless( mockServerless, optionsMock, loggingMock ) await setupStorage( syncCloudStorage.getS3Client(), - inputCustom.syncCloudStorage.storages[0] + serverlessInputCustom.syncCloudStorage.storages[0] ) const syncStoragesSpy = jest.spyOn(syncCloudStorage, 'storages') @@ -435,28 +534,28 @@ describe('SyncCloudStorage', () => { }) it('should limit sync to specified actions: delete', async () => { - const inputCustom = createValidInputFixture( - sampleStoragePatterns.single, - sampleStorage.name - ) + const serverlessInputCustom = createValidInputFixture({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + }) - inputCustom.syncCloudStorage.storages[0].actions = ['delete'] + serverlessInputCustom.syncCloudStorage.storages[0].actions = ['delete'] - const mockServerless = getServerlessMock(inputCustom, cwd) - const syncCloudStorage = new SyncCloudStorage( + const mockServerless = getServerlessMock(serverlessInputCustom, cwd) + const syncCloudStorage = new SyncCloudStorageServerless( mockServerless, optionsMock, loggingMock ) await setupStorage( syncCloudStorage.getS3Client(), - inputCustom.syncCloudStorage.storages[0] + serverlessInputCustom.syncCloudStorage.storages[0] ) const giraffeTXT = 'giraffe.txt' await syncCloudStorage.getS3Client().send( new PutObjectCommand({ - Bucket: inputCustom.syncCloudStorage.storages[0].name, + Bucket: serverlessInputCustom.syncCloudStorage.storages[0].name, Key: giraffeTXT, Body: 'giraffe', }) @@ -483,7 +582,7 @@ describe('SyncCloudStorage', () => { filesToUpload: expect.arrayContaining([]), localFilesChecksum: expect.arrayContaining([]), objects: expect.arrayContaining([]), - storage: inputCustom.syncCloudStorage.storages[0], + storage: serverlessInputCustom.syncCloudStorage.storages[0], storageObjectsChecksum: expect.arrayContaining([]), uploaded: expect.arrayContaining([]), }, @@ -496,33 +595,36 @@ describe('SyncCloudStorage', () => { await deleteStorage( syncCloudStorage.getS3Client(), - inputCustom.syncCloudStorage.storages[0] + serverlessInputCustom.syncCloudStorage.storages[0] ) }) it('should limit sync to specified actions: upload & delete', async () => { - const inputCustom = createValidInputFixture( - sampleStoragePatterns.single, - sampleStorage.name - ) + const serverlessInputCustom = createValidInputFixture({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + }) - inputCustom.syncCloudStorage.storages[0].actions = ['upload', 'delete'] + serverlessInputCustom.syncCloudStorage.storages[0].actions = [ + 'upload', + 'delete', + ] - const mockServerless = getServerlessMock(inputCustom, cwd) - const syncCloudStorage = new SyncCloudStorage( + const mockServerless = getServerlessMock(serverlessInputCustom, cwd) + const syncCloudStorage = new SyncCloudStorageServerless( mockServerless, optionsMock, loggingMock ) await setupStorage( syncCloudStorage.getS3Client(), - inputCustom.syncCloudStorage.storages[0] + serverlessInputCustom.syncCloudStorage.storages[0] ) const giraffeTXT = 'giraffe.txt' await syncCloudStorage.getS3Client().send( new PutObjectCommand({ - Bucket: inputCustom.syncCloudStorage.storages[0].name, + Bucket: serverlessInputCustom.syncCloudStorage.storages[0].name, Key: giraffeTXT, Body: 'giraffe', }) @@ -548,33 +650,36 @@ describe('SyncCloudStorage', () => { }) describe('Multiple Storages', () => { it('should sync multiple storages with with all actions', async () => { - const inputCustom = createValidInputFixture( - sampleStoragePatterns.single, - sampleStorage.name - ) - const inputCustom2 = createValidInputFixture( - sampleStoragePatterns.multiple, - 'giraffe-bucket-2' - ) + const serverlessInputCustom = createValidInputFixture({ + patterns: sampleStoragePatterns.single, + name: sampleStorage.name, + }) + const serverlessInputCustom2 = createValidInputFixture({ + patterns: sampleStoragePatterns.multiple, + name: 'giraffe-bucket-2', + }) const { syncCloudStorage: { storages: [storage1], }, - } = inputCustom + } = serverlessInputCustom const { syncCloudStorage: { storages: [storage2], }, - } = inputCustom2 + } = serverlessInputCustom2 const storages = [storage1, storage2] const mockServerless = getServerlessMock( { - ...inputCustom, - syncCloudStorage: { ...inputCustom.syncCloudStorage, storages }, + ...serverlessInputCustom, + syncCloudStorage: { + ...serverlessInputCustom.syncCloudStorage, + storages, + }, }, cwd ) - const syncCloudStorage = new SyncCloudStorage( + const syncCloudStorage = new SyncCloudStorageServerless( mockServerless, optionsMock, loggingMock diff --git a/test/mocks/serverless.ts b/test/mocks/serverless.ts index 047ecca..28145cf 100644 --- a/test/mocks/serverless.ts +++ b/test/mocks/serverless.ts @@ -1,4 +1,4 @@ -import { Custom } from '../../src/schemas/input' +import { CustomOptions } from '../../src/schemas/input' import { IServerless } from '../../src/types' const serverlessGetProviderSpy = jest.fn().mockReturnValue({ @@ -10,7 +10,7 @@ const serverlessGetProviderSpy = jest.fn().mockReturnValue({ }) export const getServerlessMock = ( - inputCustom: Custom, + inputCustom: CustomOptions, servicePath: string ): IServerless => ({ service: { diff --git a/test/schemas/input.fixture.ts b/test/schemas/input.fixture.ts index 012289a..8a19929 100644 --- a/test/schemas/input.fixture.ts +++ b/test/schemas/input.fixture.ts @@ -1,6 +1,10 @@ import { faker } from '@faker-js/faker' -import { Custom, Storage, objectCannedACLs } from '../../src/schemas/input' +import { + CustomOptions, + Storage, + objectCannedACLs, +} from '../../src/schemas/input' import { DeepPartial } from '../../src/types' export const sampleStoragePatterns = { @@ -10,154 +14,132 @@ export const sampleStoragePatterns = { export const sampleStorage: Storage = { name: 'my-static-site-assets', - prefix: 'animals', patterns: sampleStoragePatterns.single, actions: ['upload', 'delete'], - acl: undefined, + prefix: '', enabled: true, + acl: undefined, tags: {}, - ignoreFiles: [], + metadata: {}, gitignore: false, + ignoreFiles: [], } -const createBaseInputFixture = (): Required => ({ +const generateStorage = (overrides: Partial = {}): Storage => ({ + ...sampleStorage, + name: faker.internet.domainName(), + patterns: sampleStoragePatterns.single, + prefix: faker.lorem.word(), + enabled: faker.datatype.boolean(), + acl: faker.helpers.arrayElement(objectCannedACLs), + tags: { tagKey: faker.lorem.word() }, + metadata: { exampleKey: faker.lorem.word() }, + ...overrides, +}) + +const createBaseInputFixture = (): Required => ({ syncCloudStorage: { disabled: faker.datatype.boolean(), + storages: [generateStorage()], + endpoint: faker.internet.url(), + offline: faker.datatype.boolean(), + region: process.env.AWS_REGION || '', + silent: false, + }, +}) + +interface FixtureOptions { + patterns?: string[] + name?: string + prefix?: string + endpoint?: string + region?: string + silent?: boolean + storageOverrides?: Partial +} + +const createCustomInputFixture = ({ + patterns = sampleStoragePatterns.single, + name = '', + prefix = '', + endpoint = '', + region = process.env.AWS_REGION || '', + silent = false, + storageOverrides = {}, +}: FixtureOptions = {}): CustomOptions => ({ + syncCloudStorage: { + disabled: false, + endpoint, + offline: true, + region, + silent, storages: [ { - name: faker.internet.domainName(), - patterns: sampleStoragePatterns.single, - actions: ['upload', 'delete'], - prefix: faker.lorem.word(), - enabled: faker.datatype.boolean(), - acl: faker.helpers.arrayElement(objectCannedACLs), - metadata: { - exampleKey: faker.lorem.word(), - }, - tags: { - tagKey: faker.lorem.word(), - }, - ignoreFiles: [], - gitignore: false, + ...sampleStorage, + name, + patterns, + prefix, + ...storageOverrides, }, ], - endpoint: faker.internet.url(), - offline: faker.datatype.boolean(), }, }) export const createValidInputFixture = ( - patterns: string[], - name = '', - prefix = '', - endpoint = process.env.AWS_ENDPOINT_URL -): Required => { - return { - syncCloudStorage: { - disabled: false, - endpoint: endpoint, - offline: true, - storages: [ - { - ...sampleStorage, - name, - patterns, - prefix: prefix, - }, - ], - }, - } -} + options: FixtureOptions = {} +): CustomOptions => createCustomInputFixture(options) + +export const createValidCdkInputFixture = ( + options: FixtureOptions = {} +): CustomOptions['syncCloudStorage'] => + createValidInputFixture(options).syncCloudStorage export const createValidInputFixtureWithACLBucketOwner = ( - patterns: string[], - name = '', - prefix = '', - endpoint = process.env.AWS_ENDPOINT_URL -): Required => { - return { - syncCloudStorage: { - disabled: false, - endpoint: endpoint, - offline: true, - storages: [ - { - ...sampleStorage, - name, - patterns, - prefix: prefix, - acl: 'bucket-owner-full-control', - }, - ], + options: FixtureOptions = {} +): Required => + createCustomInputFixture({ + ...options, + storageOverrides: { + ...options.storageOverrides, + acl: 'bucket-owner-full-control', }, - } -} + }) export const createValidInputFixtureWithTags = ( - patterns: string[], - name = '', - prefix = '', - endpoint = process.env.AWS_ENDPOINT_URL -): Required => { - return { - syncCloudStorage: { - disabled: false, - endpoint, - offline: true, - storages: [ - { - ...sampleStorage, - name, - patterns, - prefix, - tags: { - [faker.lorem.word()]: faker.lorem.word(), - }, - }, - ], + options: FixtureOptions = {} +): Required => + createCustomInputFixture({ + ...options, + storageOverrides: { + ...options.storageOverrides, + tags: { [faker.lorem.word()]: faker.lorem.word() }, }, - } -} + }) export const createValidInputFixtureWithMetadata = ( - patterns: string[], - name = '', - prefix = '', - endpoint = process.env.AWS_ENDPOINT_URL -): Required => { - return { - syncCloudStorage: { - disabled: false, - endpoint, - offline: true, - storages: [ - { - ...sampleStorage, - name, - patterns, - prefix, - metadata: { - [faker.lorem.word()]: faker.lorem.word(), - }, - }, - ], + options: FixtureOptions = {} +): Required => + createCustomInputFixture({ + ...options, + storageOverrides: { + ...options.storageOverrides, + metadata: { [faker.lorem.word()]: faker.lorem.word() }, }, - } -} + }) -export const createValidDisabledInputFixture = (): Required => { - const baseInputFixture = createBaseInputFixture() - baseInputFixture.syncCloudStorage.disabled = true - return baseInputFixture -} +export const createValidDisabledInputFixture = (): Required => ({ + ...createBaseInputFixture(), + syncCloudStorage: { + ...createBaseInputFixture().syncCloudStorage, + disabled: true, + }, +}) -export const createValidInputFileFixture = (): Required => { - const baseInputFixture = createBaseInputFixture() - return baseInputFixture -} +export const createValidInputFileFixture = (): Required => + createBaseInputFixture() export const createInvalidInputFixture = ( - additionalProps: DeepPartial = {} + additionalProps: DeepPartial = {} ) => ({ syncCloudStorage: { disabled: 'true', diff --git a/test/schemas/input.test.ts b/test/schemas/input.test.ts index 5f14e62..3e83a95 100644 --- a/test/schemas/input.test.ts +++ b/test/schemas/input.test.ts @@ -2,19 +2,19 @@ import { createInvalidInputFixture, createValidInputFileFixture, } from './input.fixture' -import { custom } from '../../src/schemas/input' +import { customOptions } from '../../src/schemas/input' describe('Input Custom Schema', () => { it('should validate the generated fake data', () => { const input = createValidInputFileFixture() - const result = custom.safeParse(input) + const result = customOptions.safeParse(input) expect(result.success).toBe(true) }) it('should throw an error if the data is invalid', () => { const invalidInput = createInvalidInputFixture() - const result = custom.safeParse(invalidInput) + const result = customOptions.safeParse(invalidInput) expect(result.success).toBe(false) }) diff --git a/test/setupAWSEnvs.ts b/test/setupEnvs.ts similarity index 92% rename from test/setupAWSEnvs.ts rename to test/setupEnvs.ts index 5ad2afa..abc8fe3 100644 --- a/test/setupAWSEnvs.ts +++ b/test/setupEnvs.ts @@ -1,6 +1,6 @@ import { loadSharedConfigFiles } from '@smithy/shared-ini-file-loader' -import logger from '../src/utils/logger' +import { logger } from '../src/utils/logger' const defaultProfile = 'default' @@ -8,7 +8,7 @@ const checkEnvVariables = (env: NodeJS.ProcessEnv) => { return env.AWS_REGION && env.AWS_ACCESS_KEY_ID && env.AWS_SECRET_ACCESS_KEY } -export const setupAWSEnvs = async (): Promise => { +export const setupEnvs = async (): Promise => { const { credentialsFile, configFile } = await loadSharedConfigFiles({ ignoreCache: true, }) diff --git a/test/providers/local.test.ts b/test/storages/local.test.ts similarity index 88% rename from test/providers/local.test.ts rename to test/storages/local.test.ts index 4f86bdd..8925120 100644 --- a/test/providers/local.test.ts +++ b/test/storages/local.test.ts @@ -1,4 +1,4 @@ -import { getLocalFiles } from '../../src/providers/local/objects' +import { getLocalFiles } from '../../src/storages/local/objects' import { createValidInputFixture } from '../schemas/input.fixture' describe('Local File Provider', () => { @@ -8,7 +8,7 @@ describe('Local File Provider', () => { syncCloudStorage: { storages: [storage], }, - } = createValidInputFixture(patterns) + } = createValidInputFixture({ patterns }) const expectedFiles = [ 'test/assets/giraffe-multiple/README.md', 'test/assets/giraffe-multiple/sub/README.md', @@ -29,7 +29,7 @@ describe('Local File Provider', () => { syncCloudStorage: { storages: [storage], }, - } = createValidInputFixture(patterns) + } = createValidInputFixture({ patterns }) const expectedFiles = ['test/assets/giraffe-multiple/sub/README.md'] const filesToUpload = await getLocalFiles(patterns, storage, process.cwd()) const filesToUploadKeys = filesToUpload.map((file) => file.key)