From 3242d824f6d12001d62c4cc35e22b452f4c8a32a Mon Sep 17 00:00:00 2001 From: Benni-Math Date: Fri, 13 Sep 2024 00:34:39 -0400 Subject: [PATCH] GH action and lint fix --- .eslintignore | 1 - .eslintrc.json | 133 +- .mocharc.json | 8 +- .prettierrc | 8 - .prettierrc.json | 9 +- .vscode/launch.json | 4 +- .vscode/settings.json | 5 + TESTING.md | 10 +- TODO.md | 13 +- bin/dev.js | 4 +- bin/run.js | 4 +- cdk/lib/stack.ts | 2 +- examples/iam-policy.json | 198 +- npm-shrinkwrap.json | 2583 ++++++----------- package.json | 16 +- src/aws/classes/AssumedRole.ts | 21 +- src/aws/helpers/cfnStackExists.ts | 9 +- src/aws/helpers/deleteSecrets.ts | 6 +- src/aws/helpers/deleteSsmParameters.ts | 4 +- src/aws/helpers/execTask.ts | 16 +- src/aws/helpers/getAccountId.ts | 1 + src/aws/helpers/getCfnStackExports.ts | 13 +- src/aws/helpers/getCurrentRegion.ts | 7 +- src/aws/helpers/getInfraStackList.ts | 3 +- src/aws/helpers/getPaginatedResponse.ts | 5 +- src/aws/helpers/getRepoImageList.ts | 12 +- src/aws/helpers/getRepoList.ts | 5 +- src/aws/helpers/imageTagExists.ts | 3 +- src/aws/helpers/initProfile.ts | 1 + src/aws/helpers/isConfigured.ts | 2 +- src/aws/helpers/isLatestTag.ts | 5 +- src/aws/helpers/parseEcrArn.ts | 6 +- src/aws/helpers/putSecret.ts | 29 +- src/aws/helpers/putSsmParameter.ts | 3 +- src/aws/helpers/restartEcsService.ts | 27 +- src/aws/helpers/sendSSHPublicKey.ts | 1 - src/aws/helpers/updateTaskDefAppImage.ts | 15 +- src/aws/index.ts | 103 +- src/base.ts | 324 +-- src/cdk/assets/scheduled_task_exec/index.js | 8 +- src/cdk/cdk.ts | 84 +- src/cdk/lib/classes/CacclAppEnvironment.ts | 12 +- src/cdk/lib/classes/CacclCache.ts | 23 +- src/cdk/lib/classes/CacclContainerImage.ts | 25 +- src/cdk/lib/classes/CacclDbBase.ts | 70 +- src/cdk/lib/classes/CacclDeployStack.ts | 79 +- src/cdk/lib/classes/CacclDocDb.ts | 132 +- .../classes/CacclGitRepoVolumeContainer.ts | 9 +- src/cdk/lib/classes/CacclLoadBalancer.ts | 100 +- src/cdk/lib/classes/CacclMonitoring.ts | 96 +- src/cdk/lib/classes/CacclNotifications.ts | 56 +- src/cdk/lib/classes/CacclRdsDb.ts | 149 +- src/cdk/lib/classes/CacclScheduledTasks.ts | 63 +- src/cdk/lib/classes/CacclService.ts | 33 +- src/cdk/lib/classes/CacclSshBastion.ts | 11 +- src/cdk/lib/classes/CacclTaskDef.ts | 58 +- .../DEFAULT_AURORA_MYSQL_ENGINE_VERSION.ts | 2 +- src/cdk/lib/helpers/createDbConstruct.ts | 14 +- src/commands/apps.ts | 24 +- src/commands/connect.ts | 76 +- src/commands/delete.ts | 34 +- src/commands/exec.ts | 46 +- src/commands/images.ts | 72 +- src/commands/new.ts | 49 +- src/commands/release.ts | 56 +- src/commands/repos.ts | 16 +- src/commands/restart.ts | 27 +- src/commands/schedule.ts | 70 +- src/commands/show.ts | 41 +- src/commands/stack.ts | 141 +- src/commands/update.ts | 49 +- src/conf.ts | 15 +- src/configPrompts/confirm.ts | 4 +- src/configPrompts/confirmProductionOp.ts | 24 +- src/configPrompts/index.ts | 23 +- src/configPrompts/prompt.ts | 8 +- src/configPrompts/promptAppImage.ts | 43 +- src/configPrompts/promptAppName.ts | 14 +- src/configPrompts/promptCertificateArn.ts | 11 +- src/configPrompts/promptInfraStackName.ts | 11 +- src/configPrompts/promptKeyValuePairs.ts | 15 +- src/deployConfig/helpers/create.ts | 4 +- src/deployConfig/helpers/fromFlattened.ts | 8 +- src/deployConfig/helpers/wipeConfig.ts | 1 + src/deployConfig/index.ts | 71 +- src/helpers/isProdAccount.ts | 1 - src/index.ts | 4 +- src/logger.ts | 28 +- src/shared/helpers/generateVersion.ts | 33 +- src/shared/helpers/readFile.ts | 4 +- src/shared/helpers/validSSMParamName.ts | 2 +- src/shared/helpers/warnAboutVersionDiff.ts | 1 + src/shared/types/CacclConfSchema.ts | 4 +- src/shared/types/EcrImage.ts | 6 +- src/shared/types/SecretOpts.ts | 2 +- src/types/CacclAppEnvironmentProps.ts | 1 - src/types/CacclCacheOptions.ts | 3 +- src/types/CacclCacheProps.ts | 5 +- src/types/CacclDbOptions.ts | 13 +- src/types/CacclDbProps.ts | 6 +- src/types/CacclDeployStackProps.ts | 21 +- src/types/CacclDeployStackPropsData.ts | 10 +- src/types/CacclGitRepoVolumeContainerProps.ts | 4 +- src/types/CacclLoadBalancerExtraOptions.ts | 1 - src/types/CacclLoadBalancerProps.ts | 9 +- src/types/CacclMonitoringProps.ts | 1 - src/types/CacclNotificationsProps.ts | 9 +- src/types/CacclScheduledTask.ts | 3 +- src/types/CacclScheduledTasksProps.ts | 5 +- src/types/CacclServiceProps.ts | 6 +- src/types/CacclSshBastionProps.ts | 3 +- src/types/CacclTaskDefProps.ts | 9 +- src/types/DeployConfigData.ts | 34 +- src/types/ICacclAppEnvironment.ts | 6 +- src/types/ICacclDb.ts | 50 +- src/types/ICacclLoadBalancer.ts | 7 +- src/types/ICacclService.ts | 4 +- src/types/ICacclTaskDef.ts | 8 +- src/types/LoadBalancerSecurityGroups.ts | 3 +- src/types/index.ts | 80 +- test/commands/apps.test.ts | 4 +- test/commands/images.test.ts | 24 +- test/commands/repos.test.ts | 9 +- test/hooks.ts | 11 +- test/tsconfig.json | 4 +- tsconfig.json | 4 +- 126 files changed, 2654 insertions(+), 3384 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .prettierrc create mode 100644 .vscode/settings.json diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 9b1c8b1..0000000 --- a/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -/dist diff --git a/.eslintrc.json b/.eslintrc.json index c501073..6fc5532 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -11,22 +11,33 @@ }, "settings": { "import/parsers": { - "@typescript-eslint/parser": [".ts"] + "@typescript-eslint/parser": [ + ".ts" + ] }, "import/resolver": { "node": { - "extensions": [".js", ".ts"] + "extensions": [ + ".js", + ".ts" + ] }, "typescript": { "directory": "./tsconfig.json" } } }, - "plugins": ["@typescript-eslint", "import", "cdk"], + "plugins": [ + "@typescript-eslint", + "import", + "cdk" + ], "extends": [ "airbnb-base", "eslint:recommended", "plugin:@typescript-eslint/recommended", + "oclif", + "oclif-typescript", "prettier" ], "ignorePatterns": [ @@ -35,65 +46,111 @@ "*.generated.ts", "build/", "cdk/cdk.out/", - "dist" + "dist/", + "test/", + "src/cdk/assets/", + "bin", + "lib", + "cdk", + "index.js" ], "rules": { + "n/no-process-exit": "off", + "unicorn/no-process-exit": "off", + "no-restricted-syntax": "off", + "no-warning-comments": "off", + "unicorn/no-array-reduce": "off", + "unicorn/filename-case": "off", "@typescript-eslint/no-var-requires": "off", - "@typescript-eslint/no-floating-promises": ["error"], - "@typescript-eslint/no-non-null-assertion": ["warn"], + "@typescript-eslint/no-floating-promises": [ + "error" + ], + "@typescript-eslint/no-non-null-assertion": [ + "warn" + ], "@typescript-eslint/no-explicit-any": "off", "max-classes-per-file": "off", - "arrow-body-style": ["warn", "always"], - "arrow-parens": ["warn", "always"], - "comma-dangle": ["error", "only-multiline"], + "arrow-body-style": [ + "warn", + "always" + ], + "arrow-parens": [ + "warn", + "always" + ], + "comma-dangle": [ + "error", + "only-multiline" + ], "consistent-return": "off", - "no-duplicate-imports": ["error"], + "no-duplicate-imports": [ + "error" + ], "no-continue": "off", - "no-shadow": ["error"], - "key-spacing": ["error"], - "semi": ["error", "always"], - "quote-props": ["error", "consistent-as-needed"], - "function-call-argument-newline": ["error", "consistent"], - "no-multiple-empty-lines": ["error"], + "no-shadow": [ + "error" + ], + "key-spacing": [ + "error" + ], + "semi": [ + "error", + "always" + ], + "quote-props": [ + "error", + "consistent-as-needed" + ], + "function-call-argument-newline": [ + "error", + "consistent" + ], + "no-multiple-empty-lines": [ + "error" + ], "no-new": 0, "explicit-function-return-type": 0, "no-console": "off", "no-underscore-dangle": "off", "no-await-in-loop": "off", "no-unused-expressions": "off", - "import/no-unresolved": ["error"], - "indent": ["error", 2, { "SwitchCase": 1 }], + "import/no-unresolved": [ + "error" + ], + "indent": [ + "error", + 2, + { + "SwitchCase": 1 + } + ], "class-methods-use-this": [ "error", { - "exceptMethods": ["createCommand"] + "exceptMethods": [ + "createCommand" + ] } ], - "quotes": [ - "error", - "single", - { - "avoidEscape": true - } - ], - "import/no-extraneous-dependencies": [ + "quotes": [ "error", + "single", { - "devDependencies": ["**/build-tools/**", "**/test/**"], - "optionalDependencies": false, - "peerDependencies": false + "avoidEscape": true } ], - "import/order": [ - "warn", + "import/no-extraneous-dependencies": [ + "error", { - "groups": ["builtin", "external"], - "alphabetize": { - "order": "asc", - "caseInsensitive": true - } + "devDependencies": [ + "**/build-tools/**", + "**/test/**" + ], + "optionalDependencies": false, + "peerDependencies": false } ], + "import/order": "off", "import/extensions": [ "warn", "never", @@ -153,4 +210,4 @@ } ] } -} +} \ No newline at end of file diff --git a/.mocharc.json b/.mocharc.json index fa25f20..8de03c9 100644 --- a/.mocharc.json +++ b/.mocharc.json @@ -1,10 +1,6 @@ { - "require": [ - "ts-node/register" - ], - "watch-extensions": [ - "ts" - ], + "require": ["ts-node/register"], + "watch-extensions": ["ts"], "recursive": true, "reporter": "spec", "timeout": 60000, diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 0a6bf95..0000000 --- a/.prettierrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "semi": true, - "trailingComma": "all", - "singleQuote": true, - "printWidth": 80, - "tabWidth": 2, - "arrowParens": "always" -} diff --git a/.prettierrc.json b/.prettierrc.json index 6314335..0a6bf95 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1 +1,8 @@ -"@oclif/prettier-config" +{ + "semi": true, + "trailingComma": "all", + "singleQuote": true, + "printWidth": 80, + "tabWidth": 2, + "arrowParens": "always" +} diff --git a/.vscode/launch.json b/.vscode/launch.json index 8ed1ba6..76e693f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,7 +5,7 @@ "type": "node", "request": "launch", "name": "Mocha: current file", - "env": { + "env": { "TS_NODE_TRANSPILE_ONLY": "true", "TS_NODE_FILES": "true" }, @@ -18,4 +18,4 @@ } } ] -} \ No newline at end of file +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3c43c81 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "cSpell.words": [ + "unflatten" + ] +} \ No newline at end of file diff --git a/TESTING.md b/TESTING.md index d1c6ffb..e3625e0 100644 --- a/TESTING.md +++ b/TESTING.md @@ -1,16 +1,14 @@ # Testing -Manual testing of CLI: - 0. apps, repos, images - - issue with `show` +Manual testing of CLI: 0. apps, repos, images - issue with `show` May not be necessary to test stack creation. Just test that the right params are passed to CDK. Could also potentially compare the templates that are output, using the `--synth` flag. Should output into the `cdk/cdk.out` directory Scenario 1: - 1. `new`, `show`, `delete`, and `update` - + +1. `new`, `show`, `delete`, and `update` Find way to remove the `plugin` command and display in `help` @@ -23,4 +21,4 @@ We want to avoid running a mock server. Instead have canned responses and evalua Automate these tests. Evaluate different approaches and testing libraries for next week. -Also start some manual tests (make a branch off main for the old CLI). \ No newline at end of file +Also start some manual tests (make a branch off main for the old CLI). diff --git a/TODO.md b/TODO.md index 82180e0..3c661db 100644 --- a/TODO.md +++ b/TODO.md @@ -1,6 +1,11 @@ # TODO: - - use more of built-in oclif for error handling - - add examples for commands - - tests - - JSDoc \ No newline at end of file +- fix eslint +- package using oclif + - reference the `../.github/workflows` +- JSDoc + +- use more of built-in oclif for error handling +- add examples for commands +- tests +- JSDoc diff --git a/bin/dev.js b/bin/dev.js index f9166e5..ed363ec 100755 --- a/bin/dev.js +++ b/bin/dev.js @@ -1,6 +1,6 @@ #!/usr/bin/env -S node --loader ts-node/esm --no-warnings=ExperimentalWarning // eslint-disable-next-line n/shebang -import {execute} from '@oclif/core' +import { execute } from '@oclif/core'; -await execute({development: true, dir: import.meta.url}) +await execute({ development: true, dir: import.meta.url }); diff --git a/bin/run.js b/bin/run.js index 9994322..15e61d1 100755 --- a/bin/run.js +++ b/bin/run.js @@ -1,8 +1,8 @@ #!/usr/bin/env node -import {execute} from '@oclif/core'; +import { execute } from '@oclif/core'; import process from 'process'; process.env.AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE = '1'; -await execute({dir: import.meta.url}) +await execute({ dir: import.meta.url }); diff --git a/cdk/lib/stack.ts b/cdk/lib/stack.ts index 69cbb7a..9791e52 100644 --- a/cdk/lib/stack.ts +++ b/cdk/lib/stack.ts @@ -5,7 +5,7 @@ import { CacclAppEnvironment } from './appEnvironment'; import { CacclSshBastion } from './bastion'; import { CacclCache, CacclCacheOptions } from './cache'; import { CacclMonitoring } from './dashboard'; -import { +import { CacclDbOptions, CacclDocDb, CacclRdsDb, diff --git a/examples/iam-policy.json b/examples/iam-policy.json index c1cc29a..f0d85e6 100644 --- a/examples/iam-policy.json +++ b/examples/iam-policy.json @@ -1,102 +1,100 @@ { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": [ - "acm:Get*", - "acm:List*", - "acm:Describe*", - "cloudformation:*", - "cloudwatch:*", - "ec2-instance-connect:*", - "ec2:*", - "elasticache:*", - "elasticloadbalancing:*", - "events:*", - "ecs:*", - "ecr:*", - "lambda:*", - "logs:*", - "rds:*", - "s3:Get*", - "s3:List*", - "s3:PutObject", - "sns:*", - "ssm:*Parameter*", - "ssm:AddTagsToResource" - ], - "Resource": "*" - }, - { - "Effect": "Allow", - "Action": [ - "secretsmanager:Get*", - "secretsmanager:List*", - "secretsmanager:Create*", - "secretsmanager:Delete*" - ], - "Resource": "*" - }, - { - "Action": [ - "iam:AddRoleToInstanceProfile", - "iam:CreateInstanceProfile", - "iam:CreateRole", - "iam:DeleteInstanceProfile", - "iam:DeleteRole", - "iam:DeleteRolePolicy", - "iam:DetachRolePolicy", - "iam:GetRole", - "iam:GetRolePolicy", - "iam:PutRolePolicy", - "iam:RemoveRoleFromInstanceProfile" - ], - "Effect": "Allow", - "Resource": "*" - }, - { - "Action": "pi:*", - "Effect": "Allow", - "Resource": "arn:aws:pi:*:*:metrics/*" - }, - { - "Action": "iam:PassRole", - "Effect": "Allow", - "Resource": [ - "*" - ], - "Condition": { - "StringLike": { - "iam:PassedToService": [ - "ecs-tasks.amazonaws.com", - "ec2.amazonaws.com", - "ec2.amazonaws.com.cn", - "application-autoscaling.amazonaws.com", - "application-autoscaling.amazonaws.com.cn" - ] - } - } - }, - { - "Effect": "Allow", - "Action": "iam:CreateServiceLinkedRole", - "Resource": "*", - "Condition": { - "StringLike": { - "iam:AWSServiceName": [ - "autoscaling.amazonaws.com", - "ecs.amazonaws.com", - "ecs.application-autoscaling.amazonaws.com", - "spot.amazonaws.com", - "spotfleet.amazonaws.com", - "elasticloadbalancing.amazonaws.com", - "elasticache.amazonaws.com", - "rds.amazonaws.com", - "rds.application-autoscaling.amazonaws.com" - ] - } - } - } - ] + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "acm:Get*", + "acm:List*", + "acm:Describe*", + "cloudformation:*", + "cloudwatch:*", + "ec2-instance-connect:*", + "ec2:*", + "elasticache:*", + "elasticloadbalancing:*", + "events:*", + "ecs:*", + "ecr:*", + "lambda:*", + "logs:*", + "rds:*", + "s3:Get*", + "s3:List*", + "s3:PutObject", + "sns:*", + "ssm:*Parameter*", + "ssm:AddTagsToResource" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "secretsmanager:Get*", + "secretsmanager:List*", + "secretsmanager:Create*", + "secretsmanager:Delete*" + ], + "Resource": "*" + }, + { + "Action": [ + "iam:AddRoleToInstanceProfile", + "iam:CreateInstanceProfile", + "iam:CreateRole", + "iam:DeleteInstanceProfile", + "iam:DeleteRole", + "iam:DeleteRolePolicy", + "iam:DetachRolePolicy", + "iam:GetRole", + "iam:GetRolePolicy", + "iam:PutRolePolicy", + "iam:RemoveRoleFromInstanceProfile" + ], + "Effect": "Allow", + "Resource": "*" + }, + { + "Action": "pi:*", + "Effect": "Allow", + "Resource": "arn:aws:pi:*:*:metrics/*" + }, + { + "Action": "iam:PassRole", + "Effect": "Allow", + "Resource": ["*"], + "Condition": { + "StringLike": { + "iam:PassedToService": [ + "ecs-tasks.amazonaws.com", + "ec2.amazonaws.com", + "ec2.amazonaws.com.cn", + "application-autoscaling.amazonaws.com", + "application-autoscaling.amazonaws.com.cn" + ] + } + } + }, + { + "Effect": "Allow", + "Action": "iam:CreateServiceLinkedRole", + "Resource": "*", + "Condition": { + "StringLike": { + "iam:AWSServiceName": [ + "autoscaling.amazonaws.com", + "ecs.amazonaws.com", + "ecs.application-autoscaling.amazonaws.com", + "spot.amazonaws.com", + "spotfleet.amazonaws.com", + "elasticloadbalancing.amazonaws.com", + "elasticache.amazonaws.com", + "rds.amazonaws.com", + "rds.application-autoscaling.amazonaws.com" + ] + } + } + } + ] } diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 0d61981..9cf63e9 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -56,8 +56,8 @@ "chai": "^4", "eslint": "^8", "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-oclif": "^5", - "eslint-config-oclif-typescript": "^3", + "eslint-config-oclif": "^5.2.1", + "eslint-config-oclif-typescript": "^3.1.11", "eslint-config-prettier": "^9", "eslint-formatter-table": "^7.32.1", "eslint-import-resolver-typescript": "^3.5.1", @@ -80,9 +80,8 @@ }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", - "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", @@ -94,9 +93,8 @@ }, "node_modules/@aws-crypto/crc32c": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", - "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", @@ -105,9 +103,8 @@ }, "node_modules/@aws-crypto/sha1-browser": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", - "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", @@ -119,9 +116,8 @@ }, "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -131,9 +127,8 @@ }, "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" @@ -144,9 +139,8 @@ }, "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" @@ -157,9 +151,8 @@ }, "node_modules/@aws-crypto/sha256-browser": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", @@ -172,9 +165,8 @@ }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -184,9 +176,8 @@ }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" @@ -197,9 +188,8 @@ }, "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" @@ -210,9 +200,8 @@ }, "node_modules/@aws-crypto/sha256-js": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", @@ -224,18 +213,16 @@ }, "node_modules/@aws-crypto/supports-web-crypto": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" } }, "node_modules/@aws-crypto/util": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", @@ -244,9 +231,8 @@ }, "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -256,9 +242,8 @@ }, "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" @@ -269,9 +254,8 @@ }, "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" @@ -282,9 +266,8 @@ }, "node_modules/@aws-sdk/client-cloudfront": { "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudfront/-/client-cloudfront-3.635.0.tgz", - "integrity": "sha512-JHFSh5g/3nj3/Z6Zwll6v2Sgooj5XS9mncmb14BLhIIKg8XJDXMlxsykgCpH7Kf/zpVn3+oufEuz41iX5xQDzQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -337,9 +320,8 @@ }, "node_modules/@aws-sdk/client-s3": { "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.635.0.tgz", - "integrity": "sha512-4RP+DJZWqUka1MW2aSEzTzntY3GrDzS26D8dHZvbt2I0x+dSmlnmXiJkCxLjmti2SDVYAGL9gX6e7mLS7W55jA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", @@ -406,9 +388,8 @@ }, "node_modules/@aws-sdk/client-sso": { "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.635.0.tgz", - "integrity": "sha512-/Hl69+JpFUo9JNVmh2gSvMgYkE4xjd+1okiRoPBbQqjI7YBP2JWCUDP8IoEkNq3wj0vNTq0OWfn6RpZycIkAXQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -455,9 +436,8 @@ }, "node_modules/@aws-sdk/client-sso-oidc": { "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.635.0.tgz", - "integrity": "sha512-RIwDlhzAFttB1vbpznewnPqz7h1H/2UhQLwB38yfZBwYQOxyxVfLV5j5VoUUX3jY4i4qH9wiHc7b02qeAOZY6g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -508,9 +488,8 @@ }, "node_modules/@aws-sdk/client-sts": { "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.635.0.tgz", - "integrity": "sha512-Al2ytE69+cbA44qHlelqhzWwbURikfF13Zkal9utIG5Q6T2c7r8p6sePN92n8l/x1v0FhJ5VTxKak+cPTE0CZQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -559,9 +538,8 @@ }, "node_modules/@aws-sdk/core": { "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/core": "^2.4.0", "@smithy/node-config-provider": "^3.1.4", @@ -580,9 +558,8 @@ }, "node_modules/@aws-sdk/credential-provider-env": { "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", @@ -595,9 +572,8 @@ }, "node_modules/@aws-sdk/credential-provider-http": { "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.635.0.tgz", - "integrity": "sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/fetch-http-handler": "^3.2.4", @@ -615,9 +591,8 @@ }, "node_modules/@aws-sdk/credential-provider-ini": { "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.635.0.tgz", - "integrity": "sha512-+OqcNhhOFFY08YHLjO9/Y1n37RKAO7LADnsJ7VTXca7IfvYh27BVBn+FdlqnyEb1MQ5ArHTY4pq3pKRIg6RW4Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-http": "3.635.0", @@ -640,9 +615,8 @@ }, "node_modules/@aws-sdk/credential-provider-node": { "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.635.0.tgz", - "integrity": "sha512-bmd23mnb94S6AxmWPgqJTnvT9ONKlTx7EPafE1RNO+vUl6mHih4iyqX6ZPaRcSfaPx4U1R7H1RM8cSnafXgaBg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-http": "3.635.0", @@ -663,9 +637,8 @@ }, "node_modules/@aws-sdk/credential-provider-process": { "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", @@ -679,9 +652,8 @@ }, "node_modules/@aws-sdk/credential-provider-sso": { "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.635.0.tgz", - "integrity": "sha512-hO/fKyvUaGpK9zyvCnmJz70EputvGWDr2UTOn/RzvcR6UB4yXoFf0QcCMubEsE3v67EsAv6PadgOeJ0vz6IazA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.635.0", "@aws-sdk/token-providers": "3.614.0", @@ -697,9 +669,8 @@ }, "node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", @@ -715,9 +686,8 @@ }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.620.0.tgz", - "integrity": "sha512-eGLL0W6L3HDb3OACyetZYOWpHJ+gLo0TehQKeQyy2G8vTYXqNTeqYhuI6up9HVjBzU9eQiULVQETmgQs7TFaRg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@aws-sdk/util-arn-parser": "3.568.0", @@ -733,9 +703,8 @@ }, "node_modules/@aws-sdk/middleware-expect-continue": { "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.620.0.tgz", - "integrity": "sha512-QXeRFMLfyQ31nAHLbiTLtk0oHzG9QLMaof5jIfqcUwnOkO8YnQdeqzakrg1Alpy/VQ7aqzIi8qypkBe2KXZz0A==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/protocol-http": "^4.1.0", @@ -748,9 +717,8 @@ }, "node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.620.0.tgz", - "integrity": "sha512-ftz+NW7qka2sVuwnnO1IzBku5ccP+s5qZGeRTPgrKB7OzRW85gthvIo1vQR2w+OwHFk7WJbbhhWwbCbktnP4UA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", @@ -767,9 +735,8 @@ }, "node_modules/@aws-sdk/middleware-host-header": { "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/protocol-http": "^4.1.0", @@ -782,9 +749,8 @@ }, "node_modules/@aws-sdk/middleware-location-constraint": { "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.609.0.tgz", - "integrity": "sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/types": "^3.3.0", @@ -796,9 +762,8 @@ }, "node_modules/@aws-sdk/middleware-logger": { "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/types": "^3.3.0", @@ -810,9 +775,8 @@ }, "node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/protocol-http": "^4.1.0", @@ -825,9 +789,8 @@ }, "node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.635.0.tgz", - "integrity": "sha512-RLdYJPEV4JL/7NBoFUs7VlP90X++5FlJdxHz0DzCjmiD3qCviKy+Cym3qg1gBgHwucs5XisuClxDrGokhAdTQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.635.0", "@aws-sdk/types": "3.609.0", @@ -850,9 +813,8 @@ }, "node_modules/@aws-sdk/middleware-ssec": { "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.609.0.tgz", - "integrity": "sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/types": "^3.3.0", @@ -864,9 +826,8 @@ }, "node_modules/@aws-sdk/middleware-user-agent": { "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.632.0.tgz", - "integrity": "sha512-yY/sFsHKwG9yzSf/DTclqWJaGPI2gPBJDCGBujSqTG1zlS7Ot4fqi91DZ6088BFWzbOorDzJFcAhAEFzc6LuQg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@aws-sdk/util-endpoints": "3.632.0", @@ -880,9 +841,8 @@ }, "node_modules/@aws-sdk/region-config-resolver": { "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/node-config-provider": "^3.1.4", @@ -897,9 +857,8 @@ }, "node_modules/@aws-sdk/signature-v4-multi-region": { "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.635.0.tgz", - "integrity": "sha512-J6QY4/invOkpogCHjSaDON1hF03viPpOnsrzVuCvJMmclS/iG62R4EY0wq1alYll0YmSdmKlpJwHMWwGtqK63Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.635.0", "@aws-sdk/types": "3.609.0", @@ -914,9 +873,8 @@ }, "node_modules/@aws-sdk/token-providers": { "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", @@ -933,9 +891,8 @@ }, "node_modules/@aws-sdk/types": { "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -946,9 +903,8 @@ }, "node_modules/@aws-sdk/util-arn-parser": { "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz", - "integrity": "sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -958,9 +914,8 @@ }, "node_modules/@aws-sdk/util-endpoints": { "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.632.0.tgz", - "integrity": "sha512-LlYMU8pAbcEQphOpE6xaNLJ8kPGhklZZTVzZVpVW477NaaGgoGTMYNXTABYHcxeF5E2lLrxql9OmVpvr8GWN8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/types": "^3.3.0", @@ -973,9 +928,8 @@ }, "node_modules/@aws-sdk/util-locate-window": { "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", - "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -985,9 +939,8 @@ }, "node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", - "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/types": "^3.3.0", @@ -997,9 +950,8 @@ }, "node_modules/@aws-sdk/util-user-agent-node": { "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", - "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/node-config-provider": "^3.1.4", @@ -1020,9 +972,8 @@ }, "node_modules/@aws-sdk/xml-builder": { "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.609.0.tgz", - "integrity": "sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -1033,9 +984,8 @@ }, "node_modules/@babel/code-frame": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -1046,18 +996,16 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -1070,9 +1018,8 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -1082,9 +1029,8 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1096,42 +1042,37 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -1141,9 +1082,8 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -1153,9 +1093,8 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -1168,18 +1107,16 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1200,9 +1137,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1216,15 +1152,13 @@ }, "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1232,9 +1166,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -1244,15 +1177,13 @@ }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1262,19 +1193,16 @@ }, "node_modules/@eslint/js": { "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -1286,9 +1214,8 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1296,9 +1223,8 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1308,9 +1234,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1321,16 +1246,13 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@inquirer/confirm": { "version": "3.1.22", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.22.tgz", - "integrity": "sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^9.0.10", "@inquirer/type": "^1.5.2" @@ -1341,9 +1263,8 @@ }, "node_modules/@inquirer/core": { "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.10.tgz", - "integrity": "sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/figures": "^1.0.5", "@inquirer/type": "^1.5.2", @@ -1365,18 +1286,16 @@ }, "node_modules/@inquirer/core/node_modules/@types/node": { "version": "22.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", - "integrity": "sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~6.19.2" } }, "node_modules/@inquirer/core/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -1386,15 +1305,13 @@ }, "node_modules/@inquirer/core/node_modules/undici-types": { "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@inquirer/core/node_modules/wrap-ansi": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -1406,18 +1323,16 @@ }, "node_modules/@inquirer/figures": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", - "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@inquirer/input": { "version": "2.2.9", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.2.9.tgz", - "integrity": "sha512-7Z6N+uzkWM7+xsE+3rJdhdG/+mQgejOVqspoW+w0AbSZnL6nq5tGMEVASaYVWbkoSzecABWwmludO2evU3d31g==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^9.0.10", "@inquirer/type": "^1.5.2" @@ -1428,9 +1343,8 @@ }, "node_modules/@inquirer/select": { "version": "2.4.7", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.4.7.tgz", - "integrity": "sha512-JH7XqPEkBpNWp3gPCqWqY8ECbyMoFcCZANlL6pV9hf59qK6dGmkOlx1ydyhY+KZ0c5X74+W6Mtp+nm2QX0/MAQ==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/core": "^9.0.10", "@inquirer/figures": "^1.0.5", @@ -1444,9 +1358,8 @@ }, "node_modules/@inquirer/type": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.2.tgz", - "integrity": "sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==", "dev": true, + "license": "MIT", "dependencies": { "mute-stream": "^1.0.0" }, @@ -1456,24 +1369,21 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1481,8 +1391,7 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1493,16 +1402,14 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1511,10 +1418,19 @@ "node": ">= 8" } }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, "node_modules/@oclif/core": { "version": "3.27.0", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-3.27.0.tgz", - "integrity": "sha512-Fg93aNFvXzBq5L7ztVHFP2nYwWU1oTCq48G0TjF/qC1UN36KWa2H5Hsm72kERd5x/sjy2M2Tn4kDEorUlpXOlw==", + "license": "MIT", "dependencies": { "@types/cli-progress": "^3.11.5", "ansi-escapes": "^4.3.2", @@ -1551,8 +1467,7 @@ }, "node_modules/@oclif/plugin-help": { "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.8.tgz", - "integrity": "sha512-QRpFYlBeJffl4cXGBi8e+EfGogDmU7y8do1ZHxmPKZ5eZ0mfeKiqq2WA9dwRMZJriy1qSaGsbkOYgYQWlOYhSg==", + "license": "MIT", "dependencies": { "@oclif/core": "^4" }, @@ -1562,8 +1477,7 @@ }, "node_modules/@oclif/plugin-help/node_modules/@oclif/core": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.18.tgz", - "integrity": "sha512-3EP4zJ+1ndc92UxdNmGX4HhFK5Xh94fWvUeOW1Tu/Ed+/jAljIsbmZyjVhDoE0vV5cftT+3QaVB/LFxaXxty/w==", + "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.3.2", @@ -1589,8 +1503,7 @@ }, "node_modules/@oclif/plugin-help/node_modules/lilconfig": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -1600,9 +1513,8 @@ }, "node_modules/@oclif/plugin-not-found": { "version": "3.2.16", - "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.16.tgz", - "integrity": "sha512-9yGR1lAg4ItSwRb4WhZ41X+6tO55SJjDYnu+EXW9gPCPj64z5qRIBU1ZWUZGtxJpHNB0vUh9nDLTsQAJOw/lnw==", "dev": true, + "license": "MIT", "dependencies": { "@inquirer/confirm": "^3.1.22", "@oclif/core": "^4", @@ -1615,9 +1527,8 @@ }, "node_modules/@oclif/plugin-not-found/node_modules/@oclif/core": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.18.tgz", - "integrity": "sha512-3EP4zJ+1ndc92UxdNmGX4HhFK5Xh94fWvUeOW1Tu/Ed+/jAljIsbmZyjVhDoE0vV5cftT+3QaVB/LFxaXxty/w==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.3.2", @@ -1643,9 +1554,8 @@ }, "node_modules/@oclif/plugin-not-found/node_modules/lilconfig": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" }, @@ -1655,8 +1565,7 @@ }, "node_modules/@oclif/plugin-plugins": { "version": "5.4.4", - "resolved": "https://registry.npmjs.org/@oclif/plugin-plugins/-/plugin-plugins-5.4.4.tgz", - "integrity": "sha512-p30fo3JPtbOqTJOX9A/8qKV/14XWt8xFgG/goVfIkuKBAO+cdY78ag8pYatlpzsYzJhO27X1MFn0WkkPWo36Ww==", + "license": "MIT", "dependencies": { "@oclif/core": "^4", "ansis": "^3.3.2", @@ -1676,8 +1585,7 @@ }, "node_modules/@oclif/plugin-plugins/node_modules/@oclif/core": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.18.tgz", - "integrity": "sha512-3EP4zJ+1ndc92UxdNmGX4HhFK5Xh94fWvUeOW1Tu/Ed+/jAljIsbmZyjVhDoE0vV5cftT+3QaVB/LFxaXxty/w==", + "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.3.2", @@ -1703,8 +1611,7 @@ }, "node_modules/@oclif/plugin-plugins/node_modules/lilconfig": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", "engines": { "node": ">=14" }, @@ -1714,17 +1621,15 @@ }, "node_modules/@oclif/plugin-plugins/node_modules/object-treeify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-4.0.1.tgz", - "integrity": "sha512-Y6tg5rHfsefSkfKujv2SwHulInROy/rCL5F4w0QOWxut8AnxYxf0YmNhTh95Zfyxpsudo66uqkux0ACFnyMSgQ==", + "license": "MIT", "engines": { "node": ">= 16" } }, "node_modules/@oclif/plugin-warn-if-update-available": { "version": "3.1.11", - "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-3.1.11.tgz", - "integrity": "sha512-Pv4EFxhpzspq0n2v0cdfqRwIMwYyd3YOIKny/1Ao71D0pKlpxJ63c9OFDNJAJcUjFOUHzODTtXXNwimOpzfbYg==", "dev": true, + "license": "MIT", "dependencies": { "@oclif/core": "^4", "ansis": "^3.3.1", @@ -1738,9 +1643,8 @@ }, "node_modules/@oclif/plugin-warn-if-update-available/node_modules/@oclif/core": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.18.tgz", - "integrity": "sha512-3EP4zJ+1ndc92UxdNmGX4HhFK5Xh94fWvUeOW1Tu/Ed+/jAljIsbmZyjVhDoE0vV5cftT+3QaVB/LFxaXxty/w==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.3.2", @@ -1766,9 +1670,8 @@ }, "node_modules/@oclif/plugin-warn-if-update-available/node_modules/lilconfig": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" }, @@ -1780,13 +1683,13 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/@oclif/prettier-config/-/prettier-config-0.2.1.tgz", "integrity": "sha512-XB8kwQj8zynXjIIWRm+6gO/r8Qft2xKtwBMSmq1JRqtA6TpwpqECqiu8LosBCyg2JBXuUy2lU23/L98KIR7FrQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@oclif/test": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@oclif/test/-/test-4.0.8.tgz", - "integrity": "sha512-1UDwN2zrNRquQiWfn5wcokeQOOlJMrrn5KPufcrXzrh5otX9C/rkAGyQsJnEisbruPjOO541hzdybUzvK7Kvwg==", "dev": true, + "license": "MIT", "dependencies": { "ansis": "^3.3.2", "debug": "^4.3.6" @@ -1798,11 +1701,17 @@ "@oclif/core": ">= 3.0.0" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/@sindresorhus/is": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -1812,36 +1721,32 @@ }, "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/commons/node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@sinonjs/fake-timers": { "version": "11.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz", - "integrity": "sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "node_modules/@sinonjs/samsam": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", - "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", @@ -1850,33 +1755,29 @@ }, "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/samsam/node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@sinonjs/text-encoding": { "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", - "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", - "dev": true + "dev": true, + "license": "(Unlicense OR Apache-2.0)" }, "node_modules/@smithy/abort-controller": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -1887,18 +1788,16 @@ }, "node_modules/@smithy/chunked-blob-reader": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-3.0.0.tgz", - "integrity": "sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" } }, "node_modules/@smithy/chunked-blob-reader-native": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.0.tgz", - "integrity": "sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" @@ -1906,9 +1805,8 @@ }, "node_modules/@smithy/config-resolver": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^3.1.4", "@smithy/types": "^3.3.0", @@ -1922,9 +1820,8 @@ }, "node_modules/@smithy/core": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.0.tgz", - "integrity": "sha512-cHXq+FneIF/KJbt4q4pjN186+Jf4ZB0ZOqEaZMBhT79srEyGDDBV31NqBRBjazz8ppQ1bJbDJMY9ba5wKFV36w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-retry": "^3.0.15", @@ -1943,9 +1840,8 @@ }, "node_modules/@smithy/credential-provider-imds": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", - "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^3.1.4", "@smithy/property-provider": "^3.1.3", @@ -1959,9 +1855,8 @@ }, "node_modules/@smithy/eventstream-codec": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.2.tgz", - "integrity": "sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^3.3.0", @@ -1971,9 +1866,8 @@ }, "node_modules/@smithy/eventstream-serde-browser": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.6.tgz", - "integrity": "sha512-2hM54UWQUOrki4BtsUI1WzmD13/SeaqT/AB3EUJKbcver/WgKNaiJ5y5F5XXuVe6UekffVzuUDrBZVAA3AWRpQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/eventstream-serde-universal": "^3.0.5", "@smithy/types": "^3.3.0", @@ -1985,9 +1879,8 @@ }, "node_modules/@smithy/eventstream-serde-config-resolver": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.3.tgz", - "integrity": "sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -1998,9 +1891,8 @@ }, "node_modules/@smithy/eventstream-serde-node": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.5.tgz", - "integrity": "sha512-+upXvnHNyZP095s11jF5dhGw/Ihzqwl5G+/KtMnoQOpdfC3B5HYCcDVG9EmgkhJMXJlM64PyN5gjJl0uXFQehQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/eventstream-serde-universal": "^3.0.5", "@smithy/types": "^3.3.0", @@ -2012,9 +1904,8 @@ }, "node_modules/@smithy/eventstream-serde-universal": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.5.tgz", - "integrity": "sha512-5u/nXbyoh1s4QxrvNre9V6vfyoLWuiVvvd5TlZjGThIikc3G+uNiG9uOTCWweSRjv1asdDIWK7nOmN7le4RYHQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/eventstream-codec": "^3.1.2", "@smithy/types": "^3.3.0", @@ -2026,9 +1917,8 @@ }, "node_modules/@smithy/fetch-http-handler": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", - "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^4.1.0", "@smithy/querystring-builder": "^3.0.3", @@ -2039,9 +1929,8 @@ }, "node_modules/@smithy/hash-blob-browser": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.2.tgz", - "integrity": "sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/chunked-blob-reader": "^3.0.0", "@smithy/chunked-blob-reader-native": "^3.0.0", @@ -2051,9 +1940,8 @@ }, "node_modules/@smithy/hash-node": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "@smithy/util-buffer-from": "^3.0.0", @@ -2066,9 +1954,8 @@ }, "node_modules/@smithy/hash-stream-node": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.2.tgz", - "integrity": "sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "@smithy/util-utf8": "^3.0.0", @@ -2080,9 +1967,8 @@ }, "node_modules/@smithy/invalid-dependency": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -2090,9 +1976,8 @@ }, "node_modules/@smithy/is-array-buffer": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -2102,9 +1987,8 @@ }, "node_modules/@smithy/md5-js": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.3.tgz", - "integrity": "sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "@smithy/util-utf8": "^3.0.0", @@ -2113,9 +1997,8 @@ }, "node_modules/@smithy/middleware-content-length": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", - "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^4.1.0", "@smithy/types": "^3.3.0", @@ -2127,9 +2010,8 @@ }, "node_modules/@smithy/middleware-endpoint": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", - "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/middleware-serde": "^3.0.3", "@smithy/node-config-provider": "^3.1.4", @@ -2145,9 +2027,8 @@ }, "node_modules/@smithy/middleware-retry": { "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.15.tgz", - "integrity": "sha512-iTMedvNt1ApdvkaoE8aSDuwaoc+BhvHqttbA/FO4Ty+y/S5hW6Ci/CTScG7vam4RYJWZxdTElc3MEfHRVH6cgQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^3.1.4", "@smithy/protocol-http": "^4.1.0", @@ -2165,22 +2046,20 @@ }, "node_modules/@smithy/middleware-retry/node_modules/uuid": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/@smithy/middleware-serde": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -2191,9 +2070,8 @@ }, "node_modules/@smithy/middleware-stack": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -2204,9 +2082,8 @@ }, "node_modules/@smithy/node-config-provider": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^3.1.3", "@smithy/shared-ini-file-loader": "^3.1.4", @@ -2219,9 +2096,8 @@ }, "node_modules/@smithy/node-http-handler": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", - "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^3.1.1", "@smithy/protocol-http": "^4.1.0", @@ -2235,9 +2111,8 @@ }, "node_modules/@smithy/property-provider": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -2248,9 +2123,8 @@ }, "node_modules/@smithy/protocol-http": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", - "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -2261,9 +2135,8 @@ }, "node_modules/@smithy/querystring-builder": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "@smithy/util-uri-escape": "^3.0.0", @@ -2275,9 +2148,8 @@ }, "node_modules/@smithy/querystring-parser": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -2288,9 +2160,8 @@ }, "node_modules/@smithy/service-error-classification": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0" }, @@ -2300,9 +2171,8 @@ }, "node_modules/@smithy/shared-ini-file-loader": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -2313,9 +2183,8 @@ }, "node_modules/@smithy/signature-v4": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", - "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^3.0.0", "@smithy/protocol-http": "^4.1.0", @@ -2332,9 +2201,8 @@ }, "node_modules/@smithy/smithy-client": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.2.0.tgz", - "integrity": "sha512-pDbtxs8WOhJLJSeaF/eAbPgXg4VVYFlRcL/zoNYA5WbG3wBL06CHtBSg53ppkttDpAJ/hdiede+xApip1CwSLw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-stack": "^3.0.3", @@ -2349,9 +2217,8 @@ }, "node_modules/@smithy/types": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -2361,9 +2228,8 @@ }, "node_modules/@smithy/url-parser": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/querystring-parser": "^3.0.3", "@smithy/types": "^3.3.0", @@ -2372,9 +2238,8 @@ }, "node_modules/@smithy/util-base64": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-utf8": "^3.0.0", @@ -2386,18 +2251,16 @@ }, "node_modules/@smithy/util-body-length-browser": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" } }, "node_modules/@smithy/util-body-length-node": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -2407,9 +2270,8 @@ }, "node_modules/@smithy/util-buffer-from": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" @@ -2420,9 +2282,8 @@ }, "node_modules/@smithy/util-config-provider": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -2432,9 +2293,8 @@ }, "node_modules/@smithy/util-defaults-mode-browser": { "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.15.tgz", - "integrity": "sha512-FZ4Psa3vjp8kOXcd3HJOiDPBCWtiilLl57r0cnNtq/Ga9RSDrM5ERL6xt+tO43+2af6Pn5Yp92x2n5vPuduNfg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^3.1.3", "@smithy/smithy-client": "^3.2.0", @@ -2448,9 +2308,8 @@ }, "node_modules/@smithy/util-defaults-mode-node": { "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.15.tgz", - "integrity": "sha512-KSyAAx2q6d0t6f/S4XB2+3+6aQacm3aLMhs9aLMqn18uYGUepbdssfogW5JQZpc6lXNBnp0tEnR5e9CEKmEd7A==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^3.0.5", "@smithy/credential-provider-imds": "^3.2.0", @@ -2466,9 +2325,8 @@ }, "node_modules/@smithy/util-endpoints": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^3.1.4", "@smithy/types": "^3.3.0", @@ -2480,9 +2338,8 @@ }, "node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -2492,9 +2349,8 @@ }, "node_modules/@smithy/util-middleware": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -2505,9 +2361,8 @@ }, "node_modules/@smithy/util-retry": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/service-error-classification": "^3.0.3", "@smithy/types": "^3.3.0", @@ -2519,9 +2374,8 @@ }, "node_modules/@smithy/util-stream": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", - "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/fetch-http-handler": "^3.2.4", "@smithy/node-http-handler": "^3.1.4", @@ -2538,9 +2392,8 @@ }, "node_modules/@smithy/util-uri-escape": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -2550,9 +2403,8 @@ }, "node_modules/@smithy/util-utf8": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" @@ -2563,9 +2415,8 @@ }, "node_modules/@smithy/util-waiter": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.2.tgz", - "integrity": "sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^3.1.1", "@smithy/types": "^3.3.0", @@ -2577,9 +2428,8 @@ }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -2589,112 +2439,95 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/chai": { "version": "4.3.19", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.19.tgz", - "integrity": "sha512-2hHHvQBVE2FiSK4eN0Br6snX9MtolHaTo/batnLjlGRhoQzlCL61iVpxoqO7SfFyOw+P/pwv+0zNHzKoGWz9Cw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/cli-progress": { "version": "3.11.6", - "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.6.tgz", - "integrity": "sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/figlet": { "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@types/figlet/-/figlet-1.5.8.tgz", - "integrity": "sha512-G22AUvy4Tl95XLE7jmUM8s8mKcoz+Hr+Xm9W90gJsppJq9f9tHvOGkrpn4gRX0q/cLtBdNkWtWCKDg2UDZoZvQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/flat": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@types/flat/-/flat-5.0.5.tgz", - "integrity": "sha512-nPLljZQKSnac53KDUDzuzdRfGI0TDb5qPrb+SrQyN3MtdQrOnGsKniHN1iYZsJEBIVQve94Y6gNz22sgISZq+Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/http-cache-semantics": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mocha": { "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", - "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mute-stream": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/node": { "version": "18.19.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.45.tgz", - "integrity": "sha512-VZxPKNNhjKmaC1SUYowuXSRSMGyQGmQjvvA1xE4QZ0xce2kLtEhPDS+kqpCPBZYgqblCLQ2DAjSzmgCM5auvhA==", + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/object-hash": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-2.2.1.tgz", - "integrity": "sha512-i/rtaJFCsPljrZvP/akBqEwUP2y5cZLOmvO+JaYnz01aPknrQ+hB5MRcO7iqCUsFaYfTG8kGfKUyboA07xeDHQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/prompts": { "version": "2.4.9", - "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.9.tgz", - "integrity": "sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "kleur": "^3.0.3" @@ -2702,31 +2535,26 @@ }, "node_modules/@types/semver": { "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/tempy": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@types/tempy/-/tempy-0.3.0.tgz", - "integrity": "sha512-graSgBSy4TEsenfAasXh28mxfdrLkgrFlXU8QFShFVNHEGHCg5IfO5LBlZjq2SAUnCm/VdxvuQKlp2buPR/YwA==", - "deprecated": "This is a stub types definition. tempy provides its own type definitions, so you do not need this installed.", "dev": true, + "license": "MIT", "dependencies": { "tempy": "*" } }, "node_modules/@types/wrap-ansi": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -2758,9 +2586,8 @@ }, "node_modules/@typescript-eslint/experimental-utils": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", - "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/utils": "5.62.0" }, @@ -2777,9 +2604,8 @@ }, "node_modules/@typescript-eslint/parser": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -2804,9 +2630,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0" @@ -2821,9 +2646,8 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "5.62.0", "@typescript-eslint/utils": "5.62.0", @@ -2848,9 +2672,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2861,9 +2684,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", @@ -2888,9 +2710,8 @@ }, "node_modules/@typescript-eslint/utils": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", @@ -2914,9 +2735,8 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" @@ -2931,15 +2751,13 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/acorn": { "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2949,18 +2767,16 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, @@ -2970,8 +2786,7 @@ }, "node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -2985,8 +2800,7 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -3001,17 +2815,15 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -3024,16 +2836,14 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -3046,22 +2856,19 @@ }, "node_modules/ansicolors": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==" + "license": "MIT" }, "node_modules/ansis": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.3.2.tgz", - "integrity": "sha512-cFthbBlt+Oi0i9Pv/j6YdVWJh54CtjGACaMPCIrEV4Ha7HWsIjXDwseYV79TIL0B4+KfSwD5S70PeQDkPUd1rA==", + "license": "ISC", "engines": { "node": ">=15" } }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3072,23 +2879,20 @@ }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -3102,9 +2906,8 @@ }, "node_modules/array-includes": { "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3122,17 +2925,15 @@ }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/array.prototype.findlastindex": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3150,9 +2951,8 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -3168,9 +2968,8 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -3186,9 +2985,8 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -3208,47 +3006,41 @@ }, "node_modules/assertion-error": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/astral-regex": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/async": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + "license": "MIT" }, "node_modules/async-retry": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", "dev": true, + "license": "MIT", "dependencies": { "retry": "0.13.1" } }, "node_modules/atomically": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "license": "MIT", "engines": { "node": ">=10.12.0" } }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -3261,8 +3053,7 @@ }, "node_modules/aws-cdk": { "version": "2.41.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.41.0.tgz", - "integrity": "sha512-Ubko4X8VcbaLzcXvCQZPKBtgwBq033m5sSWtdrbdlDp7s2J4uWtY6KdO1uYKAvHyWjm7kGVmDyL1Wj1zx3TPUg==", + "license": "Apache-2.0", "bin": { "cdk": "bin/cdk" }, @@ -3275,8 +3066,6 @@ }, "node_modules/aws-cdk-lib": { "version": "2.41.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.41.0.tgz", - "integrity": "sha512-wh6lDaarzb8B+43TMxEBg+yHcXU9omlUGJz9zSdgjrmeQWBV8SD0jIvrERhDFvQLmRY4Vzy7FXxkI0mU+adDHQ==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -3288,6 +3077,7 @@ "semver", "yaml" ], + "license": "Apache-2.0", "dependencies": { "@balena/dockerignore": "^1.0.2", "case": "1.6.3", @@ -3459,9 +3249,8 @@ }, "node_modules/aws-sdk": { "version": "2.1680.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1680.0.tgz", - "integrity": "sha512-XHNyhvVB49DC7Ea7+Gsvy4B+xP7tyry6Gw3b9g/DcilA1xmxxRzu8VE9GJ2rP4jYMc/TkX9FHkp5WLo57sITZA==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -3480,9 +3269,8 @@ }, "node_modules/aws-sdk-mock": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/aws-sdk-mock/-/aws-sdk-mock-6.1.1.tgz", - "integrity": "sha512-WqGodclZDv5tZmoC/1A4V4c4hSwageOoy90cJisrkdLUq/1jEhulajkNL4UkmD9Nc6zhQuLD6WXIbB/ROM+K2A==", "dev": true, + "license": "Apache-2.0", "dependencies": { "aws-sdk": "^2.1231.0", "neotraverse": "^0.6.15", @@ -3494,13 +3282,10 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -3514,13 +3299,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -3530,22 +3315,19 @@ }, "node_modules/bowser": { "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -3555,14 +3337,12 @@ }, "node_modules/browser-stdout": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/buffer": { "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "license": "MIT", "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -3571,14 +3351,14 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "license": "MIT" }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -3591,24 +3371,23 @@ "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.0.0" } }, "node_modules/cacheable-lookup": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" } }, "node_modules/cacheable-request": { "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -3624,8 +3403,7 @@ }, "node_modules/call-bind": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -3642,17 +3420,15 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camel-case": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -3660,9 +3436,8 @@ }, "node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3672,9 +3447,8 @@ }, "node_modules/capital-case": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -3683,8 +3457,7 @@ }, "node_modules/cardinal": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", + "license": "MIT", "dependencies": { "ansicolors": "~0.3.2", "redeyed": "~2.1.0" @@ -3695,9 +3468,8 @@ }, "node_modules/chai": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, + "license": "MIT", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -3713,8 +3485,7 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3728,8 +3499,7 @@ }, "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3739,9 +3509,8 @@ }, "node_modules/change-case": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", "dev": true, + "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", @@ -3759,9 +3528,8 @@ }, "node_modules/check-error": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.2" }, @@ -3771,9 +3539,8 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -3795,9 +3562,8 @@ }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -3816,6 +3582,7 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } @@ -3825,6 +3592,7 @@ "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -3837,14 +3605,14 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/clean-stack": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", - "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", + "license": "MIT", "dependencies": { "escape-string-regexp": "4.0.0" }, @@ -3857,9 +3625,8 @@ }, "node_modules/cli-cursor": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^4.0.0" }, @@ -3872,8 +3639,7 @@ }, "node_modules/cli-progress": { "version": "3.12.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", - "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "license": "MIT", "dependencies": { "string-width": "^4.2.3" }, @@ -3883,8 +3649,7 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -3894,9 +3659,8 @@ }, "node_modules/cli-truncate": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, + "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" @@ -3910,9 +3674,8 @@ }, "node_modules/cli-truncate/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3922,9 +3685,8 @@ }, "node_modules/cli-truncate/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3934,15 +3696,13 @@ }, "node_modules/cli-truncate/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3952,9 +3712,8 @@ }, "node_modules/cli-truncate/node_modules/slice-ansi": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -3968,9 +3727,8 @@ }, "node_modules/cli-truncate/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -3985,9 +3743,8 @@ }, "node_modules/cli-truncate/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -4000,17 +3757,15 @@ }, "node_modules/cli-width": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, + "license": "ISC", "engines": { "node": ">= 12" } }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -4022,17 +3777,15 @@ }, "node_modules/clone": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/color": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" @@ -4043,8 +3796,7 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4054,13 +3806,11 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/color-string": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -4068,28 +3818,24 @@ }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/commander": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" } }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "license": "MIT" }, "node_modules/conf": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", - "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", + "license": "MIT", "dependencies": { "ajv": "^8.6.3", "ajv-formats": "^2.1.1", @@ -4111,15 +3857,13 @@ }, "node_modules/confusing-browser-globals": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/constant-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -4128,31 +3872,27 @@ }, "node_modules/constructs": { "version": "10.1.314", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.314.tgz", - "integrity": "sha512-wqQn0tuwYmj7tl/nSfnlw/1uaBcFDhjSe6UMVvxwGwXyAg/ZUqpiWFbrojxPqDOAQPCNEj8LjL7IH1SPioa6kg==", + "license": "Apache-2.0", "engines": { "node": ">= 14.17.0" } }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4164,13 +3904,11 @@ }, "node_modules/cross-spawn/node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "license": "ISC" }, "node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -4183,8 +3921,7 @@ }, "node_modules/crypto-random-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", "dependencies": { "type-fest": "^1.0.1" }, @@ -4197,8 +3934,7 @@ }, "node_modules/crypto-random-string/node_modules/type-fest": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4208,9 +3944,8 @@ }, "node_modules/data-view-buffer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -4225,9 +3960,8 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -4242,9 +3976,8 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -4259,8 +3992,7 @@ }, "node_modules/debounce-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "license": "MIT", "dependencies": { "mimic-fn": "^3.0.0" }, @@ -4273,8 +4005,7 @@ }, "node_modules/debug": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -4289,9 +4020,8 @@ }, "node_modules/decamelize": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4301,9 +4031,8 @@ }, "node_modules/decompress-response": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -4316,9 +4045,8 @@ }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4328,9 +4056,8 @@ }, "node_modules/deep-eql": { "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, + "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, @@ -4340,23 +4067,20 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/defer-to-connect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -4371,9 +4095,8 @@ }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -4388,18 +4111,16 @@ }, "node_modules/detect-indent": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", - "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" } }, "node_modules/detect-newline": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", - "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -4409,17 +4130,15 @@ }, "node_modules/diff": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -4429,9 +4148,8 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -4441,9 +4159,8 @@ }, "node_modules/dot-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -4451,8 +4168,7 @@ }, "node_modules/dot-prop": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -4465,14 +4181,12 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ejs": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -4485,14 +4199,12 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/enhanced-resolve": { "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -4503,26 +4215,23 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -4580,8 +4289,7 @@ }, "node_modules/es-define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -4591,17 +4299,15 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-object-atoms": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -4611,9 +4317,8 @@ }, "node_modules/es-set-tostringtag": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -4625,18 +4330,16 @@ }, "node_modules/es-shim-unscopables": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -4651,16 +4354,14 @@ }, "node_modules/escalade": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -4670,9 +4371,8 @@ }, "node_modules/eslint": { "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -4725,9 +4425,8 @@ }, "node_modules/eslint-config-airbnb-base": { "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, + "license": "MIT", "dependencies": { "confusing-browser-globals": "^1.0.10", "object.assign": "^4.1.2", @@ -4744,9 +4443,8 @@ }, "node_modules/eslint-config-airbnb-base/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -4756,6 +4454,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-oclif/-/eslint-config-oclif-5.2.1.tgz", "integrity": "sha512-f0I7oB3lkbEnTqH+F18tKNmZG78aDjiCWz7co0Zbz6s12k655jUvb6FtzHniCmATqaHfcVVdrOldBT6P3bKpxA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-config-xo-space": "^0.35.0", "eslint-plugin-mocha": "^10.5.0", @@ -4767,16 +4466,17 @@ } }, "node_modules/eslint-config-oclif-typescript": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/eslint-config-oclif-typescript/-/eslint-config-oclif-typescript-3.1.9.tgz", - "integrity": "sha512-sQ0PfzhMVhu3+oP/2LMQkcGSdtszwhUdw1Tb01QimEkg5PTVJp+8QlJkTytWp+6yVyVLUL2H/J4TgCtjJ/DQgA==", + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/eslint-config-oclif-typescript/-/eslint-config-oclif-typescript-3.1.11.tgz", + "integrity": "sha512-4ES2PhL8nsKaVRqQoSwYwteoLnnns72vh6Sc5INsOSKpa/kDsG9nlLC/+kxcpLWy8A1p5JFDAwrDyg6qXbwZtg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "eslint-config-xo-space": "^0.35.0", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-import": "^2.29.1", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-mocha": "^10.5.0", "eslint-plugin-n": "^15", "eslint-plugin-perfectionist": "^2.11.0" @@ -4790,6 +4490,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", @@ -4825,6 +4526,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", @@ -4853,6 +4555,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" @@ -4870,6 +4573,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", @@ -4897,6 +4601,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, + "license": "MIT", "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -4910,6 +4615,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", @@ -4938,6 +4644,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", @@ -4963,6 +4670,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" @@ -4980,6 +4688,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4992,9 +4701,8 @@ }, "node_modules/eslint-config-prettier": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -5007,6 +4715,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.44.0.tgz", "integrity": "sha512-YG4gdaor0mJJi8UBeRJqDPO42MedTWYMaUyucF5bhm2pi/HS98JIxfFQmTLuyj6hGpQlAazNfyVnn7JuDn+Sew==", "dev": true, + "license": "MIT", "dependencies": { "confusing-browser-globals": "1.0.11" }, @@ -5025,6 +4734,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-xo-space/-/eslint-config-xo-space-0.35.0.tgz", "integrity": "sha512-+79iVcoLi3PvGcjqYDpSPzbLfqYpNcMlhsCBRsnmDoHAn4npJG6YxmHpelQKpXM7v/EeZTUKb4e1xotWlei8KA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-config-xo": "^0.44.0" }, @@ -5040,9 +4750,8 @@ }, "node_modules/eslint-formatter-table": { "version": "7.32.1", - "resolved": "https://registry.npmjs.org/eslint-formatter-table/-/eslint-formatter-table-7.32.1.tgz", - "integrity": "sha512-JYC49hAJMNjLfbgXVeQHU6ngP0M8ThgXCHLGrncYB+R/RHEhRPnLxHjolTJdb7RdQ8zcCt2F7Mrt6Ou3PwMOHw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "table": "^6.0.9" @@ -5053,9 +4762,8 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -5064,25 +4772,26 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", + "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", "dev": true, + "license": "ISC", "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.5", + "enhanced-resolve": "^5.15.0", + "eslint-module-utils": "^2.8.1", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", "is-glob": "^4.0.3" }, "engines": { @@ -5093,14 +4802,24 @@ }, "peerDependencies": { "eslint": "*", - "eslint-plugin-import": "*" + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -5115,18 +4834,16 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-cdk": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-cdk/-/eslint-plugin-cdk-1.8.0.tgz", - "integrity": "sha512-qcG+0Y4cmOZ2jYCCPQx8dP1AElwDZdxRDaIGPgLOhr8wbL/9OUlycEtLue7Lpjzc5nzaiUM0OP99frJ3wZ59mg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "^5.4.0", "read-pkg-up": "^7.0.1" @@ -5143,6 +4860,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", "dev": true, + "license": "MIT", "dependencies": { "eslint-utils": "^2.0.0", "regexpp": "^3.0.0" @@ -5162,6 +4880,7 @@ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -5177,31 +4896,34 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", "tsconfig-paths": "^3.15.0" }, @@ -5214,9 +4936,8 @@ }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5224,18 +4945,16 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -5245,9 +4964,8 @@ }, "node_modules/eslint-plugin-import/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5257,18 +4975,16 @@ }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-jest": { "version": "27.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", - "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^5.10.0" }, @@ -5294,6 +5010,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz", "integrity": "sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==", "dev": true, + "license": "MIT", "dependencies": { "eslint-utils": "^3.0.0", "globals": "^13.24.0", @@ -5311,6 +5028,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", "dev": true, + "license": "MIT", "dependencies": { "builtins": "^5.0.1", "eslint-plugin-es": "^4.1.0", @@ -5336,6 +5054,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5346,6 +5065,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5358,6 +5078,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-2.11.0.tgz", "integrity": "sha512-XrtBtiu5rbQv88gl+1e2RQud9te9luYNvKIgM9emttQ2zutHPzY/AQUucwxscDKV4qlTkvLTxjOFvxqeDpPorw==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^6.13.0 || ^7.0.0", "minimatch": "^9.0.3", @@ -5390,6 +5111,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" @@ -5407,6 +5129,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -5420,6 +5143,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", @@ -5448,6 +5172,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", @@ -5470,6 +5195,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "7.18.0", "eslint-visitor-keys": "^3.4.3" @@ -5487,6 +5213,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-48.0.1.tgz", "integrity": "sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", "@eslint-community/eslint-utils": "^4.4.0", @@ -5516,9 +5243,8 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -5532,6 +5258,7 @@ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -5550,15 +5277,15 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10" } }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -5568,9 +5295,8 @@ }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5584,15 +5310,13 @@ }, "node_modules/eslint/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5600,9 +5324,8 @@ }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -5616,18 +5339,16 @@ }, "node_modules/eslint/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/eslint/node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -5637,15 +5358,13 @@ }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5655,9 +5374,8 @@ }, "node_modules/espree": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -5672,8 +5390,7 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -5684,9 +5401,8 @@ }, "node_modules/esquery": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -5696,18 +5412,16 @@ }, "node_modules/esquery/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -5717,50 +5431,44 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/events": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "license": "MIT", "engines": { "node": ">=0.4.x" } }, "node_modules/execa": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -5781,9 +5489,8 @@ }, "node_modules/execa/node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5793,9 +5500,8 @@ }, "node_modules/execa/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -5808,13 +5514,11 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5828,8 +5532,7 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -5839,28 +5542,23 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", - "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", "dev": true, + "license": "MIT", "dependencies": { "fastest-levenshtein": "^1.0.7" } }, "node_modules/fast-uri": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" + "license": "MIT" }, "node_modules/fast-xml-parser": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", "dev": true, "funding": [ { @@ -5872,6 +5570,7 @@ "url": "https://paypal.me/naturalintelligence" } ], + "license": "MIT", "dependencies": { "strnum": "^1.0.5" }, @@ -5881,25 +5580,22 @@ }, "node_modules/fastest-levenshtein": { "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } }, "node_modules/fastq": { "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/figlet": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.7.0.tgz", - "integrity": "sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==", + "license": "MIT", "bin": { "figlet": "bin/index.js" }, @@ -5909,9 +5605,8 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -5921,16 +5616,14 @@ }, "node_modules/filelist": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -5940,8 +5633,7 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5951,9 +5643,8 @@ }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -5967,26 +5658,23 @@ }, "node_modules/find-yarn-workspace-root": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "micromatch": "^4.0.2" } }, "node_modules/flat": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/flat-cache": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -5998,32 +5686,28 @@ }, "node_modules/flatted": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/for-each": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/form-data-encoder": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14.17" } }, "node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -6035,36 +5719,29 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, + "license": "MIT", "optional": true, - "os": [ - "darwin" - ], + "os": ["darwin"], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -6080,34 +5757,30 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-func-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/get-intrinsic": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -6124,17 +5797,15 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-stdin": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -6144,9 +5815,8 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6156,9 +5826,8 @@ }, "node_modules/get-symbol-description": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -6173,9 +5842,8 @@ }, "node_modules/get-tsconfig": { "version": "4.7.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", - "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", "dev": true, + "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -6185,25 +5853,21 @@ }, "node_modules/git-hooks-list": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-3.1.0.tgz", - "integrity": "sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/fisker/git-hooks-list?sponsor=1" } }, "node_modules/github-slugger": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/glob": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6220,9 +5884,8 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -6232,9 +5895,8 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6244,9 +5906,8 @@ }, "node_modules/globals": { "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -6259,9 +5920,8 @@ }, "node_modules/globals/node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6271,9 +5931,8 @@ }, "node_modules/globalthis": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -6287,8 +5946,7 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -6306,8 +5964,7 @@ }, "node_modules/gopd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -6317,9 +5974,8 @@ }, "node_modules/got": { "version": "13.0.0", - "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", - "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -6342,37 +5998,32 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-bigints": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -6382,8 +6033,7 @@ }, "node_modules/has-proto": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6393,8 +6043,7 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6404,8 +6053,7 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -6418,8 +6066,7 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -6429,18 +6076,16 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/header-case": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", "dev": true, + "license": "MIT", "dependencies": { "capital-case": "^1.0.4", "tslib": "^2.0.3" @@ -6448,8 +6093,7 @@ }, "node_modules/hosted-git-info": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -6459,15 +6103,13 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/http-call": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/http-call/-/http-call-5.3.0.tgz", - "integrity": "sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==", "dev": true, + "license": "ISC", "dependencies": { "content-type": "^1.0.4", "debug": "^4.1.1", @@ -6482,9 +6124,8 @@ }, "node_modules/http-call/node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -6494,9 +6135,8 @@ }, "node_modules/http2-wrapper": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dev": true, + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -6507,18 +6147,16 @@ }, "node_modules/human-signals": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=14.18.0" } }, "node_modules/husky": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true, + "license": "MIT", "bin": { "husky": "lib/bin.js" }, @@ -6531,30 +6169,26 @@ }, "node_modules/hyperlinker": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", - "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/ieee754": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -6568,27 +6202,23 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -6596,14 +6226,12 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/internal-slot": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -6615,17 +6243,15 @@ }, "node_modules/interpret": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/is-arguments": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -6639,9 +6265,8 @@ }, "node_modules/is-array-buffer": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -6655,15 +6280,13 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-bigint": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -6673,9 +6296,8 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6685,9 +6307,8 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -6704,6 +6325,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, + "license": "MIT", "dependencies": { "builtin-modules": "^3.3.0" }, @@ -6714,10 +6336,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-bun-module": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", + "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + } + }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6727,9 +6358,8 @@ }, "node_modules/is-core-module": { "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -6742,9 +6372,8 @@ }, "node_modules/is-data-view": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, + "license": "MIT", "dependencies": { "is-typed-array": "^1.1.13" }, @@ -6757,9 +6386,8 @@ }, "node_modules/is-date-object": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -6772,8 +6400,7 @@ }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -6786,24 +6413,21 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-function": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -6816,8 +6440,7 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -6827,9 +6450,8 @@ }, "node_modules/is-negative-zero": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6839,17 +6461,15 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -6862,26 +6482,23 @@ }, "node_modules/is-obj": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -6891,9 +6508,8 @@ }, "node_modules/is-regex": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -6907,18 +6523,16 @@ }, "node_modules/is-retry-allowed": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-shared-array-buffer": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7" }, @@ -6931,8 +6545,7 @@ }, "node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6942,9 +6555,8 @@ }, "node_modules/is-string": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -6957,9 +6569,8 @@ }, "node_modules/is-symbol": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -6972,8 +6583,7 @@ }, "node_modules/is-typed-array": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" }, @@ -6986,9 +6596,8 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6998,9 +6607,8 @@ }, "node_modules/is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -7010,8 +6618,7 @@ }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -7021,21 +6628,18 @@ }, "node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "license": "MIT" }, "node_modules/isexe": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "license": "ISC", "engines": { "node": ">=16" } }, "node_modules/jake": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -7051,8 +6655,7 @@ }, "node_modules/jake/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7060,8 +6663,7 @@ }, "node_modules/jake/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7071,22 +6673,19 @@ }, "node_modules/jmespath": { "version": "0.16.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", - "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "license": "Apache-2.0", "engines": { "node": ">= 0.6.0" } }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -7100,6 +6699,7 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -7109,43 +6709,36 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-better-errors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "license": "MIT" }, "node_modules/json-schema-typed": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" + "license": "BSD-2-Clause" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -7155,41 +6748,36 @@ }, "node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/just-extend": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", - "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -7200,24 +6788,21 @@ }, "node_modules/lilconfig": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lint-staged": { "version": "13.3.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.3.0.tgz", - "integrity": "sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "5.3.0", "commander": "11.0.0", @@ -7242,9 +6827,8 @@ }, "node_modules/lint-staged/node_modules/chalk": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -7254,9 +6838,8 @@ }, "node_modules/lint-staged/node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -7271,9 +6854,8 @@ }, "node_modules/lint-staged/node_modules/micromatch": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -7284,9 +6866,8 @@ }, "node_modules/listr2": { "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "dev": true, + "license": "MIT", "dependencies": { "cli-truncate": "^3.1.0", "colorette": "^2.0.20", @@ -7309,9 +6890,8 @@ }, "node_modules/listr2/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -7321,9 +6901,8 @@ }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -7333,15 +6912,13 @@ }, "node_modules/listr2/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/listr2/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -7356,9 +6933,8 @@ }, "node_modules/listr2/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -7371,9 +6947,8 @@ }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -7388,9 +6963,8 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -7403,32 +6977,27 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.get": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -7442,9 +7011,8 @@ }, "node_modules/log-update": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^5.0.0", "cli-cursor": "^4.0.0", @@ -7461,9 +7029,8 @@ }, "node_modules/log-update/node_modules/ansi-escapes": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^1.0.2" }, @@ -7476,9 +7043,8 @@ }, "node_modules/log-update/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -7488,9 +7054,8 @@ }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -7500,15 +7065,13 @@ }, "node_modules/log-update/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -7518,9 +7081,8 @@ }, "node_modules/log-update/node_modules/slice-ansi": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -7534,9 +7096,8 @@ }, "node_modules/log-update/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -7551,9 +7112,8 @@ }, "node_modules/log-update/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -7566,9 +7126,8 @@ }, "node_modules/log-update/node_modules/type-fest": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -7578,9 +7137,8 @@ }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -7595,26 +7153,23 @@ }, "node_modules/loupe": { "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.1" } }, "node_modules/lower-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/lowercase-keys": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -7624,33 +7179,28 @@ }, "node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "license": "ISC" }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -7661,17 +7211,15 @@ }, "node_modules/mimic-fn": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/mimic-response": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -7684,14 +7232,14 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/minimatch": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7704,18 +7252,16 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/mocha": { "version": "10.7.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", - "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", @@ -7748,24 +7294,21 @@ }, "node_modules/mocha-suppress-logs": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mocha-suppress-logs/-/mocha-suppress-logs-0.5.1.tgz", - "integrity": "sha512-f4BhMiCABgCt3tlXiOcRydWreNCkfvgXgNL2ZclfXPdLNcY7jfyNy3Oi5wwPuxx++UyuNiIx3F7orvckAfrKzw==", "dev": true, + "license": "MIT", "dependencies": { "clone": "^2.1.2" } }, "node_modules/mocha/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/mocha/node_modules/cliui": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -7774,9 +7317,8 @@ }, "node_modules/mocha/node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -7786,9 +7328,8 @@ }, "node_modules/mocha/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7798,15 +7339,13 @@ }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mocha/node_modules/yargs": { "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -7822,60 +7361,52 @@ }, "node_modules/moment": { "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "license": "MIT" }, "node_modules/mute-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/natural-compare-lite": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/natural-orderby": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", - "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/neotraverse": { "version": "0.6.18", - "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", - "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/nise": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", - "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0", "@sinonjs/fake-timers": "^11.2.2", @@ -7886,8 +7417,7 @@ }, "node_modules/no-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -7895,8 +7425,7 @@ }, "node_modules/node-fetch": { "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -7914,9 +7443,8 @@ }, "node_modules/normalize-package-data": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", @@ -7928,18 +7456,16 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -7949,8 +7475,6 @@ }, "node_modules/npm": { "version": "10.8.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.2.tgz", - "integrity": "sha512-x/AIjFIKRllrhcb48dqUNAAZl0ig9+qMuN91RpZo3Cb2+zuibfh+KISl6+kVVyktDz230JKc208UkQwwMqyB+w==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -8021,6 +7545,7 @@ "which", "write-file-atomic" ], + "license": "Artistic-2.0", "workspaces": [ "docs", "smoke-tests", @@ -8108,8 +7633,7 @@ }, "node_modules/npm-package-arg": { "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "license": "ISC", "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", @@ -8122,8 +7646,7 @@ }, "node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -8136,8 +7659,7 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -9117,9 +8639,7 @@ }, "node_modules/npm/node_modules/jsonparse": { "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], + "engines": ["node >= 0.2.0"], "inBundle": true, "license": "MIT" }, @@ -10345,17 +9865,15 @@ }, "node_modules/object-hash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10365,26 +9883,23 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object-treeify": { "version": "1.1.33", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", - "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/object.assign": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -10400,9 +9915,8 @@ }, "node_modules/object.entries": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -10414,9 +9928,8 @@ }, "node_modules/object.fromentries": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -10432,9 +9945,8 @@ }, "node_modules/object.groupby": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -10446,9 +9958,8 @@ }, "node_modules/object.values": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -10463,9 +9974,8 @@ }, "node_modules/oclif": { "version": "4.14.22", - "resolved": "https://registry.npmjs.org/oclif/-/oclif-4.14.22.tgz", - "integrity": "sha512-6kcjM6MowDIozatGRiN7COMYrTzDVeyNDa1cUO8I1HgmWoQ5eoC8bq1cicLpWZawcyfJwzGi0oz67i1W05W/Og==", "dev": true, + "license": "MIT", "dependencies": { "@aws-sdk/client-cloudfront": "^3.624.0", "@aws-sdk/client-s3": "^3.633.0", @@ -10501,9 +10011,8 @@ }, "node_modules/oclif/node_modules/@oclif/core": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.0.18.tgz", - "integrity": "sha512-3EP4zJ+1ndc92UxdNmGX4HhFK5Xh94fWvUeOW1Tu/Ed+/jAljIsbmZyjVhDoE0vV5cftT+3QaVB/LFxaXxty/w==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.3.2", @@ -10529,9 +10038,8 @@ }, "node_modules/oclif/node_modules/lilconfig": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" }, @@ -10541,17 +10049,15 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -10564,17 +10070,15 @@ }, "node_modules/onetime/node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -10589,24 +10093,21 @@ }, "node_modules/optionator/node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/p-cancelable": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" } }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -10619,9 +10120,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -10634,17 +10134,15 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/param-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -10652,9 +10150,8 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -10664,9 +10161,8 @@ }, "node_modules/parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, + "license": "MIT", "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -10677,8 +10173,7 @@ }, "node_modules/pascal-case": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -10686,8 +10181,7 @@ }, "node_modules/password-prompt": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz", - "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==", + "license": "0BSD", "dependencies": { "ansi-escapes": "^4.3.2", "cross-spawn": "^7.0.3" @@ -10695,9 +10189,8 @@ }, "node_modules/path-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", "dev": true, + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -10705,69 +10198,60 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-to-regexp": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pathval": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/picocolors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -10777,9 +10261,8 @@ }, "node_modules/pidtree": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, + "license": "MIT", "bin": { "pidtree": "bin/pidtree.js" }, @@ -10789,8 +10272,7 @@ }, "node_modules/pkg-up": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", "dependencies": { "find-up": "^3.0.0" }, @@ -10800,8 +10282,7 @@ }, "node_modules/pkg-up/node_modules/find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", "dependencies": { "locate-path": "^3.0.0" }, @@ -10811,8 +10292,7 @@ }, "node_modules/pkg-up/node_modules/locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -10823,8 +10303,7 @@ }, "node_modules/pkg-up/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -10837,8 +10316,7 @@ }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", "dependencies": { "p-limit": "^2.0.0" }, @@ -10848,8 +10326,7 @@ }, "node_modules/pkg-up/node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", "engines": { "node": ">=4" } @@ -10859,32 +10336,30 @@ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/possible-typed-array-names": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -10897,16 +10372,14 @@ }, "node_modules/proc-log": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -10917,22 +10390,16 @@ }, "node_modules/punycode": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + "license": "MIT" }, "node_modules/querystring": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "engines": { "node": ">=0.4.x" } }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -10946,13 +10413,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-lru": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -10964,22 +10431,21 @@ "version": "7.5.0", "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz", "integrity": "sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/read-pkg": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -10992,9 +10458,8 @@ }, "node_modules/read-pkg-up": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -11009,9 +10474,8 @@ }, "node_modules/read-pkg-up/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -11022,9 +10486,8 @@ }, "node_modules/read-pkg-up/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -11034,9 +10497,8 @@ }, "node_modules/read-pkg-up/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -11049,9 +10511,8 @@ }, "node_modules/read-pkg-up/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -11061,24 +10522,21 @@ }, "node_modules/read-pkg-up/node_modules/type-fest": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -11088,9 +10546,8 @@ }, "node_modules/read-pkg/node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -11106,27 +10563,24 @@ }, "node_modules/read-pkg/node_modules/semver": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -11136,8 +10590,6 @@ }, "node_modules/rechoir": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "dependencies": { "resolve": "^1.1.6" @@ -11148,8 +10600,7 @@ }, "node_modules/redeyed": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", + "license": "MIT", "dependencies": { "esprima": "~4.0.0" } @@ -11159,15 +10610,15 @@ "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", "dev": true, + "license": "MIT", "bin": { "regexp-tree": "bin/regexp-tree" } }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", @@ -11186,6 +10637,7 @@ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -11198,6 +10650,7 @@ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "jsesc": "~0.5.0" }, @@ -11216,25 +10669,22 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve": { "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -11249,33 +10699,29 @@ }, "node_modules/resolve-alpn": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/responselike": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, + "license": "MIT", "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -11288,9 +10734,8 @@ }, "node_modules/restore-cursor": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -11304,17 +10749,15 @@ }, "node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -11322,16 +10765,13 @@ }, "node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -11344,9 +10784,8 @@ }, "node_modules/rimraf/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11354,10 +10793,8 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11375,9 +10812,8 @@ }, "node_modules/rimraf/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11387,8 +10823,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -11403,15 +10837,15 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/safe-array-concat": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -11427,14 +10861,11 @@ }, "node_modules/safe-array-concat/node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -11449,13 +10880,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -11470,13 +10901,11 @@ }, "node_modules/sax": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" + "license": "ISC" }, "node_modules/semver": { "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -11486,9 +10915,8 @@ }, "node_modules/sentence-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -11497,17 +10925,15 @@ }, "node_modules/serialize-javascript": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -11522,9 +10948,8 @@ }, "node_modules/set-function-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -11537,8 +10962,7 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -11548,17 +10972,15 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shelljs": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -11573,9 +10995,8 @@ }, "node_modules/shelljs/node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11583,10 +11004,8 @@ }, "node_modules/shelljs/node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11604,9 +11023,8 @@ }, "node_modules/shelljs/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11616,9 +11034,8 @@ }, "node_modules/shx": { "version": "0.3.4", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", - "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.3", "shelljs": "^0.8.5" @@ -11632,9 +11049,8 @@ }, "node_modules/side-channel": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -11650,28 +11066,24 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/simple-swizzle": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.3.1" } }, "node_modules/simple-swizzle/node_modules/is-arrayish": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + "license": "MIT" }, "node_modules/sinon": { "version": "18.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.0.tgz", - "integrity": "sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1", "@sinonjs/fake-timers": "^11.2.2", @@ -11687,9 +11099,8 @@ }, "node_modules/sinon/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11699,21 +11110,18 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/slice-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -11728,9 +11136,8 @@ }, "node_modules/snake-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "dev": true, + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -11738,15 +11145,13 @@ }, "node_modules/sort-object-keys": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", - "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sort-package-json": { "version": "2.10.1", - "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-2.10.1.tgz", - "integrity": "sha512-d76wfhgUuGypKqY72Unm5LFnMpACbdxXsLPcL27pOsSrmVqH3PztFp1uq+Z22suk15h7vXmTesuh2aEjdCqb5w==", "dev": true, + "license": "MIT", "dependencies": { "detect-indent": "^7.0.1", "detect-newline": "^4.0.0", @@ -11763,9 +11168,8 @@ }, "node_modules/sort-package-json/node_modules/globby": { "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, + "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", @@ -11782,9 +11186,8 @@ }, "node_modules/sort-package-json/node_modules/slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -11794,16 +11197,14 @@ }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -11811,9 +11212,8 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -11821,15 +11221,13 @@ }, "node_modules/spdx-exceptions": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -11837,28 +11235,24 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "license": "BSD-3-Clause" }, "node_modules/string-argv": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.19" } }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -11870,9 +11264,8 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11888,9 +11281,8 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11902,9 +11294,8 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -11919,8 +11310,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11930,18 +11320,16 @@ }, "node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -11954,6 +11342,7 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, + "license": "MIT", "dependencies": { "min-indent": "^1.0.0" }, @@ -11963,9 +11352,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -11975,14 +11363,12 @@ }, "node_modules/strnum": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11995,8 +11381,7 @@ }, "node_modules/supports-hyperlinks": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -12007,8 +11392,7 @@ }, "node_modules/supports-hyperlinks/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12018,9 +11402,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -12030,8 +11413,7 @@ }, "node_modules/table": { "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -12045,25 +11427,22 @@ }, "node_modules/tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/temp-dir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "license": "MIT", "engines": { "node": ">=14.16" } }, "node_modules/tempy": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", - "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", + "license": "MIT", "dependencies": { "is-stream": "^3.0.0", "temp-dir": "^3.0.0", @@ -12079,8 +11458,7 @@ }, "node_modules/tempy/node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -12090,20 +11468,16 @@ }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tiny-jsonc": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tiny-jsonc/-/tiny-jsonc-1.0.1.tgz", - "integrity": "sha512-ik6BCxzva9DoiEfDX/li0L2cWKPPENYvixUprFdl3YPi4bZZUhDnNI9YUkacrv+uIG90dnxR5mNqaoD6UhD6Bw==", "dev": true }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -12113,14 +11487,14 @@ }, "node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "license": "MIT" }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" }, @@ -12130,9 +11504,8 @@ }, "node_modules/ts-node": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -12173,27 +11546,24 @@ }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/ts-node/node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tsconfig-paths": { "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -12203,14 +11573,12 @@ }, "node_modules/tslib": { "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -12223,15 +11591,13 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -12241,9 +11607,8 @@ }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -12253,17 +11618,15 @@ }, "node_modules/type-detect": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -12273,9 +11636,8 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -12287,9 +11649,8 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -12306,9 +11667,8 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -12326,9 +11686,8 @@ }, "node_modules/typed-array-length": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -12346,8 +11705,6 @@ }, "node_modules/typescript": { "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -12360,9 +11717,8 @@ }, "node_modules/unbox-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -12375,13 +11731,11 @@ }, "node_modules/undici-types": { "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "license": "MIT" }, "node_modules/unique-string": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", "dependencies": { "crypto-random-string": "^4.0.0" }, @@ -12394,61 +11748,54 @@ }, "node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/untildify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/upper-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/upper-case-first": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/uri-js/node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/url": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "license": "MIT", "dependencies": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -12456,8 +11803,7 @@ }, "node_modules/util": { "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -12468,23 +11814,20 @@ }, "node_modules/uuid": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -12492,21 +11835,18 @@ }, "node_modules/validate-npm-package-name": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -12514,8 +11854,7 @@ }, "node_modules/which": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -12528,9 +11867,8 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -12544,8 +11882,7 @@ }, "node_modules/which-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -12562,8 +11899,7 @@ }, "node_modules/widest-line": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "license": "MIT", "dependencies": { "string-width": "^4.0.0" }, @@ -12573,28 +11909,24 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + "license": "MIT" }, "node_modules/workerpool": { "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -12609,14 +11941,12 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/xml2js": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -12627,33 +11957,29 @@ }, "node_modules/xmlbuilder": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", "engines": { "node": ">=4.0" } }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yaml": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true, + "license": "ISC", "engines": { "node": ">= 14" } }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -12669,18 +11995,16 @@ }, "node_modules/yargs-parser": { "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yargs-unparser": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -12693,26 +12017,23 @@ }, "node_modules/yargs-unparser/node_modules/is-plain-obj": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yarn": { "version": "1.22.22", - "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.22.tgz", - "integrity": "sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==", "hasInstallScript": true, + "license": "BSD-2-Clause", "bin": { "yarn": "bin/yarn.js", "yarnpkg": "bin/yarn.js" @@ -12723,17 +12044,15 @@ }, "node_modules/yn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-4.0.0.tgz", - "integrity": "sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -12743,9 +12062,8 @@ }, "node_modules/yoctocolors-cjs": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -12755,8 +12073,7 @@ }, "node_modules/zod": { "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 1b5e624..705d790 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ "chai": "^4", "eslint": "^8", "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-oclif": "^5", - "eslint-config-oclif-typescript": "^3", + "eslint-config-oclif": "^5.2.1", + "eslint-config-oclif-typescript": "^3.1.11", "eslint-config-prettier": "^9", "eslint-formatter-table": "^7.32.1", "eslint-import-resolver-typescript": "^3.5.1", @@ -82,7 +82,8 @@ "src/cdk", "src/cdk/lib", "src/cdk/assets", - "src/cdk/*.ts" + "src/cdk/*.ts", + "src" ], "homepage": "https://github.com/harvard-edtech/caccl-deploy", "keywords": [ @@ -105,8 +106,8 @@ }, "lint-staged": { "**/*.{ts,js}": [ - "npx prettier --write --ignore-path .gitignore", - "npx eslint --fix" + "prettier --config .prettierrc.json --write --ignore-path .gitignore", + "eslint -c .eslintrc.json --fix" ] }, "repository": "harvard-edtech/caccl-deploy", @@ -114,7 +115,10 @@ "build": "shx rm -rf dist && tsc -b", "dev": "shx rm -rf dist && tsc -b --watch", "cli": "./bin/run.js", - "lint": "eslint . --ext .ts", + "lint": "eslint -c .eslintrc.json .", + "lint-fix": "eslint -c .eslintrc.json . --fix", + "format": "prettier --config .prettierrc.json --write --ignore-path .gitignore .", + "prepare": "husky install || true", "postpack": "shx rm -f oclif.manifest.json", "prepack": "oclif manifest && oclif readme", "test": "TS_NODE_TRANSPILE_ONLY=true TS_NODE_FILES=true mocha --require test/hooks.ts \"test/**/*.test.ts\"", diff --git a/src/aws/classes/AssumedRole.ts b/src/aws/classes/AssumedRole.ts index b5ce31b..712fc31 100644 --- a/src/aws/classes/AssumedRole.ts +++ b/src/aws/classes/AssumedRole.ts @@ -1,5 +1,5 @@ // Import aws-sdk -import AWS, { Service, STS } from 'aws-sdk'; +import AWS, { STS, Service } from 'aws-sdk'; // Import helpers import getAccountId from '../helpers/getAccountId.js'; @@ -17,14 +17,6 @@ class AssumedRole { this.assumedRoleArn = undefined; } - /** - * Set an IAM role for AWS clients to assume - * @param {string} roleArn - */ - public setAssumedRoleArn(roleArn: string) { - this.assumedRoleArn = roleArn; - } - /** * Returns an AWS service client that has been reconfigured with * temporary credentials from assuming an IAM role @@ -41,6 +33,7 @@ class AssumedRole { ) { return client; } + if (this.assumedRoleCredentials === undefined) { const sts = new AWS.STS(); const resp = await sts @@ -55,8 +48,10 @@ class AssumedRole { `Could not retrieve credentials for assumed role: ${this.assumedRoleArn}`, ); } + this.assumedRoleCredentials = credentials; } + client.config.update({ accessKeyId: this.assumedRoleCredentials.AccessKeyId, secretAccessKey: this.assumedRoleCredentials.SecretAccessKey, @@ -64,6 +59,14 @@ class AssumedRole { }); return client; } + + /** + * Set an IAM role for AWS clients to assume + * @param {string} roleArn + */ + public setAssumedRoleArn(roleArn: string) { + this.assumedRoleArn = roleArn; + } } export default AssumedRole; diff --git a/src/aws/helpers/cfnStackExists.ts b/src/aws/helpers/cfnStackExists.ts index 4419e5b..a92fe16 100644 --- a/src/aws/helpers/cfnStackExists.ts +++ b/src/aws/helpers/cfnStackExists.ts @@ -1,6 +1,6 @@ // Import shared errors -import getCfnStackExports from './getCfnStackExports.js'; import CfnStackNotFound from '../../shared/errors/CfnStackNotFound.js'; +import getCfnStackExports from './getCfnStackExports.js'; // Import helpers @@ -13,11 +13,12 @@ const cfnStackExists = async (stackName: string): Promise => { try { await getCfnStackExports(stackName); return true; - } catch (err) { - if (!(err instanceof CfnStackNotFound)) { - throw err; + } catch (error) { + if (!(error instanceof CfnStackNotFound)) { + throw error; } } + return false; }; diff --git a/src/aws/helpers/deleteSecrets.ts b/src/aws/helpers/deleteSecrets.ts index 0e6c43a..5cfec7d 100644 --- a/src/aws/helpers/deleteSecrets.ts +++ b/src/aws/helpers/deleteSecrets.ts @@ -10,14 +10,14 @@ import logger from '../../logger.js'; */ const deleteSecrets = async (secretArns: string[]): Promise => { const sm = new AWS.SecretsManager(); - for (let i = 0; i < secretArns.length; i += 1) { + for (const secretArn of secretArns) { await sm .deleteSecret({ - SecretId: secretArns[i], ForceDeleteWithoutRecovery: true, + SecretId: secretArn, }) .promise(); - logger.log(`secret ${secretArns[i]} deleted`); + logger.log(`secret ${secretArn} deleted`); } }; diff --git a/src/aws/helpers/deleteSsmParameters.ts b/src/aws/helpers/deleteSsmParameters.ts index 569af30..1cac0e4 100644 --- a/src/aws/helpers/deleteSsmParameters.ts +++ b/src/aws/helpers/deleteSsmParameters.ts @@ -20,9 +20,9 @@ const deleteSsmParameters = async (paramNames: string[]) => { Names: paramNamesSlice, }) .promise(); - paramNamesSlice.forEach((name) => { + for (const name of paramNamesSlice) { Logger.log(`ssm parameter ${name} deleted`); - }); + } } }; diff --git a/src/aws/helpers/execTask.ts b/src/aws/helpers/execTask.ts index ea318d2..63f0b8d 100644 --- a/src/aws/helpers/execTask.ts +++ b/src/aws/helpers/execTask.ts @@ -12,10 +12,10 @@ export type EnvVariable = { export type ExecOptions = { clusterName: string; - serviceName: string; - taskDefName: string; command: string; environment: EnvVariable[]; + serviceName: string; + taskDefName: string; }; /** @@ -38,10 +38,10 @@ const execTask = async ( const { clusterName, - serviceName, - taskDefName, command, environment = [], + serviceName, + taskDefName, } = execOptions; const service = await getService(clusterName, serviceName); @@ -52,19 +52,19 @@ const execTask = async ( const execResp = await ecs .runTask({ cluster: clusterName, - taskDefinition: taskDefName, - networkConfiguration, launchType: 'FARGATE', - platformVersion: '1.3.0', + networkConfiguration, overrides: { containerOverrides: [ { - name: 'AppOnlyContainer', command: ['/bin/sh', '-c', command], environment, + name: 'AppOnlyContainer', }, ], }, + platformVersion: '1.3.0', + taskDefinition: taskDefName, }) .promise(); diff --git a/src/aws/helpers/getAccountId.ts b/src/aws/helpers/getAccountId.ts index 338b19d..c775098 100644 --- a/src/aws/helpers/getAccountId.ts +++ b/src/aws/helpers/getAccountId.ts @@ -16,6 +16,7 @@ const getAccountId = async (): Promise => { if (!accountId) { throw new AwsAccountNotFound('Could not retrieve users account ID.'); } + return accountId; }; diff --git a/src/aws/helpers/getCfnStackExports.ts b/src/aws/helpers/getCfnStackExports.ts index 6546826..cede1f7 100644 --- a/src/aws/helpers/getCfnStackExports.ts +++ b/src/aws/helpers/getCfnStackExports.ts @@ -1,6 +1,5 @@ // Import aws-sdk import AWS, { CloudFormation } from 'aws-sdk'; - // Import camel-case import { camelCase } from 'camel-case'; @@ -26,16 +25,18 @@ const getCfnStackExports = async ( .promise(); if ( resp.Stacks === undefined || - !resp.Stacks.length || + resp.Stacks.length === 0 || !resp.Stacks[0].Outputs ) { throw new CfnStackNotFound(`Unable to find stack ${stackName}`); } + exports = resp.Stacks[0].Outputs.reduce( (obj: Record, output: CloudFormation.Output) => { if (!output.ExportName || !output.OutputValue) { return { ...obj }; } + const outputKey = camelCase( output.ExportName.replace(`${stackName}-`, ''), ); @@ -46,14 +47,16 @@ const getCfnStackExports = async ( }, {}, ); - } catch (err) { - if (err instanceof Error && err.message.includes('does not exist')) { + } catch (error) { + if (error instanceof Error && error.message.includes('does not exist')) { throw new CfnStackNotFound( `Cloudformation stack ${stackName} does not exist`, ); } - throw err; + + throw error; } + return exports; }; diff --git a/src/aws/helpers/getCurrentRegion.ts b/src/aws/helpers/getCurrentRegion.ts index 552eada..b38ec11 100644 --- a/src/aws/helpers/getCurrentRegion.ts +++ b/src/aws/helpers/getCurrentRegion.ts @@ -1,8 +1,7 @@ // Import NodeJS libraries +import AWS from 'aws-sdk'; import process from 'node:process'; - // Import aws-sdk -import AWS from 'aws-sdk'; /** * Returns the configured region. @@ -18,9 +17,11 @@ const getCurrentRegion = (): string => { if (process.env.NODE_ENV === 'test') { return 'us-east-1'; } + // TODO: fix this error - throw new Error('Please configure you\'re AWS region.'); + throw new Error("Please configure you're AWS region."); } + return region; }; diff --git a/src/aws/helpers/getInfraStackList.ts b/src/aws/helpers/getInfraStackList.ts index 3af824a..64248ac 100644 --- a/src/aws/helpers/getInfraStackList.ts +++ b/src/aws/helpers/getInfraStackList.ts @@ -23,10 +23,11 @@ const getInfraStackList = async (): Promise => { const outputKeys = stack.Outputs.map((output) => { return output.OutputKey; }); - if (outputKeys.indexOf('InfraStackName') >= 0) { + if (outputKeys.includes('InfraStackName')) { return stack.StackName; } } + // Flat map 'filters' this out return []; }); diff --git a/src/aws/helpers/getPaginatedResponse.ts b/src/aws/helpers/getPaginatedResponse.ts index 54b10c7..307e5d7 100644 --- a/src/aws/helpers/getPaginatedResponse.ts +++ b/src/aws/helpers/getPaginatedResponse.ts @@ -3,7 +3,7 @@ // import { Paginator } from '@aws-sdk/types'; import { AWSError, Request } from 'aws-sdk'; -type NextTokenKey = { NextToken?: string } & { [k: string]: any }; +type NextTokenKey = { [k: string]: any } & { NextToken?: string }; /** * Convenience function for fetching larger responses that might @@ -30,16 +30,19 @@ const getPaginatedResponse = async < if (nextTokenArg !== undefined) { paramsCopy.NextToken = nextTokenArg; } + const resp = await func(paramsCopy).promise(); if (itemKey in resp) { // FIXME: need method of asserting that TRes[TKey] will be an array here // @ts-ignore items.push(...resp[itemKey]); } + if (resp.NextToken !== undefined) { await getItems(resp.NextToken); } } + await getItems(); return items; }; diff --git a/src/aws/helpers/getRepoImageList.ts b/src/aws/helpers/getRepoImageList.ts index 863200c..4a8a61a 100644 --- a/src/aws/helpers/getRepoImageList.ts +++ b/src/aws/helpers/getRepoImageList.ts @@ -1,12 +1,11 @@ // Import aws-sdk import AWS from 'aws-sdk'; -// Import shared helpers -import getPaginatedResponse from './getPaginatedResponse.js'; import looksLikeSemver from '../../shared/helpers/looksLikeSemver.js'; - // Import classes import AssumedRole from '../classes/AssumedRole.js'; +import getPaginatedResponse from './getPaginatedResponse.js'; +// Import shared helpers /** * @author Jay Luker @@ -24,11 +23,11 @@ const getRepoImageList = async ( const images = await getPaginatedResponse( ecr.describeImages.bind(ecr), { - repositoryName: repo, - maxResults: 1000, filter: { tagStatus: 'TAGGED', }, + maxResults: 1000, + repositoryName: repo, }, 'imageDetails', ); @@ -40,9 +39,11 @@ const getRepoImageList = async ( if (a.imagePushedAt < b.imagePushedAt) { return 1; } + if (a.imagePushedAt > b.imagePushedAt) { return -1; } + return 0; }); @@ -55,6 +56,7 @@ const getRepoImageList = async ( }); }); } + return images; }; diff --git a/src/aws/helpers/getRepoList.ts b/src/aws/helpers/getRepoList.ts index 5fe782f..ce7672c 100644 --- a/src/aws/helpers/getRepoList.ts +++ b/src/aws/helpers/getRepoList.ts @@ -1,9 +1,9 @@ // Import aws-sdk import AWS from 'aws-sdk'; -// Import class -import getPaginatedResponse from './getPaginatedResponse.js'; import AssumedRole from '../classes/AssumedRole.js'; +import getPaginatedResponse from './getPaginatedResponse.js'; +// Import class /** * @author Jay Luker @@ -36,6 +36,7 @@ const getRepoList = async (assumedRole: AssumedRole): Promise => { if (isAnEdtechAppRepo && repo.repositoryName) { return [repo.repositoryName]; } + return emptyArr; }), ); diff --git a/src/aws/helpers/imageTagExists.ts b/src/aws/helpers/imageTagExists.ts index 0ef408f..aa5fb15 100644 --- a/src/aws/helpers/imageTagExists.ts +++ b/src/aws/helpers/imageTagExists.ts @@ -1,8 +1,7 @@ // Import helpers +import AssumedRole from '../classes/AssumedRole.js'; import getRepoImageList from './getRepoImageList.js'; - // Import classes -import AssumedRole from '../classes/AssumedRole.js'; /** * Confirms that a repo/tag combo exists diff --git a/src/aws/helpers/initProfile.ts b/src/aws/helpers/initProfile.ts index 30d3b12..b6a7745 100644 --- a/src/aws/helpers/initProfile.ts +++ b/src/aws/helpers/initProfile.ts @@ -19,6 +19,7 @@ const initProfile = (profileName: string) => { `Tried to init a non-existent profile: '${profileName}'`, ); } + const profileCreds = awsCredentials[profileName]; AWS.config.update({ diff --git a/src/aws/helpers/isConfigured.ts b/src/aws/helpers/isConfigured.ts index 135fcc0..92b4e1e 100644 --- a/src/aws/helpers/isConfigured.ts +++ b/src/aws/helpers/isConfigured.ts @@ -11,7 +11,7 @@ const isConfigured = (): boolean => { return [AWS, AWS.config.credentials, AWS.config.region].every((thing) => { return thing !== undefined && thing !== null; }); - } catch (err) { + } catch { return false; } }; diff --git a/src/aws/helpers/isLatestTag.ts b/src/aws/helpers/isLatestTag.ts index be1f968..d93268b 100644 --- a/src/aws/helpers/isLatestTag.ts +++ b/src/aws/helpers/isLatestTag.ts @@ -1,8 +1,7 @@ // Import helpers +import AssumedRole from '../classes/AssumedRole.js'; import getRepoImageList from './getRepoImageList.js'; - // Import classes -import AssumedRole from '../classes/AssumedRole.js'; /** * Confirms that a tag is the latest for a repo @@ -18,7 +17,7 @@ const isLatestTag = async ( ): Promise => { const imageList = await getRepoImageList(assumedRole, repoName); return ( - !!imageList.length && + imageList.length > 0 && !!imageList[0].imageTags && imageList[0].imageTags.includes(tag) ); diff --git a/src/aws/helpers/parseEcrArn.ts b/src/aws/helpers/parseEcrArn.ts index 17971a9..8cd938e 100644 --- a/src/aws/helpers/parseEcrArn.ts +++ b/src/aws/helpers/parseEcrArn.ts @@ -21,11 +21,11 @@ const parseEcrArn = (arn: string): EcrImage => { const [relativeId, imageTag] = parts.slice(-2); const repoName = relativeId.replace('repository/', ''); return { - service: parts[2], - region: parts[3], account: parts[4], - repoName, imageTag, + region: parts[3], + repoName, + service: parts[2], }; }; diff --git a/src/aws/helpers/putSecret.ts b/src/aws/helpers/putSecret.ts index d3cf716..8bde6a0 100644 --- a/src/aws/helpers/putSecret.ts +++ b/src/aws/helpers/putSecret.ts @@ -1,22 +1,18 @@ // Import aws-sdk import AWS from 'aws-sdk'; -// Import shared errors -import secretExists from './secretExists.js'; +import logger from '../../logger.js'; import ExistingSecretWontDelete from '../../shared/errors/ExistingSecretWontDelete.js'; - // Import shared errors import SecretNotCreated from '../../shared/errors/SecretNotCreated.js'; - // Import shared helpers import sleep from '../../shared/helpers/sleep.js'; - // Import shared types import AwsTag from '../../shared/types/AwsTag.js'; import SecretOpts from '../../shared/types/SecretOpts.js'; - +import secretExists from './secretExists.js'; // Import logger -import logger from '../../logger.js'; +// Import shared errors /** * creates or updates a secrets manager entry @@ -37,7 +33,7 @@ const putSecret = async ( ): Promise => { const sm = new AWS.SecretsManager(); - const { Name: SecretId, Description, SecretString } = secretOpts; + const { Description, Name: SecretId, SecretString } = secretOpts; let secretResp; try { @@ -45,15 +41,15 @@ const putSecret = async ( if (exists) { secretResp = await sm .updateSecret({ - SecretId, Description, + SecretId, SecretString, }) .promise(); logger.log(`secretsmanager entry ${SecretId} updated`); - if (tags.length) { + if (tags.length > 0) { await sm .tagResource({ SecretId, @@ -65,30 +61,33 @@ const putSecret = async ( } else { secretResp = await sm .createSecret({ - Name: SecretId, Description, + Name: SecretId, SecretString, Tags: tags, }) .promise(); logger.log(`secretsmanager entry ${SecretId} created`); } - } catch (err: unknown) { - if (!(err instanceof Error)) throw err; - if (err.message.includes('already scheduled for deletion')) { + } catch (error: unknown) { + if (!(error instanceof Error)) throw error; + if (error.message.includes('already scheduled for deletion')) { if (retries < 5) { // eslint-disable-next-line no-param-reassign retries += 1; await sleep(2 ** retries * 1000); return putSecret(secretOpts, tags, retries); } + console.error('putSecret failed after 5 retries'); throw new ExistingSecretWontDelete( `Failed to overwrite existing secret ${SecretId}`, ); } - throw err; + + throw error; } + if (!secretResp.ARN) throw new SecretNotCreated(`Could not create secret ${SecretId}`); return secretResp.ARN; diff --git a/src/aws/helpers/putSsmParameter.ts b/src/aws/helpers/putSsmParameter.ts index aaea8be..14175a3 100644 --- a/src/aws/helpers/putSsmParameter.ts +++ b/src/aws/helpers/putSsmParameter.ts @@ -17,7 +17,7 @@ const putSsmParameter = async ( const paramOptions = { ...opts }; const paramResp = await ssm.putParameter(paramOptions).promise(); - if (tags.length) { + if (tags.length > 0) { await ssm .addTagsToResource({ ResourceId: paramOptions.Name, @@ -26,6 +26,7 @@ const putSsmParameter = async ( }) .promise(); } + return paramResp; }; diff --git a/src/aws/helpers/restartEcsService.ts b/src/aws/helpers/restartEcsService.ts index ee6c769..22481cc 100644 --- a/src/aws/helpers/restartEcsService.ts +++ b/src/aws/helpers/restartEcsService.ts @@ -1,18 +1,15 @@ // Import aws-sdk import AWS, { ECS } from 'aws-sdk'; -import getCurrentRegion from './getCurrentRegion.js'; - +import logger from '../../logger.js'; // Import shared helpers -import sleep from '../../shared/helpers/sleep.js'; - +import getCurrentRegion from './getCurrentRegion.js'; // Import logger -import logger from '../../logger.js'; export type RestartOpts = { cluster: string; - service: string; newTaskDefArn?: string; + service: string; wait: boolean; }; @@ -24,7 +21,7 @@ export type RestartOpts = { * @param {boolean} wait */ const restartEcsService = async (restartOpts: RestartOpts) => { - const { cluster, service, newTaskDefArn, wait } = restartOpts; + const { cluster, newTaskDefArn, service, wait } = restartOpts; const ecs = new AWS.ECS(); logger.log( [ @@ -37,8 +34,8 @@ const restartEcsService = async (restartOpts: RestartOpts) => { const updateServiceParams: ECS.UpdateServiceRequest = { cluster, - service, forceNewDeployment: true, + service, }; if (newTaskDefArn) { @@ -52,23 +49,15 @@ const restartEcsService = async (restartOpts: RestartOpts) => { if (!wait) { return; } - let allDone = false; + + logger.log('Waiting for deployment to stabilize...'); await ecs .waitFor('servicesStable', { cluster, services: [service], }) - .promise() - .then(() => { - allDone = true; - }); + .promise(); - let counter = 0; - while (!allDone) { - logger.log('Waiting for deployment to stablize...'); - counter += 1; - await sleep(2 ** counter * 1000); - } logger.log('all done!'); }; diff --git a/src/aws/helpers/sendSSHPublicKey.ts b/src/aws/helpers/sendSSHPublicKey.ts index 969167f..ee73b96 100644 --- a/src/aws/helpers/sendSSHPublicKey.ts +++ b/src/aws/helpers/sendSSHPublicKey.ts @@ -3,7 +3,6 @@ import AWS from 'aws-sdk'; // Import shared helpers import readFile from '../../shared/helpers/readFile.js'; - // Import constants import EC2_INSTANCE_CONNECT_USER from '../constants/EC2_INSTANCE_CONNECT_USER.js'; diff --git a/src/aws/helpers/updateTaskDefAppImage.ts b/src/aws/helpers/updateTaskDefAppImage.ts index e701327..97f0c2e 100644 --- a/src/aws/helpers/updateTaskDefAppImage.ts +++ b/src/aws/helpers/updateTaskDefAppImage.ts @@ -1,13 +1,12 @@ // Import aws-sdk import AWS from 'aws-sdk'; +// Import logger +import logger from '../../logger.js'; // Import helpers import ecrArnToImageId from './ecrArnToImageId.js'; import getTaskDefinition from './getTaskDefinition.js'; -// Import logger -import logger from '../../logger.js'; - /** * Updates a Fargate task definition, replacing the app container's * ECR image URI value @@ -58,7 +57,7 @@ const updateTaskDefAppImage = async ( * delete invalid params that are returned by `returnTaskDefinition` but * not allowed by `registerTaskDefinition` */ - const registerTaskDefinitionParams = [ + const registerTaskDefinitionParams = new Set([ 'containerDefinitions', 'cpu', 'executionRoleArn', @@ -69,12 +68,12 @@ const updateTaskDefAppImage = async ( 'requiresCompatibilities', 'taskRoleArn', 'volumes', - ]; - Object.keys(newTaskDef).forEach((k) => { - if (!registerTaskDefinitionParams.includes(k)) { + ]); + for (const k of Object.keys(newTaskDef)) { + if (!registerTaskDefinitionParams.has(k)) { delete newTaskDef[k]; } - }); + } const registerResp = await ecs.registerTaskDefinition(newTaskDef).promise(); logger.log('done'); diff --git a/src/aws/index.ts b/src/aws/index.ts index ccad4d9..9e670ab 100644 --- a/src/aws/index.ts +++ b/src/aws/index.ts @@ -1,77 +1,42 @@ // Import classes -import AssumedRole from './classes/AssumedRole.js'; // Import constants -import EC2_INSTANCE_CONNECT_USER from './constants/EC2_INSTANCE_CONNECT_USER.js'; // Import helpers -import cfnStackExists from './helpers/cfnStackExists.js'; -import createEcrArn from './helpers/createEcrArn.js'; -import deleteSecrets from './helpers/deleteSecrets.js'; -import deleteSsmParameters from './helpers/deleteSsmParameters.js'; -import ecrArnToImageId from './helpers/ecrArnToImageId.js'; -import execTask from './helpers/execTask.js'; -import getAccountId from './helpers/getAccountId.js'; -import getAcmCertList from './helpers/getAcmCertList.js'; -import getAppList from './helpers/getAppList.js'; -import getCfnStackExports from './helpers/getCfnStackExports.js'; -import getCfnStacks from './helpers/getCfnStacks.js'; -import getCurrentRegion from './helpers/getCurrentRegion.js'; -import getInfraStackList from './helpers/getInfraStackList.js'; -import getRepoImageList from './helpers/getRepoImageList.js'; -import getRepoList from './helpers/getRepoList.js'; -import getService from './helpers/getService.js'; -import getSsmParametersByPrefix from './helpers/getSsmParametersByPrefix.js'; -import getTaskDefinition from './helpers/getTaskDefinition.js'; -import imageTagExists from './helpers/imageTagExists.js'; -import initProfile from './helpers/initProfile.js'; -import isConfigured from './helpers/isConfigured.js'; -import isLatestTag from './helpers/isLatestTag.js'; -import parseEcrArn from './helpers/parseEcrArn.js'; -import putSecret from './helpers/putSecret.js'; -import putSsmParameter from './helpers/putSsmParameter.js'; -import resolveSecret from './helpers/resolveSecret.js'; -import restartEcsService from './helpers/restartEcsService.js'; -import secretExists from './helpers/secretExists.js'; -import sendSSHPublicKey from './helpers/sendSSHPublicKey.js'; -import updateTaskDefAppImage from './helpers/updateTaskDefAppImage.js'; // Set environment variables process.env.AWS_SDK_LOAD_CONFIG = '1'; -export { - // Classes - AssumedRole, - // Constants - EC2_INSTANCE_CONNECT_USER, - // Helpers - cfnStackExists, // CloudFormation - createEcrArn, // ECR - deleteSecrets, // SecretsManager - deleteSsmParameters, // SSM - ecrArnToImageId, // ECR - execTask, // ECS - getAccountId, // General - getAcmCertList, // ACM - getAppList, // SSM - getCfnStackExports, // CloudFormation - getCfnStacks, // CloudFormation - getCurrentRegion, // General - getInfraStackList, // CloudFormation - getRepoImageList, // ECR - getRepoList, // ECR - getService, // ECS - getSsmParametersByPrefix, // SSM - getTaskDefinition, // ECS - imageTagExists, // ECR - initProfile, // General - isConfigured, // General - isLatestTag, // ECR - parseEcrArn, // ECR - putSecret, // SecretsManager - putSsmParameter, // SSM - resolveSecret, // SecretsManager - secretExists, // SecretsManager - restartEcsService, // ECS - sendSSHPublicKey, // EC2 - updateTaskDefAppImage, // ECS -}; + +export { default as AssumedRole } from './classes/AssumedRole.js'; +export { default as EC2_INSTANCE_CONNECT_USER } from './constants/EC2_INSTANCE_CONNECT_USER.js'; +export { default as cfnStackExists } from './helpers/cfnStackExists.js'; +export { default as createEcrArn } from './helpers/createEcrArn.js'; +export { default as deleteSecrets } from './helpers/deleteSecrets.js'; +export { default as deleteSsmParameters } from './helpers/deleteSsmParameters.js'; +export { default as ecrArnToImageId } from './helpers/ecrArnToImageId.js'; +export { default as execTask } from './helpers/execTask.js'; +export { default as getAccountId } from './helpers/getAccountId.js'; +export { default as getAcmCertList } from './helpers/getAcmCertList.js'; +export { default as getAppList } from './helpers/getAppList.js'; +export { default as getCfnStackExports } from './helpers/getCfnStackExports.js'; +export { default as getCfnStacks } from './helpers/getCfnStacks.js'; +export { default as getCurrentRegion } from './helpers/getCurrentRegion.js'; +export { default as getInfraStackList } from './helpers/getInfraStackList.js'; +export { default as getRepoImageList } from './helpers/getRepoImageList.js'; +export { default as getRepoList } from './helpers/getRepoList.js'; +export { default as getService } from './helpers/getService.js'; +export { default as getSsmParametersByPrefix } from './helpers/getSsmParametersByPrefix.js'; +export { default as getTaskDefinition } from './helpers/getTaskDefinition.js'; +export { default as imageTagExists } from './helpers/imageTagExists.js'; +export { default as initProfile } from './helpers/initProfile.js'; +export { default as isConfigured } from './helpers/isConfigured.js'; +export { default as isLatestTag } from './helpers/isLatestTag.js'; +export { default as parseEcrArn } from './helpers/parseEcrArn.js'; +export { default as putSecret } from './helpers/putSecret.js'; +export { default as putSsmParameter } from './helpers/putSsmParameter.js'; +export { default as resolveSecret } from './helpers/resolveSecret.js'; +export { default as restartEcsService } from './helpers/restartEcsService.js'; + +export { default as secretExists } from './helpers/secretExists.js'; +export { default as sendSSHPublicKey } from './helpers/sendSSHPublicKey.js'; +export { default as updateTaskDefAppImage } from './helpers/updateTaskDefAppImage.js'; diff --git a/src/base.ts b/src/base.ts index 23c8d24..90d6268 100644 --- a/src/base.ts +++ b/src/base.ts @@ -1,161 +1,144 @@ +/* eslint-disable valid-jsdoc */ +/* eslint-disable import/prefer-default-export */ /** * Base oclif Command to setup 'global' flags and context. * @author Benedikt Arnarsson */ -import path, { dirname } from 'path'; -import { fileURLToPath } from 'url'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - +// Import oclif +import { Command, Flags, Interfaces } from '@oclif/core'; // Import chalk import chalk from 'chalk'; - // Import figlet import figlet from 'figlet'; - -// Import oclif -import { Command, Flags, Interfaces } from '@oclif/core' - // Import yn import yn from 'yn'; // Import aws -import { isConfigured, AssumedRole, getCfnStackExports, initProfile } from './aws/index.js'; - +import { + AssumedRole, + getCfnStackExports, + initProfile, + isConfigured, +} from './aws/index.js'; // Import config import { conf, configDefaults, setConfigDefaults } from './conf.js'; - // Import prompts import { confirm } from './configPrompts/index.js'; - -// Import deploy config -import DeployConfig from './deployConfig/index.js'; - // Import constants import CACCL_DEPLOY_NON_INTERACTIVE from './constants/CACCL_DEPLOY_NON_INTERACTIVE.js'; import CACCL_DEPLOY_VERSION from './constants/CACCL_DEPLOY_VERSION.js'; - -// Import helpers -import warnAboutVersionDiff from './shared/helpers/warnAboutVersionDiff.js'; - +// Import deploy config +import DeployConfig from './deployConfig/index.js'; // Import logger import logger from './logger.js'; - -// Import shared types -import { DeployConfigData } from './types/index.js'; - // Import errors import AppNotFound from './shared/errors/AppNotFound.js'; import AwsProfileNotFound from './shared/errors/AwsProfileNotFound.js'; +// Import helpers +import warnAboutVersionDiff from './shared/helpers/warnAboutVersionDiff.js'; +// Import shared types +import { DeployConfigData } from './types/index.js'; // Types -type Flags = Interfaces.InferredFlags -type Args = Interfaces.InferredArgs +type Flags = Interfaces.InferredFlags< + // eslint-disable-next-line no-use-before-define + (typeof BaseCommand)['baseFlags'] & T['flags'] +>; +type Args = Interfaces.InferredArgs; /** * Base caccl-deploy Command, defining common flags, capabilities, and initialization logic. * @author Benedikt Arnarsson */ export abstract class BaseCommand extends Command { - static description = 'A cli tool for managing ECS/Fargate app deployments'; - - private assumedRole?: AssumedRole; - - public ecrAccessRoleArn?: string; - // define flags that can be inherited by any command that extends BaseCommand static baseFlags = { - 'profile': Flags.string({ + 'app': Flags.string({ + char: 'a', + description: 'name of the app to work with', + hidden: true, + }), + 'cfn-stack-prefix': Flags.string({ + default: conf.get('cfnStackPrefix'), + description: 'cloudformation stack name prefix, e.g. "CacclDeploy-', helpGroup: 'GLOBAL', - description: 'activate a specific aws config/credential profile', - default: 'default', + required: true, }), 'ecr-access-role-arn': Flags.string({ - helpGroup: 'GLOBAL', - description: 'IAM role ARN for cross account ECR repo access', default: conf.get('ecrAccessRoleArn'), + description: 'IAM role ARN for cross account ECR repo access', + helpGroup: 'GLOBAL', }), - 'ssm-root-prefix': Flags.string({ + 'profile': Flags.string({ + default: 'default', + description: 'activate a specific aws config/credential profile', helpGroup: 'GLOBAL', - required: true, - description: 'The root prefix for ssm parameter store entries', - default: conf.get('ssmRootPrefix'), }), - 'cfn-stack-prefix': Flags.string({ + 'ssm-root-prefix': Flags.string({ + default: conf.get('ssmRootPrefix'), + description: 'The root prefix for ssm parameter store entries', helpGroup: 'GLOBAL', required: true, - description: 'cloudformation stack name prefix, e.g. "CacclDeploy-', - default: conf.get('cfnStackPrefix'), }), 'yes': Flags.boolean({ char: 'y', - helpGroup: 'GLOBAL', - description: 'non-interactive, yes to everything, overwrite existing, etc', default: yn(CACCL_DEPLOY_NON_INTERACTIVE), - }), - 'app': Flags.string({ - char: 'a', - description: 'name of the app to work with', - hidden: true, + description: + 'non-interactive, yes to everything, overwrite existing, etc', + helpGroup: 'GLOBAL', }), }; - protected flags!: Flags; + static description = 'A cli tool for managing ECS/Fargate app deployments'; + protected args!: Args; - public async init(): Promise { - // Set the logger - logger.setLogger(this.log, this.logToStderr); + public byeWithCredentialsError = () => { + this.exitWithError( + [ + 'Looks like there is a problem with your AWS credentials configuration.', + 'Did you run `aws configure`? Did you set a region? Default profile?', + ].join('\n'), + ); + }; - // Parse args and flags - await super.init() - const {args, flags} = await this.parse({ - flags: this.ctor.flags, - baseFlags: (super.ctor as typeof BaseCommand).baseFlags, - enableJsonFlag: this.ctor.enableJsonFlag, - args: this.ctor.args, - strict: this.ctor.strict, - }) - this.flags = flags as Flags; - this.args = args as Args; - - // No need for credentials while testing - if (process.env.NODE_ENV !== 'test') { - // Initialize the AWS profile - this.initAwsProfile(this.flags.profile); + public ecrAccessRoleArn?: string; + public exitWithError = (msg?: string) => { + this.bye(msg, 1); + }; - // confirm ASAP that the user's AWS creds/config is good to go - if (!isConfigured()) { - this.byeWithCredentialsError(); + public exitWithSuccess = (msg?: string) => { + this.bye(msg); + }; + + protected flags!: Flags; + + public initAwsProfile = async (profile: string): Promise => { + try { + initProfile(profile); + return profile; + } catch (error) { + if (error instanceof AwsProfileNotFound) { + this.exitWithError(error.message); + } else { + throw error; } } - - /* - * check if this is the first time running and if so create the - * config file with defaults - */ - if (!conf.get('ssmRootPrefix')) { - this.log(chalk.greenBright(figlet.textSync('Caccl-Deploy!'))); - this.log( - [ - 'It looks like this is your first time running caccl-deploy. ', - `A preferences file has been created at ${chalk.yellow(conf.path)}`, - 'with the following default values:', - '', - ...Object.entries(configDefaults).map(([k, v]) => { - return ` - ${chalk.yellow(k)}: ${chalk.bold(JSON.stringify(v))}`; - }), - '', - 'Please see the docs for explanations of these settings', - ].join('\n'), - ); - CACCL_DEPLOY_NON_INTERACTIVE || - (await confirm('Continue?', true)) || - this.exitWithSuccess(); - setConfigDefaults(); - } + return profile; + }; + + private assumedRole?: AssumedRole; + + protected async catch(err: { exitCode?: number } & Error): Promise { + // add any custom logic to handle errors from the command + // or simply return the parent class error handling + return super.catch(err); + } + + protected async finally(_: Error | undefined): Promise { + // called after run and catch regardless of whether or not the command errored + return super.finally(_); } /** @@ -165,39 +148,43 @@ export abstract class BaseCommand extends Command { */ getAppPrefix(appName?: string) { // Destructure flags - const { - 'ssm-root-prefix': ssmRootPrefix, - app, - } = this.flags; - + const { app, 'ssm-root-prefix': ssmRootPrefix } = this.flags; + if ( ssmRootPrefix === undefined || (app === undefined && appName === undefined) ) { - throw Error('Attempted to make an ssm prefix with undefined values'); + throw new Error('Attempted to make an ssm prefix with undefined values'); } + return `${ssmRootPrefix}/${appName || app}`; } + public getAssumedRole(): AssumedRole { + if (!this.assumedRole) { + this.assumedRole = new AssumedRole(); + } + + return this.assumedRole; + } + /** * Convenience method for getting the name of the app's CloudFormation stack * @param {string} appName */ getCfnStackName(appName?: string) { // Destructure flags - const { - 'cfn-stack-prefix': cfnStackPrefix, - app, - } = this.flags; - + const { app, 'cfn-stack-prefix': cfnStackPrefix } = this.flags; + if ( cfnStackPrefix === undefined || (app === undefined && appName === undefined) ) { - throw Error( + throw new Error( 'Attempted to make a cloudformation stack name with undefined values', ); } + return `${cfnStackPrefix}${appName || app}`; } @@ -221,14 +208,69 @@ export abstract class BaseCommand extends Command { ); return deployConfig; - } catch (err) { - if (err instanceof AppNotFound) { + } catch (error) { + if (error instanceof AppNotFound) { this.exitWithError(`${app} app configuration not found!`); } } + return DeployConfig.generate(assumedRole); } + public async init(): Promise { + // Set the logger + logger.setLogger(this.log, this.logToStderr); + + // Parse args and flags + await super.init(); + const { args, flags } = await this.parse({ + args: this.ctor.args, + baseFlags: (super.ctor as typeof BaseCommand).baseFlags, + enableJsonFlag: this.ctor.enableJsonFlag, + flags: this.ctor.flags, + strict: this.ctor.strict, + }); + this.flags = flags as Flags; + this.args = args as Args; + + // No need for credentials while testing + if (process.env.NODE_ENV !== 'test') { + // Initialize the AWS profile + await this.initAwsProfile(this.flags.profile); + + // confirm ASAP that the user's AWS creds/config is good to go + if (!isConfigured()) { + this.byeWithCredentialsError(); + } + } + + /* + * check if this is the first time running and if so create the + * config file with defaults + */ + if (!conf.get('ssmRootPrefix')) { + this.log(chalk.greenBright(figlet.textSync('Caccl-Deploy!'))); + this.log( + [ + 'It looks like this is your first time running caccl-deploy. ', + `A preferences file has been created at ${chalk.yellow(conf.path)}`, + 'with the following default values:', + '', + ...Object.entries(configDefaults).map(([k, v]) => { + return ` - ${chalk.yellow(k)}: ${chalk.bold(JSON.stringify(v))}`; + }), + '', + 'Please see the docs for explanations of these settings', + ].join('\n'), + ); + + CACCL_DEPLOY_NON_INTERACTIVE || + (await confirm('Continue?', true)) || + this.exitWithSuccess(); + setConfigDefaults(); + } + } + /** * Will add another confirm prompt that warns if the deployed stack's * version is more than a patch version different from the cli tool. @@ -247,63 +289,15 @@ export abstract class BaseCommand extends Command { ) { return true; } + const confirmMsg = `Stack deployed with ${chalk.redBright( stackVersion, )}; you are using ${chalk.redBright(cliVersion)}. Proceed?`; return confirm(confirmMsg, false); } - public getAssumedRole(): AssumedRole { - if (!this.assumedRole) { - this.assumedRole = new AssumedRole(); - } - return this.assumedRole; - } - private bye(msg = 'bye!', exitCode = 0) { this.log(msg); this.exit(exitCode); } - - public exitWithSuccess = (msg?: string) => { - this.bye(msg); - } - - public exitWithError = (msg?: string) => { - this.bye(msg, 1); - } - - public byeWithCredentialsError = () => { - this.exitWithError( - [ - 'Looks like there is a problem with your AWS credentials configuration.', - 'Did you run `aws configure`? Did you set a region? Default profile?', - ].join('\n'), - ); - }; - - public initAwsProfile = async (profile: string): Promise => { - try { - initProfile(profile); - return profile; - } catch (err) { - if (err instanceof AwsProfileNotFound) { - this.exitWithError(err.message); - } else { - throw err; - } - } - return profile; - }; - - protected async catch(err: Error & {exitCode?: number}): Promise { - // add any custom logic to handle errors from the command - // or simply return the parent class error handling - return super.catch(err) - } - - protected async finally(_: Error | undefined): Promise { - // called after run and catch regardless of whether or not the command errored - return super.finally(_) - } -} \ No newline at end of file +} diff --git a/src/cdk/assets/scheduled_task_exec/index.js b/src/cdk/assets/scheduled_task_exec/index.js index 63af52e..896b091 100644 --- a/src/cdk/assets/scheduled_task_exec/index.js +++ b/src/cdk/assets/scheduled_task_exec/index.js @@ -33,18 +33,18 @@ exports.handler = async (event) => { const execResp = await ecs .runTask({ cluster: ECS_CLUSTER, - taskDefinition: ECS_TASK_DEFINITION, - networkConfiguration, launchType: 'FARGATE', - platformVersion: '1.4.0', + networkConfiguration, overrides: { containerOverrides: [ { - name: 'AppOnlyContainer', command: ['/bin/sh', '-c', execCommand], + name: 'AppOnlyContainer', }, ], }, + platformVersion: '1.4.0', + taskDefinition: ECS_TASK_DEFINITION, }) .promise(); const { taskArn } = execResp.tasks[0]; diff --git a/src/cdk/cdk.ts b/src/cdk/cdk.ts index c75ff01..4153f33 100644 --- a/src/cdk/cdk.ts +++ b/src/cdk/cdk.ts @@ -1,15 +1,17 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ - -import 'source-map-support/register'; -import { readFileSync } from 'fs'; +/* eslint-disable camelcase */ import { App, CfnOutput } from 'aws-cdk-lib'; +import { readFileSync } from 'node:fs'; +import 'source-map-support/register'; import yn from 'yn'; +import { + CacclDeployStackProps, + CacclDeployStackPropsData, +} from '../types/index.js'; import CacclDeployStack from './lib/classes/CacclDeployStack.js'; -import { CacclDeployStackProps, CacclDeployStackPropsData } from '../types/index.js'; if (process.env.CDK_STACK_PROPS_FILE_PATH === undefined) { - throw new Error(); + throw new Error('CDK_STACK_PROPS_FILE_PATH not found.'); } const stackPropsData: CacclDeployStackPropsData = @@ -18,62 +20,62 @@ const stackPropsData: CacclDeployStackPropsData = ); const { - stackName, - vpcId, - ecsClusterName, - awsRegion, + albLogBucketName, awsAccountId, + awsRegion, cacclDeployVersion, - albLogBucketName, - deployConfigHash, deployConfig, + deployConfigHash, + ecsClusterName, + stackName, + vpcId, } = stackPropsData; const stackProps: CacclDeployStackProps = { - // the CloudFormation stack name, e.g. "CacclDeploy-foo-app" - stackName, - // id of the shared vpc we're deploying to - vpcId, - // name of the shared ECS cluster we're deploying to - ecsClusterName, // shared s3 bucket where the application load balancer logs will end up albLogBucketName, - // ARN of the ssl certificate - certificateArn: deployConfig.certificateArn, // object that defines the environment variables that will be injected into the app container appEnvironment: deployConfig.appEnvironment ?? {}, - // email and slack endpoints - notifications: deployConfig.notifications ?? {}, - // settings for the fargate task - taskDefProps: { - appImage: deployConfig.appImage, - proxyImage: deployConfig.proxyImage, - taskCpu: deployConfig.taskCpu, - taskMemory: deployConfig.taskMemory, - logRetentionDays: deployConfig.logRetentionDays, - gitRepoVolume: deployConfig.gitRepoVolume, - }, - // how many concurrent tasks to run - taskCount: +(deployConfig.taskCount ?? 1), - // settings for the load balancer & load balancer targets - lbOptions: deployConfig.lbOptions, - // optionally attach a restrictive security group - firewallSgId: deployConfig.firewallSgId, // add an elasticache/redis instance (e.g. for use by django) cacheOptions: deployConfig.cacheOptions, + // ARN of the ssl certificate + certificateArn: deployConfig.certificateArn, // settings for a database dbOptions: deployConfig.dbOptions, + // name of the shared ECS cluster we're deploying to + ecsClusterName, + enableExecuteCommand: yn(deployConfig.enableExecuteCommand), + env: { + account: awsAccountId, + region: awsRegion, + }, + // optionally attach a restrictive security group + firewallSgId: deployConfig.firewallSgId, + // settings for the load balancer & load balancer targets + lbOptions: deployConfig.lbOptions, + // email and slack endpoints + notifications: deployConfig.notifications ?? {}, // settings to run tasks like cronjobs scheduledTasks: deployConfig.scheduledTasks, - enableExecuteCommand: yn(deployConfig.enableExecuteCommand), + // the CloudFormation stack name, e.g. "CacclDeploy-foo-app" + stackName, tags: { caccl_deploy_stack_name: stackName, ...deployConfig.tags, }, - env: { - account: awsAccountId, - region: awsRegion, + // how many concurrent tasks to run + taskCount: Number(deployConfig.taskCount ?? 1), + // settings for the fargate task + taskDefProps: { + appImage: deployConfig.appImage, + gitRepoVolume: deployConfig.gitRepoVolume, + logRetentionDays: deployConfig.logRetentionDays, + proxyImage: deployConfig.proxyImage, + taskCpu: deployConfig.taskCpu, + taskMemory: deployConfig.taskMemory, }, + // id of the shared vpc we're deploying to + vpcId, }; /** diff --git a/src/cdk/lib/classes/CacclAppEnvironment.ts b/src/cdk/lib/classes/CacclAppEnvironment.ts index 45425c2..a9f6442 100644 --- a/src/cdk/lib/classes/CacclAppEnvironment.ts +++ b/src/cdk/lib/classes/CacclAppEnvironment.ts @@ -3,12 +3,14 @@ import { aws_ecs as ecs, aws_secretsmanager as secretsmanager, } from 'aws-cdk-lib'; - // Import AWS constructs import { Construct } from 'constructs'; // Import shared types -import { CacclAppEnvironmentProps, ICacclAppEnvironment } from '../../../types/index.js'; +import { + CacclAppEnvironmentProps, + ICacclAppEnvironment, +} from '../../../types/index.js'; class CacclAppEnvironment extends Construct implements ICacclAppEnvironment { env: { [key: string]: string }; @@ -19,12 +21,12 @@ class CacclAppEnvironment extends Construct implements ICacclAppEnvironment { super(scope, id); this.env = { - PORT: '8080', NODE_ENV: 'production', + PORT: '8080', }; this.secrets = {}; - Object.entries(props.envVars).forEach(([name, value]) => { + for (const [name, value] of Object.entries(props.envVars)) { if (value.toString().toLowerCase().startsWith('arn:aws:secretsmanager')) { const varSecret = secretsmanager.Secret.fromSecretCompleteArn( this, @@ -35,7 +37,7 @@ class CacclAppEnvironment extends Construct implements ICacclAppEnvironment { } else { this.env[name] = value; } - }); + } } public addEnvironmentVar(k: string, v: string): void { diff --git a/src/cdk/lib/classes/CacclCache.ts b/src/cdk/lib/classes/CacclCache.ts index e743418..ac560b3 100644 --- a/src/cdk/lib/classes/CacclCache.ts +++ b/src/cdk/lib/classes/CacclCache.ts @@ -1,12 +1,11 @@ // Import AWS CDK lib import { + CfnOutput, + Stack, aws_cloudwatch as cloudwatch, aws_ec2 as ec2, aws_elasticache as elasticache, - Stack, - CfnOutput, } from 'aws-cdk-lib'; - // Import AWS constructs import { Construct } from 'constructs'; @@ -14,23 +13,23 @@ import { Construct } from 'constructs'; import { CacclCacheProps } from '../../../types/index.js'; class CacclCache extends Construct { + alarms: cloudwatch.Alarm[]; + cache: elasticache.CfnCacheCluster; cacheSg: ec2.SecurityGroup; metrics: { [key: string]: cloudwatch.Metric }; - alarms: cloudwatch.Alarm[]; - constructor(scope: Construct, id: string, props: CacclCacheProps) { super(scope, id); - const { vpc, appEnv } = props; + const { appEnv, options, vpc } = props; const { + cacheNodeType = 'cache.t3.medium', engine = 'redis', numCacheNodes = 1, - cacheNodeType = 'cache.t3.medium', - } = props.options; + } = options; const subnetGroup = new elasticache.CfnSubnetGroup( this, @@ -44,9 +43,9 @@ class CacclCache extends Construct { ); this.cacheSg = new ec2.SecurityGroup(this, 'CacheSecurityGroup', { - vpc, - description: 'security group for the elasticache cluster', allowAllOutbound: false, + description: 'security group for the elasticache cluster', + vpc, }); this.cacheSg.addIngressRule( @@ -63,10 +62,10 @@ class CacclCache extends Construct { this.cacheSg.addEgressRule(ec2.Peer.anyIpv4(), ec2.Port.allTcp()); this.cache = new elasticache.CfnCacheCluster(this, 'CacheCluster', { - engine, - numCacheNodes, cacheNodeType, cacheSubnetGroupName: subnetGroup.ref, + engine, + numCacheNodes, vpcSecurityGroupIds: [this.cacheSg.securityGroupId], }); diff --git a/src/cdk/lib/classes/CacclContainerImage.ts b/src/cdk/lib/classes/CacclContainerImage.ts index 616676c..7c615b0 100644 --- a/src/cdk/lib/classes/CacclContainerImage.ts +++ b/src/cdk/lib/classes/CacclContainerImage.ts @@ -1,12 +1,10 @@ // Import NodeJS libs -import fs from 'fs'; -import path from 'path'; - -// Import AWS CDK lib import { aws_ecr as ecr, aws_ecs as ecs } from 'aws-cdk-lib'; - // Import AWS constructs import { Construct } from 'constructs'; +import fs from 'node:fs'; +// Import AWS CDK lib +import path from 'node:path'; // Import shared types import { CacclContainerImageOptions } from '../../../types/index.js'; @@ -29,7 +27,7 @@ class CacclContainerImage extends Construct { if (splitArn.length === 7) { // tag is appended to arn repoArn = splitArn.slice(0, 6).join(':'); - repoTag = splitArn.slice(-1).join(); + repoTag = splitArn.slice(-1).join(','); } else { repoArn = appImage; } @@ -43,19 +41,20 @@ class CacclContainerImage extends Construct { } else { this.image = ecs.ContainerImage.fromRegistry(appImage); } - } else if (buildPath !== undefined) { - if (!fs.existsSync(path.join(buildPath, 'Dockerfile'))) { - console.error(`No Dockerfile found at ${buildPath}`); - process.exit(1); - } - this.image = ecs.ContainerImage.fromAsset(buildPath); - } else { + } else if (buildPath === undefined) { console.error('Missing configuration options for building the app image'); console.error('At least one of the following must be defined:'); console.error(' * deployConfig.appImage.repoName'); console.error(' * deployConfig.appImage.buildPath'); console.error(' * the $APP_DIR environment variable'); process.exit(1); + } else { + if (!fs.existsSync(path.join(buildPath, 'Dockerfile'))) { + console.error(`No Dockerfile found at ${buildPath}`); + process.exit(1); + } + + this.image = ecs.ContainerImage.fromAsset(buildPath); } } } diff --git a/src/cdk/lib/classes/CacclDbBase.ts b/src/cdk/lib/classes/CacclDbBase.ts index 65a34f6..b562551 100644 --- a/src/cdk/lib/classes/CacclDbBase.ts +++ b/src/cdk/lib/classes/CacclDbBase.ts @@ -1,67 +1,65 @@ import { + CfnOutput, + RemovalPolicy, + Stack, aws_cloudwatch as cloudwatch, aws_docdb as docdb, aws_ec2 as ec2, aws_rds as rds, aws_secretsmanager as secretsmanager, - Stack, - CfnOutput, - RemovalPolicy, } from 'aws-cdk-lib'; - import { Construct } from 'constructs'; // Import shared types import { CacclDbProps, ICacclDb } from '../../../types/index.js'; - // Import constants import DEFAULT_REMOVAL_POLICY from '../constants/DEFAULT_REMOVAL_POLICY.js'; abstract class CacclDbBase extends Construct implements ICacclDb { - // the hostname of the cluster's endpoint - host: string; + // collection of cloudwatch metric alarms + alarms: cloudwatch.Alarm[]; - // cluster endpoint port - port: string; + // e.g. enabling performance monitoring + clusterParameterGroupParams: { [key: string]: string } = {}; - // will get the generated master password for the db - dbPasswordSecret: secretsmanager.Secret; + // the actual cluster construct + dbCluster: docdb.DatabaseCluster | rds.DatabaseCluster; // overrides that get set in the cluster-level parameter group, - // e.g. enabling performance monitoring - clusterParameterGroupParams: { [key: string]: string } = {}; + // will get the generated master password for the db + dbPasswordSecret: secretsmanager.Secret; // overrides for the instance-level param group + // the database security group + dbSg: ec2.SecurityGroup; + + // the "etcetera" policy for the parameter group(s) and security group + etcRemovalPolicy: RemovalPolicy; + + // the hostname of the cluster's endpoint + host: string; + // e.g. turning on slow query logging instanceParameterGroupParams: { [key: string]: string } = {}; - // the actual cluster construct - dbCluster: docdb.DatabaseCluster | rds.DatabaseCluster; - // cloudwatch metrics namespace metricNamespace: string; // collection of metric constructs metrics: { [key: string]: cloudwatch.Metric[] }; - // collection of cloudwatch metric alarms - alarms: cloudwatch.Alarm[]; + // cluster endpoint port + port: string; // basic removal policy for the cluster/instances removalPolicy: RemovalPolicy; - // the database security group - dbSg: ec2.SecurityGroup; - - // the "etcetera" policy for the parameter group(s) and security group - etcRemovalPolicy: RemovalPolicy; - // TODO: JSDoc for constructor constructor(scope: Construct, id: string, props: CacclDbProps) { super(scope, id); - const { vpc } = props; - const { removalPolicy = DEFAULT_REMOVAL_POLICY } = props.options; + const { options, vpc } = props; + const { removalPolicy = DEFAULT_REMOVAL_POLICY } = options; // removal policy for the cluster & instances this.removalPolicy = (RemovalPolicy)[removalPolicy]; @@ -81,8 +79,8 @@ abstract class CacclDbBase extends Construct implements ICacclDb { Stack.of(this).stackName }`, generateSecretString: { - passwordLength: 16, excludePunctuation: true, + passwordLength: 16, }, }, ); @@ -96,9 +94,9 @@ abstract class CacclDbBase extends Construct implements ICacclDb { * stack resources */ this.dbSg = new ec2.SecurityGroup(this, 'DbSecurityGroup', { - vpc, - description: 'security group for the db cluster', allowAllOutbound: false, + description: 'security group for the db cluster', + vpc, }); this.dbSg.applyRemovalPolicy(this.etcRemovalPolicy); @@ -111,6 +109,13 @@ abstract class CacclDbBase extends Construct implements ICacclDb { this.dbSg.addEgressRule(ec2.Peer.anyIpv4(), ec2.Port.allTcp()); } + addSecurityGroupIngress(vpcCidrBlock: string) { + this.dbCluster.connections.allowDefaultPortInternally(); + this.dbCluster.connections.allowDefaultPortFrom( + ec2.Peer.ipv4(vpcCidrBlock), + ); + } + // FIXME: doesn't do anything? createOutputs() { new CfnOutput(this, 'DbClusterEndpoint', { @@ -124,13 +129,6 @@ abstract class CacclDbBase extends Construct implements ICacclDb { }); } - addSecurityGroupIngress(vpcCidrBlock: string) { - this.dbCluster.connections.allowDefaultPortInternally(); - this.dbCluster.connections.allowDefaultPortFrom( - ec2.Peer.ipv4(vpcCidrBlock), - ); - } - abstract createMetricsAndAlarms(): void; abstract getDashboardLink(): string; diff --git a/src/cdk/lib/classes/CacclDeployStack.ts b/src/cdk/lib/classes/CacclDeployStack.ts index 4b558d2..d3247de 100644 --- a/src/cdk/lib/classes/CacclDeployStack.ts +++ b/src/cdk/lib/classes/CacclDeployStack.ts @@ -1,10 +1,16 @@ -import { aws_ec2 as ec2, aws_ecs as ecs, Stack, StackProps } from 'aws-cdk-lib'; +import { Stack, StackProps, aws_ec2 as ec2, aws_ecs as ecs } from 'aws-cdk-lib'; import { Construct } from 'constructs'; // Import shared types // Import helpers +import { + CacclDeployStackProps, + CacclNotificationsProps, + LoadBalancerSecurityGroups, +} from '../../../types/index.js'; +import createDbConstruct from '../helpers/createDbConstruct.js'; // Import classes import CacclAppEnvironment from './CacclAppEnvironment.js'; import CacclCache from './CacclCache.js'; @@ -15,29 +21,22 @@ import CacclScheduledTasks from './CacclScheduledTasks.js'; import CacclService from './CacclService.js'; import CacclSshBastion from './CacclSshBastion.js'; import CacclTaskDef from './CacclTaskDef.js'; -import { - CacclDeployStackProps, - CacclNotificationsProps, - LoadBalancerSecurityGroups, -} from '../../../types/index.js'; -import createDbConstruct from '../helpers/createDbConstruct.js'; class CacclDeployStack extends Stack { constructor(scope: Construct, id: string, props: CacclDeployStackProps) { super(scope, id, props as StackProps); let vpc; - let cluster; // should we create an ssh bastion for access to db/cache/etc let createBastion = false; - if (props.vpcId !== undefined) { + if (props.vpcId === undefined) { + throw new Error('deployConfig must define a vpcId'); + } else { vpc = ec2.Vpc.fromLookup(this, 'Vpc', { vpcId: props.vpcId, }) as ec2.Vpc; - } else { - throw new Error('deployConfig must define a vpcId'); } const appEnv = new CacclAppEnvironment(this, 'AppEnvironment', { @@ -53,38 +52,37 @@ class CacclDeployStack extends Stack { if (props.dbOptions) { createBastion = true; db = createDbConstruct(this, { - vpc, - options: props.dbOptions, appEnv, + options: props.dbOptions, + vpc, }); } if (props.cacheOptions) { createBastion = true; new CacclCache(this, 'Cache', { - vpc, - options: props.cacheOptions, appEnv, - }); - } - - if (props.ecsClusterName !== undefined) { - cluster = ecs.Cluster.fromClusterAttributes(this, 'Cluster', { - vpc, - clusterName: props.ecsClusterName, - securityGroups: [], - }) as ecs.Cluster; - } else { - cluster = new ecs.Cluster(this, 'Cluster', { - clusterName: props.stackName, - containerInsights: true, + options: props.cacheOptions, vpc, }); } + const cluster = + props.ecsClusterName === undefined + ? new ecs.Cluster(this, 'Cluster', { + clusterName: props.stackName, + containerInsights: true, + vpc, + }) + : (ecs.Cluster.fromClusterAttributes(this, 'Cluster', { + clusterName: props.ecsClusterName, + securityGroups: [], + vpc, + }) as ecs.Cluster); + const taskDef = new CacclTaskDef(this, 'TaskDef', { - vpcCidrBlock: vpc.vpcCidrBlock, appEnvironment: appEnv, + vpcCidrBlock: vpc.vpcCidrBlock, ...props.taskDefProps, }); @@ -103,15 +101,15 @@ class CacclDeployStack extends Stack { // we also need a separate, app-specific security group for miscellaneous lbSecurityGroups.misc = new ec2.SecurityGroup(this, 'MiscSecurityGroup', { - vpc, description: 'security group for miscellaneous app-specific ingress rules', + vpc, }); } else { // primary will be a new, "open" security group const newSg = new ec2.SecurityGroup(this, 'FirewallSecurityGroup', { - vpc, description: 'security group for the load balancer and app service', + vpc, }); // by default apps are public @@ -123,7 +121,7 @@ class CacclDeployStack extends Stack { const service = new CacclService(this, 'EcsService', { cluster, - taskDef, + enableExecuteCommand: props.enableExecuteCommand, /** * The security group passed into the CacclService is used in a traffic source ingress rule. * i.e., the resulting ECS servcie will get its own security group with a single ingress rule that allows @@ -131,14 +129,14 @@ class CacclDeployStack extends Stack { */ loadBalancerSg: lbSecurityGroups.primary, taskCount: props.taskCount, - enableExecuteCommand: props.enableExecuteCommand, + taskDef, }); const loadBalancer = new CacclLoadBalancer(this, 'LoadBalancer', { - certificateArn: props.certificateArn, - loadBalancerTarget: service.loadBalancerTarget, albLogBucketName: props.albLogBucketName, + certificateArn: props.certificateArn, extraOptions: props.lbOptions, + loadBalancerTarget: service.loadBalancerTarget, securityGroups: lbSecurityGroups, vpc, }); @@ -150,8 +148,8 @@ class CacclDeployStack extends Stack { const notifyProps: CacclNotificationsProps = { ...props.notifications, - service, loadBalancer, + service, }; if (db) { @@ -170,21 +168,22 @@ class CacclDeployStack extends Stack { bastionSg = lbSecurityGroups.primary; } else { bastionSg = new ec2.SecurityGroup(this, 'BastionSecurityGroup', { - vpc, description: 'security group for the ssh bastion host', + vpc, }); bastionSg.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(22)); } - new CacclSshBastion(this, 'SshBastion', { vpc, sg: bastionSg }); + + new CacclSshBastion(this, 'SshBastion', { sg: bastionSg, vpc }); } if (props.scheduledTasks) { const scheduledTasks = new CacclScheduledTasks(this, 'ScheduledTasks', { - vpc, - scheduledTasks: props.scheduledTasks, clusterName: cluster.clusterName, + scheduledTasks: props.scheduledTasks, serviceName: service.ecsService.serviceName, taskDefinition: taskDef.appOnlyTaskDef, + vpc, }); dashboard.addScheduledTasksSection(scheduledTasks); } diff --git a/src/cdk/lib/classes/CacclDocDb.ts b/src/cdk/lib/classes/CacclDocDb.ts index af6466e..39896a4 100644 --- a/src/cdk/lib/classes/CacclDocDb.ts +++ b/src/cdk/lib/classes/CacclDocDb.ts @@ -1,25 +1,25 @@ +/* eslint-disable camelcase */ + // Import AWS CDK lib import { + Duration, + SecretValue, + Stack, aws_cloudwatch as cloudwatch, aws_docdb as docdb, aws_ec2 as ec2, aws_ecs as ecs, - Stack, - SecretValue, - Duration, } from 'aws-cdk-lib'; - // Import AWS CDK constructs import { Construct } from 'constructs'; -// Import types -import CacclDbBase from './CacclDbBase.js'; import { CacclDbProps } from '../../../types/index.js'; - // Import constants import DEFAULT_DB_INSTANCE_TYPE from '../constants/DEFAULT_DB_INSTANCE_TYPE.js'; import DEFAULT_DOCDB_ENGINE_VERSION from '../constants/DEFAULT_DOCDB_ENGINE_VERSION.js'; import DEFAULT_DOCDB_PARAM_GROUP_FAMILY from '../constants/DEFAULT_DOCDB_PARAM_GROUP_FAMILY.js'; +import CacclDbBase from './CacclDbBase.js'; +// Import types // Import classes @@ -29,14 +29,14 @@ class CacclDocDb extends CacclDbBase { constructor(scope: Construct, id: string, props: CacclDbProps) { super(scope, id, props); - const { vpc, appEnv } = props; + const { appEnv, options, vpc } = props; const { + engineVersion = DEFAULT_DOCDB_ENGINE_VERSION, instanceCount = 1, instanceType = DEFAULT_DB_INSTANCE_TYPE, - engineVersion = DEFAULT_DOCDB_ENGINE_VERSION, parameterGroupFamily = DEFAULT_DOCDB_PARAM_GROUP_FAMILY, profiler = false, - } = props.options; + } = options; if (profiler) { this.clusterParameterGroupParams.profiler = 'enabled'; @@ -48,30 +48,30 @@ class CacclDocDb extends CacclDbBase { 'ClusterParameterGroup', { dbClusterParameterGroupName: `${Stack.of(this).stackName}-param-group`, - family: parameterGroupFamily, description: `Cluster parameter group for ${Stack.of(this).stackName}`, + family: parameterGroupFamily, parameters: this.clusterParameterGroupParams, }, ); this.dbCluster = new docdb.DatabaseCluster(this, 'DocDbCluster', { + backup: { + retention: Duration.days(14), + }, + engineVersion, + instanceType: new ec2.InstanceType(instanceType), + instances: instanceCount, masterUser: { - username: 'root', password: SecretValue.secretsManager(this.dbPasswordSecret.secretArn), + username: 'root', }, parameterGroup, - engineVersion, - instances: instanceCount, + removalPolicy: this.removalPolicy, + securityGroup: this.dbSg, vpc, - instanceType: new ec2.InstanceType(instanceType), vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS, }, - securityGroup: this.dbSg, - backup: { - retention: Duration.days(14), - }, - removalPolicy: this.removalPolicy, }); // this needs to happen after the parameter group has been associated with the cluster @@ -96,105 +96,94 @@ class CacclDocDb extends CacclDbBase { this.addSecurityGroupIngress(vpc.vpcCidrBlock); } - makeDocDbMetric(metricName: string, extraProps = {}): cloudwatch.Metric { - const metric = new cloudwatch.Metric({ - metricName, - namespace: this.metricNamespace, - dimensionsMap: { DBClusterIdentifier: this.dbCluster.clusterIdentifier }, - ...extraProps, - }).with({ period: Duration.minutes(1) }); - - return metric.attachTo(this.dbCluster); - } - createMetricsAndAlarms(): void { this.metrics = { - ReadIOPS: [this.makeDocDbMetric('ReadIOPS')], - WriteIOPS: [this.makeDocDbMetric('WriteIOPS')], - CPUUtilization: [ - this.makeDocDbMetric('CPUUtilization', { + BufferCacheHitRatio: [ + this.makeDocDbMetric('BufferCacheHitRatio', { unit: cloudwatch.Unit.PERCENT, }), ], - FreeableMemory: [this.makeDocDbMetric('FreeableMemory')], - BufferCacheHitRatio: [ - this.makeDocDbMetric('BufferCacheHitRatio', { + CPUUtilization: [ + this.makeDocDbMetric('CPUUtilization', { unit: cloudwatch.Unit.PERCENT, }), ], DatabaseConnections: [this.makeDocDbMetric('DatabaseConnections')], + DatabaseCursorsTimedOut: [ + this.makeDocDbMetric('DatabaseCursorsTimedOut', { statistic: 'sum' }), + ], DiskQueueDepth: [this.makeDocDbMetric('DiskQueueDepth')], + FreeableMemory: [this.makeDocDbMetric('FreeableMemory')], + Queries: [this.makeDocDbMetric('OpcountersQuery')], + ReadIOPS: [this.makeDocDbMetric('ReadIOPS')], ReadLatency: [ this.makeDocDbMetric('ReadLatency', { unit: cloudwatch.Unit.MILLISECONDS, }), ], + Transactions: [this.makeDocDbMetric('TransactionsOpen')], + WriteIOPS: [this.makeDocDbMetric('WriteIOPS')], WriteLatency: [ this.makeDocDbMetric('WriteLatency', { unit: cloudwatch.Unit.MILLISECONDS, }), ], - DatabaseCursorsTimedOut: [ - this.makeDocDbMetric('DatabaseCursorsTimedOut', { statistic: 'sum' }), - ], - Transactions: [this.makeDocDbMetric('TransactionsOpen')], - Queries: [this.makeDocDbMetric('OpcountersQuery')], }; this.alarms = [ new cloudwatch.Alarm(this, 'CPUUtilizationAlarm', { + alarmDescription: `${ + Stack.of(this).stackName + } docdb cpu utilization alarm`, + evaluationPeriods: 3, metric: this.metrics.CPUUtilization[0].with({ period: Duration.minutes(5), }), threshold: 50, - evaluationPeriods: 3, - alarmDescription: `${ - Stack.of(this).stackName - } docdb cpu utilization alarm`, }), new cloudwatch.Alarm(this, 'BufferCacheHitRatioAlarm', { - metric: this.metrics.BufferCacheHitRatio[0], - threshold: 90, - evaluationPeriods: 3, - comparisonOperator: - cloudwatch.ComparisonOperator.LESS_THAN_OR_EQUAL_TO_THRESHOLD, alarmDescription: `${ Stack.of(this).stackName } docdb buffer cache hit ratio alarm`, + comparisonOperator: + cloudwatch.ComparisonOperator.LESS_THAN_OR_EQUAL_TO_THRESHOLD, + evaluationPeriods: 3, + metric: this.metrics.BufferCacheHitRatio[0], + threshold: 90, }), new cloudwatch.Alarm(this, 'DiskQueueDepth', { + alarmDescription: `${Stack.of(this).stackName} docdb disk queue depth`, + evaluationPeriods: 3, metric: this.metrics.DiskQueueDepth[0], threshold: 1, - evaluationPeriods: 3, - alarmDescription: `${Stack.of(this).stackName} docdb disk queue depth`, }), new cloudwatch.Alarm(this, 'ReadLatency', { - metric: this.metrics.ReadLatency[0], - threshold: 20, - evaluationPeriods: 3, - treatMissingData: cloudwatch.TreatMissingData.IGNORE, alarmDescription: `${ Stack.of(this).stackName } docdb read latency alarm`, - }), - new cloudwatch.Alarm(this, 'WriteLatency', { - metric: this.metrics.WriteLatency[0], - threshold: 100, evaluationPeriods: 3, + metric: this.metrics.ReadLatency[0], + threshold: 20, treatMissingData: cloudwatch.TreatMissingData.IGNORE, + }), + new cloudwatch.Alarm(this, 'WriteLatency', { alarmDescription: `${ Stack.of(this).stackName } docdb write latency alarm`, + evaluationPeriods: 3, + metric: this.metrics.WriteLatency[0], + threshold: 100, + treatMissingData: cloudwatch.TreatMissingData.IGNORE, }), new cloudwatch.Alarm(this, 'DatabaseCursorsTimedOutAlarm', { + alarmDescription: `${ + Stack.of(this).stackName + } docdb cursors timed out alarm`, + evaluationPeriods: 3, metric: this.metrics.DatabaseCursorsTimedOut[0].with({ period: Duration.minutes(5), }), threshold: 5, - evaluationPeriods: 3, - alarmDescription: `${ - Stack.of(this).stackName - } docdb cursors timed out alarm`, }), ]; } @@ -204,6 +193,17 @@ class CacclDocDb extends CacclDbBase { const dbClusterId = this.dbCluster.clusterIdentifier; return `https://console.aws.amazon.com/docdb/home?region=${region}#cluster-details/${dbClusterId}`; } + + makeDocDbMetric(metricName: string, extraProps = {}): cloudwatch.Metric { + const metric = new cloudwatch.Metric({ + dimensionsMap: { DBClusterIdentifier: this.dbCluster.clusterIdentifier }, + metricName, + namespace: this.metricNamespace, + ...extraProps, + }).with({ period: Duration.minutes(1) }); + + return metric.attachTo(this.dbCluster); + } } export default CacclDocDb; diff --git a/src/cdk/lib/classes/CacclGitRepoVolumeContainer.ts b/src/cdk/lib/classes/CacclGitRepoVolumeContainer.ts index c528bfc..9760f0b 100644 --- a/src/cdk/lib/classes/CacclGitRepoVolumeContainer.ts +++ b/src/cdk/lib/classes/CacclGitRepoVolumeContainer.ts @@ -6,7 +6,6 @@ import { Construct } from 'constructs'; // Import shared types import { CacclGitRepoVolumeContainerProps } from '../../../types/index.js'; - // Import constants import VOLUME_CONTAINER_MOUNT_PATH from '../constants/VOLUME_CONTAINER_MOUNT_PATH.js'; import VOLUME_NAME from '../constants/VOLUME_NAME.js'; @@ -21,7 +20,7 @@ class CacclGitRepoVolumeContainer extends Construct { ) { super(scope, id); - const { taskDefinition, appContainer, repoUrlSecretArn, appContainerPath } = + const { appContainer, appContainerPath, repoUrlSecretArn, taskDefinition } = props; // the volume itself is added to the task definition @@ -40,14 +39,14 @@ class CacclGitRepoVolumeContainer extends Construct { this, 'GitRepoVolumeContainer', { - image: ecs.ContainerImage.fromRegistry('alpine/git'), command: ['git clone --branch master $GIT_REPO_URL /var/gitrepo'], entryPoint: ['sh', '-c'], essential: false, - taskDefinition, + image: ecs.ContainerImage.fromRegistry('alpine/git'), secrets: { GIT_REPO_URL: repoUrlSecret, }, + taskDefinition, }, ); @@ -64,8 +63,8 @@ class CacclGitRepoVolumeContainer extends Construct { }); appContainer.addContainerDependencies({ - container: this.container, condition: ecs.ContainerDependencyCondition.SUCCESS, + container: this.container, }); } } diff --git a/src/cdk/lib/classes/CacclLoadBalancer.ts b/src/cdk/lib/classes/CacclLoadBalancer.ts index 2319fa3..12c4218 100644 --- a/src/cdk/lib/classes/CacclLoadBalancer.ts +++ b/src/cdk/lib/classes/CacclLoadBalancer.ts @@ -1,10 +1,10 @@ import { - aws_cloudwatch as cloudwatch, - aws_elasticloadbalancingv2 as elb, - aws_s3 as s3, CfnOutput, Duration, Stack, + aws_cloudwatch as cloudwatch, + aws_elasticloadbalancingv2 as elb, + aws_s3 as s3, } from 'aws-cdk-lib'; import { Construct } from 'constructs'; @@ -12,25 +12,25 @@ import { Construct } from 'constructs'; import { CacclLoadBalancerProps } from '../../../types/index.js'; class CacclLoadBalancer extends Construct { - loadBalancer: elb.ApplicationLoadBalancer; + alarms: cloudwatch.Alarm[]; httpsListener: elb.ApplicationListener; - metrics: { [key: string]: cloudwatch.Metric }; + loadBalancer: elb.ApplicationLoadBalancer; - alarms: cloudwatch.Alarm[]; + metrics: { [key: string]: cloudwatch.Metric }; constructor(scope: Construct, id: string, props: CacclLoadBalancerProps) { super(scope, id); const { - vpc, - securityGroups, - certificateArn, - loadBalancerTarget, albLogBucketName, + certificateArn, // includes targetDeregistrationDelay & healthCheckPath which are applied to the ApplicationTargetGroup below extraOptions, + loadBalancerTarget, + securityGroups, + vpc, } = props; const targetDeregistrationDelay = @@ -38,9 +38,9 @@ class CacclLoadBalancer extends Construct { const healthCheckPath = extraOptions?.healthCheckPath ?? '/'; this.loadBalancer = new elb.ApplicationLoadBalancer(this, 'LoadBalancer', { - vpc, - securityGroup: securityGroups.primary, internetFacing: true, + securityGroup: securityGroups.primary, + vpc, }); if (securityGroups.misc) { @@ -58,49 +58,49 @@ class CacclLoadBalancer extends Construct { } new elb.CfnListener(this, 'HttpRedirect', { - loadBalancerArn: this.loadBalancer.loadBalancerArn, - protocol: elb.ApplicationProtocol.HTTP, - port: 80, defaultActions: [ { - type: 'redirect', redirectConfig: { - statusCode: 'HTTP_301', - port: '443', - protocol: 'HTTPS', host: '#{host}', path: '/#{path}', + port: '443', + protocol: 'HTTPS', query: '#{query}', + statusCode: 'HTTP_301', }, + type: 'redirect', }, ], + loadBalancerArn: this.loadBalancer.loadBalancerArn, + port: 80, + protocol: elb.ApplicationProtocol.HTTP, }); const httpsListener = new elb.ApplicationListener(this, 'HttpsListener', { - loadBalancer: this.loadBalancer, certificates: certificateArn ? [{ certificateArn }] : [], - port: 443, - protocol: elb.ApplicationProtocol.HTTPS, + loadBalancer: this.loadBalancer, /** * if we don't make this false the listener construct will add rules * to our security group that we don't want/need */ open: false, + port: 443, + protocol: elb.ApplicationProtocol.HTTPS, }); const atgProps = { - vpc, - port: 443, - protocol: elb.ApplicationProtocol.HTTPS, - // setting this duration value enables the lb stickiness; 1 day is the default - stickinessCookieDuration: Duration.seconds(86400), - targetType: elb.TargetType.IP, - targets: [loadBalancerTarget], deregistrationDelay: Duration.seconds(targetDeregistrationDelay), healthCheck: { // allow a redirect to indicate service is operational healthyHttpCodes: '200,302', }, + port: 443, + protocol: elb.ApplicationProtocol.HTTPS, + // setting this duration value enables the lb stickiness; 1 day is the default + stickinessCookieDuration: Duration.seconds(86_400), + targetType: elb.TargetType.IP, + targets: [loadBalancerTarget], + vpc, }; if (healthCheckPath !== undefined && healthCheckPath !== '/') { @@ -123,22 +123,22 @@ class CacclLoadBalancer extends Construct { }); this.metrics = { - RequestCount: this.loadBalancer.metricRequestCount(), - NewConnectionCount: this.loadBalancer.metricNewConnectionCount(), ActiveConnectionCount: this.loadBalancer.metricActiveConnectionCount(), - TargetResponseTime: this.loadBalancer - .metricTargetResponseTime({ - period: Duration.minutes(1), - unit: cloudwatch.Unit.MILLISECONDS, - statistic: 'avg', - }) - .with({ period: Duration.minutes(1) }), + NewConnectionCount: this.loadBalancer.metricNewConnectionCount(), RejectedConnectionCount: this.loadBalancer .metricRejectedConnectionCount({ period: Duration.minutes(1), statistic: 'sum', }) .with({ period: Duration.minutes(1) }), + RequestCount: this.loadBalancer.metricRequestCount(), + TargetResponseTime: this.loadBalancer + .metricTargetResponseTime({ + period: Duration.minutes(1), + statistic: 'avg', + unit: cloudwatch.Unit.MILLISECONDS, + }) + .with({ period: Duration.minutes(1) }), UnHealthyHostCount: appTargetGroup .metricUnhealthyHostCount({ period: Duration.minutes(1), @@ -149,31 +149,31 @@ class CacclLoadBalancer extends Construct { this.alarms = [ new cloudwatch.Alarm(this, 'TargetResponseTimeAlarm', { - metric: this.metrics.TargetResponseTime, - threshold: 1, - evaluationPeriods: 3, - treatMissingData: cloudwatch.TreatMissingData.IGNORE, alarmDescription: `${ Stack.of(this).stackName } load balancer target response time (TargetResponseTime)`, - }), - new cloudwatch.Alarm(this, 'RejectedConnectionsAlarm', { - metric: this.metrics.RejectedConnectionCount, + evaluationPeriods: 3, + metric: this.metrics.TargetResponseTime, threshold: 1, - evaluationPeriods: 1, treatMissingData: cloudwatch.TreatMissingData.IGNORE, + }), + new cloudwatch.Alarm(this, 'RejectedConnectionsAlarm', { alarmDescription: `${ Stack.of(this).stackName } load balancer rejected connections (RejectedConnectionCount)`, - }), - new cloudwatch.Alarm(this, 'UnhealthHostAlarm', { - metric: this.metrics.UnHealthyHostCount, + evaluationPeriods: 1, + metric: this.metrics.RejectedConnectionCount, threshold: 1, - evaluationPeriods: 3, treatMissingData: cloudwatch.TreatMissingData.IGNORE, + }), + new cloudwatch.Alarm(this, 'UnhealthHostAlarm', { alarmDescription: `${ Stack.of(this).stackName } target group unhealthy host count (UnHealthyHostCount)`, + evaluationPeriods: 3, + metric: this.metrics.UnHealthyHostCount, + threshold: 1, + treatMissingData: cloudwatch.TreatMissingData.IGNORE, }), ]; diff --git a/src/cdk/lib/classes/CacclMonitoring.ts b/src/cdk/lib/classes/CacclMonitoring.ts index 720a0e5..d0c07a2 100644 --- a/src/cdk/lib/classes/CacclMonitoring.ts +++ b/src/cdk/lib/classes/CacclMonitoring.ts @@ -1,16 +1,17 @@ +/* eslint-disable unicorn/consistent-destructuring */ import { - aws_cloudwatch as cloudwatch, - aws_elasticloadbalancingv2 as elb, CfnOutput, Stack, + aws_cloudwatch as cloudwatch, + aws_elasticloadbalancingv2 as elb, } from 'aws-cdk-lib'; import { Construct } from 'constructs'; // Import shared types +import { CacclMonitoringProps } from '../../../types/index.js'; import CacclDbBase from './CacclDbBase.js'; import CacclScheduledTasks from './CacclScheduledTasks.js'; -import { CacclMonitoringProps } from '../../../types/index.js'; class CacclMonitoring extends Construct { dashboard: cloudwatch.Dashboard; @@ -35,35 +36,35 @@ class CacclMonitoring extends Construct { const dashboardLink = `https://console.aws.amazon.com/cloudwatch/home?region=${this.region}#dashboards:name=${dashboardName}`; new CfnOutput(this, 'DashboardLink', { - value: dashboardLink, exportName: `${stackName}-cloudwatch-dashboard-link`, + value: dashboardLink, }); const lbLink = `https://console.aws.amazon.com/ec2/v2/home?region=${this.region}#LoadBalancers:tag:caccl_deploy_stack_name=${stackName}`; this.dashboard.addWidgets( new cloudwatch.TextWidget({ + height: 1, markdown: [ `### Load Balancer: [${loadBalancer.loadBalancerName}](${lbLink})`, '[Explanation of Metrics](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-cloudwatch-metrics.html)', ].join(' | '), width: 24, - height: 1, }), ); this.dashboard.addWidgets( new cloudwatch.GraphWidget({ - title: 'RequestCount', + height: 6, left: [cacclLoadBalancer.metrics.RequestCount], + title: 'RequestCount', width: 12, - height: 6, }), new cloudwatch.GraphWidget({ - title: 'TargetResponseTime', + height: 6, left: [cacclLoadBalancer.metrics.TargetResponseTime], + title: 'TargetResponseTime', width: 12, - height: 6, }), ); @@ -71,20 +72,20 @@ class CacclMonitoring extends Construct { new cloudwatch.AlarmStatusWidget({ alarms: cacclLoadBalancer.alarms, height: 6, - width: 8, title: 'Load Balancer Alarm States', + width: 8, }), new cloudwatch.GraphWidget({ - title: 'NewConnectionCount', + height: 6, left: [cacclLoadBalancer.metrics.NewConnectionCount], + title: 'NewConnectionCount', width: 8, - height: 6, }), new cloudwatch.GraphWidget({ - title: 'ActiveConnectionCount', + height: 6, left: [cacclLoadBalancer.metrics.ActiveConnectionCount], + title: 'ActiveConnectionCount', width: 8, - height: 6, }), ); @@ -92,8 +93,8 @@ class CacclMonitoring extends Construct { const metricName = `HTTP ${i}xx Count`; const httpCode = `TARGET_${i}XX_COUNT` as keyof typeof elb.HttpCodeTarget; return new cloudwatch.GraphWidget({ - title: metricName, left: [loadBalancer.metricHttpCodeTarget(elb.HttpCodeTarget[httpCode])], + title: metricName, }); }); this.dashboard.addWidgets(...httpCodeWidgets); @@ -102,20 +103,20 @@ class CacclMonitoring extends Construct { this.dashboard.addWidgets( new cloudwatch.TextWidget({ + height: 1, markdown: `### ECS Service: [${ecsService.serviceName}](${serviceLink})`, width: 24, - height: 1, }), ); const makeCIMetric = (metricName: string, extraProps = {}) => { const metric = new cloudwatch.Metric({ - metricName, - namespace: 'ECS/ContainerInsights', dimensionsMap: { ClusterName: ecsService.cluster.clusterName, ServiceName: ecsService.serviceName, }, + metricName, + namespace: 'ECS/ContainerInsights', ...extraProps, }); metric.attachTo(ecsService); @@ -124,31 +125,31 @@ class CacclMonitoring extends Construct { this.dashboard.addWidgets( new cloudwatch.GraphWidget({ - title: 'CPUUtilization', + height: 6, left: [ makeCIMetric('CpuUtilized', { unit: cloudwatch.Unit.PERCENT }), makeCIMetric('CpuReserved', { unit: cloudwatch.Unit.PERCENT }), ], + title: 'CPUUtilization', width: 12, - height: 6, }), new cloudwatch.GraphWidget({ - title: 'MemoryUtilization', + height: 6, left: [makeCIMetric('MemoryUtilized'), makeCIMetric('MemoryReserved')], + title: 'MemoryUtilization', width: 12, - height: 6, }), ); const servcieAlarmWidget = []; - if (cacclService.alarms.length) { + if (cacclService.alarms.length > 0) { servcieAlarmWidget.push( new cloudwatch.AlarmStatusWidget({ alarms: cacclService.alarms, - width: 8, height: 6, title: 'ECS Service Alarm States', + width: 8, }), ); } @@ -156,25 +157,26 @@ class CacclMonitoring extends Construct { this.dashboard.addWidgets( ...servcieAlarmWidget, new cloudwatch.GraphWidget({ - title: 'Storage Read/Write Bytes', + height: 6, left: [makeCIMetric('StorageReadBytes')], right: [makeCIMetric('StorageWriteBytes')], + title: 'Storage Read/Write Bytes', width: 12, - height: 6, }), new cloudwatch.GraphWidget({ - title: 'Tasks & Deployments', + height: 6, left: [ makeCIMetric('DesiredTaskCount'), makeCIMetric('PendingTaskCount'), makeCIMetric('RunningTaskCount'), ], right: [ecsService.metric('DeploymentCount')], + title: 'Tasks & Deployments', width: 12, - height: 6, }), ); + // eslint-disable-next-line unicorn/consistent-function-scoping const makeLogLink = (logGroup: string) => { const escapedLg = logGroup.split('/').join('$252F'); return `* [${logGroup}](https://console.aws.amazon.com/cloudwatch/home?region=${this.region}#logsV2:log-groups/log-group/${escapedLg})`; @@ -182,13 +184,13 @@ class CacclMonitoring extends Construct { this.dashboard.addWidgets( new cloudwatch.TextWidget({ + height: 4, markdown: [ '### Logs\n', makeLogLink(`/${stackName}/app`), makeLogLink(`/${stackName}/proxy`), ].join('\n'), width: 24, - height: 4, }), ); } @@ -198,52 +200,52 @@ class CacclMonitoring extends Construct { this.dashboard.addWidgets( new cloudwatch.TextWidget({ + height: 1, markdown: `### Database Cluster: [${ dbCluster.clusterIdentifier }](${db.getDashboardLink()})`, width: 24, - height: 1, }), ); this.dashboard.addWidgets( new cloudwatch.GraphWidget({ - title: 'Read/Write IOPS', + height: 6, left: db.metrics.ReadIOPS, right: db.metrics.WriteIOPS, + title: 'Read/Write IOPS', width: 12, - height: 6, }), new cloudwatch.GraphWidget({ - title: 'CPU & Memory', + height: 6, left: db.metrics.CPUUtilization, right: db.metrics.FreeableMemory, + title: 'CPU & Memory', width: 12, - height: 6, }), ); this.dashboard.addWidgets( new cloudwatch.GraphWidget({ - title: 'Read/Write Latency', + height: 6, left: db.metrics.ReadLatency, right: db.metrics.WriteLatency, + title: 'Read/Write Latency', width: 12, - height: 6, }), new cloudwatch.GraphWidget({ - title: 'Transactions/Queries', + height: 6, left: db.metrics.Transactions, right: db.metrics.Queries, + title: 'Transactions/Queries', width: 12, - height: 6, }), ); this.dashboard.addWidgets( new cloudwatch.AlarmStatusWidget({ alarms: db.alarms, - width: 24, height: 6, title: 'Database Alarm States', + width: 24, }), ); this.dashboard.addWidgets( @@ -268,38 +270,38 @@ class CacclMonitoring extends Construct { this.dashboard.addWidgets( new cloudwatch.TextWidget({ + height: 1, markdown: `### Scheduled Tasks Function: [${func.functionName}](${functionUrl})`, width: 24, - height: 1, }), ); this.dashboard.addWidgets( new cloudwatch.GraphWidget({ - title: 'Duration', + height: 6, left: [func.metricDuration()], + title: 'Duration', width: 8, - height: 6, }), new cloudwatch.GraphWidget({ - title: 'Invocations', + height: 6, left: [func.metricInvocations()], + title: 'Invocations', width: 8, - height: 6, }), new cloudwatch.GraphWidget({ - title: 'Errors', + height: 6, left: [func.metricErrors()], + title: 'Errors', width: 8, - height: 6, }), ); this.dashboard.addWidgets( new cloudwatch.AlarmStatusWidget({ alarms: scheduledTasks.alarms, - width: 24, height: 6, title: 'Scheduled Tasks Function Alarm States', + width: 24, }), ); } diff --git a/src/cdk/lib/classes/CacclNotifications.ts b/src/cdk/lib/classes/CacclNotifications.ts index eb10c1e..700a3e5 100644 --- a/src/cdk/lib/classes/CacclNotifications.ts +++ b/src/cdk/lib/classes/CacclNotifications.ts @@ -1,32 +1,32 @@ -import path, { dirname } from 'path'; -import { fileURLToPath } from 'url'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - import { - aws_sns as sns, + CfnOutput, + Stack, + aws_cloudwatch_actions as actions, aws_iam as iam, aws_lambda as lambda, - aws_cloudwatch_actions as actions, + aws_sns as sns, aws_sns_subscriptions as subscriptions, - CfnOutput, - Stack, } from 'aws-cdk-lib'; import { Construct } from 'constructs'; +import path, { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + import { CacclNotificationsProps } from '../../../types/index.js'; -class CacclNotifications extends Construct { - topic: sns.Topic; +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +class CacclNotifications extends Construct { subscriptions: sns.Subscription[]; + topic: sns.Topic; + constructor(scope: Construct, id: string, props: CacclNotificationsProps) { super(scope, id); const email = typeof props.email === 'string' ? [props.email] : props.email; - const { slack, service, loadBalancer, db } = props; + const { db, loadBalancer, service, slack } = props; this.topic = new sns.Topic(this, 'NotificationTopic', { displayName: `${Stack.of(this).stackName}-notifications`, @@ -37,26 +37,26 @@ class CacclNotifications extends Construct { }); if (email) { - email.forEach((emailAddr, idx) => { + for (const [idx, emailAddr] of email.entries()) { new sns.Subscription(this, `email-subscription-${idx}`, { - topic: this.topic, - protocol: sns.SubscriptionProtocol.EMAIL, endpoint: emailAddr, + protocol: sns.SubscriptionProtocol.EMAIL, + topic: this.topic, }); - }); + } } if (slack !== undefined) { const slackFunction = new lambda.Function(this, 'SlackFunction', { - functionName: `${Stack.of(this).stackName}-slack-notify`, - runtime: lambda.Runtime.PYTHON_3_8, - handler: 'notify.handler', code: lambda.Code.fromAsset( path.join(__dirname, '../../assets/slack_notify'), ), environment: { SLACK_WEBHOOK_URL: slack, }, + functionName: `${Stack.of(this).stackName}-slack-notify`, + handler: 'notify.handler', + runtime: lambda.Runtime.PYTHON_3_8, }); this.topic.addSubscription( @@ -64,17 +64,19 @@ class CacclNotifications extends Construct { ); } - loadBalancer.alarms.forEach((alarm) => { + for (const alarm of loadBalancer.alarms) { alarm.addAlarmAction(new actions.SnsAction(this.topic)); - }); + } - service.alarms.forEach((alarm) => { + for (const alarm of service.alarms) { alarm.addAlarmAction(new actions.SnsAction(this.topic)); - }); + } - db?.alarms.forEach((alarm) => { - alarm.addAlarmAction(new actions.SnsAction(this.topic)); - }); + if (db) { + for (const alarm of db.alarms) { + alarm.addAlarmAction(new actions.SnsAction(this.topic)); + } + } new CfnOutput(this, 'TopicName', { exportName: `${Stack.of(this).stackName}-sns-topic-name`, diff --git a/src/cdk/lib/classes/CacclRdsDb.ts b/src/cdk/lib/classes/CacclRdsDb.ts index 371813b..38d04b3 100644 --- a/src/cdk/lib/classes/CacclRdsDb.ts +++ b/src/cdk/lib/classes/CacclRdsDb.ts @@ -1,24 +1,23 @@ +/* eslint-disable camelcase */ // Import AWS CDK lib import { + Duration, + SecretValue, + Stack, aws_cloudwatch as cloudwatch, aws_ec2 as ec2, aws_ecs as ecs, aws_rds as rds, - Stack, - SecretValue, - Duration, } from 'aws-cdk-lib'; - // Import AWS constructs import { Construct } from 'constructs'; -// Import shared types -import CacclDbBase from './CacclDbBase.js'; import { CacclDbProps } from '../../../types/index.js'; - // Import constants import DEFAULT_AURORA_MYSQL_ENGINE_VERSION from '../constants/DEFAULT_AURORA_MYSQL_ENGINE_VERSION.js'; import DEFAULT_DB_INSTANCE_TYPE from '../constants/DEFAULT_DB_INSTANCE_TYPE.js'; +import CacclDbBase from './CacclDbBase.js'; +// Import shared types // Import classes @@ -28,20 +27,20 @@ class CacclRdsDb extends CacclDbBase { constructor(scope: Construct, id: string, props: CacclDbProps) { super(scope, id, props); - const { vpc, appEnv } = props; + const { appEnv, options, vpc } = props; const { + databaseName, + engineVersion = DEFAULT_AURORA_MYSQL_ENGINE_VERSION, instanceCount = 1, instanceType = DEFAULT_DB_INSTANCE_TYPE, - engineVersion = DEFAULT_AURORA_MYSQL_ENGINE_VERSION, - databaseName, - } = props.options; + } = options; /** * strangely the major version is not automatically derived from whatever * version string is used here. This just pulls it off the engineVersion string * e.g. '8.0.mysql_aurora.3.02.0' -> '8.0' */ - const majorVersion = engineVersion.substring(0, 3); + const majorVersion = engineVersion.slice(0, 3); const auroraMysqlEngineVersion = rds.DatabaseClusterEngine.auroraMysql({ version: rds.AuroraMysqlEngineVersion.of(engineVersion, majorVersion), }); @@ -52,7 +51,7 @@ class CacclRdsDb extends CacclDbBase { this.clusterParameterGroupParams.lower_case_table_names = '1'; // bin log filtering is baked in to aurora/mysql v8 - if (parseInt(majorVersion, 10) < 8) { + if (Number.parseInt(majorVersion, 10) < 8) { this.clusterParameterGroupParams.aurora_enable_repl_bin_log_filtering = '1'; } @@ -61,8 +60,8 @@ class CacclRdsDb extends CacclDbBase { this, 'ClusterParameterGroup', { - engine: auroraMysqlEngineVersion, description: `RDS parameter group for ${Stack.of(this).stackName}`, + engine: auroraMysqlEngineVersion, parameters: this.clusterParameterGroupParams, }, ); @@ -77,37 +76,37 @@ class CacclRdsDb extends CacclDbBase { this, 'InstanceParameterGroup', { - engine: auroraMysqlEngineVersion, description: `RDS instance parameter group for ${ Stack.of(this).stackName }`, + engine: auroraMysqlEngineVersion, parameters: this.instanceParameterGroupParams, }, ); this.dbCluster = new rds.DatabaseCluster(this, 'RdsDbCluster', { - engine: auroraMysqlEngineVersion, + backup: { + retention: Duration.days(14), + }, clusterIdentifier: `${Stack.of(this).stackName}-db-cluster`, credentials: { - username: 'root', password: SecretValue.secretsManager(this.dbPasswordSecret.secretArn), + username: 'root', }, - parameterGroup: clusterParameterGroup, - instances: instanceCount, defaultDatabaseName: databaseName, + engine: auroraMysqlEngineVersion, instanceProps: { - vpc, - instanceType: new ec2.InstanceType(instanceType), enablePerformanceInsights, + instanceType: new ec2.InstanceType(instanceType), parameterGroup: instanceParameterGroup, + securityGroups: [this.dbSg], + vpc, vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS, }, - securityGroups: [this.dbSg], - }, - backup: { - retention: Duration.days(14), }, + instances: instanceCount, + parameterGroup: clusterParameterGroup, removalPolicy: this.removalPolicy, }); @@ -133,103 +132,86 @@ class CacclRdsDb extends CacclDbBase { this.addSecurityGroupIngress(vpc.vpcCidrBlock); } - makeInstanceMetrics( - metricName: string, - extraProps = {}, - ): cloudwatch.Metric[] { - return this.dbCluster.instanceIdentifiers.map((id) => { - const metric = new cloudwatch.Metric({ - metricName, - namespace: this.metricNamespace, - dimensionsMap: { DBInstanceIdentifier: id }, - label: id, - ...extraProps, - }).with({ period: Duration.minutes(1) }); - - return metric.attachTo(this.dbCluster); - }); - } - createMetricsAndAlarms(): void { this.metrics = { - ReadIOPS: this.makeInstanceMetrics('ReadIOPS'), - WriteIOPS: this.makeInstanceMetrics('WriteIOPS'), - CPUUtilization: this.makeInstanceMetrics('CPUUtilization', { + BufferCacheHitRatio: this.makeInstanceMetrics('BufferCacheHitRatio', { unit: cloudwatch.Unit.PERCENT, }), - FreeableMemory: this.makeInstanceMetrics('FreeableMemory'), - BufferCacheHitRatio: this.makeInstanceMetrics('BufferCacheHitRatio', { + CPUUtilization: this.makeInstanceMetrics('CPUUtilization', { unit: cloudwatch.Unit.PERCENT, }), DatabaseConnections: this.makeInstanceMetrics('DatabaseConnections'), + DatabaseCursorsTimedOut: this.makeInstanceMetrics( + 'DatabaseCursorsTimedOut', + { statistic: 'sum' }, + ), DiskQueueDepth: this.makeInstanceMetrics('DiskQueueDepth'), + FreeableMemory: this.makeInstanceMetrics('FreeableMemory'), + Queries: this.makeInstanceMetrics('Queries'), + ReadIOPS: this.makeInstanceMetrics('ReadIOPS'), ReadLatency: this.makeInstanceMetrics('ReadLatency', { unit: cloudwatch.Unit.MILLISECONDS, }), + Transactions: this.makeInstanceMetrics('ActiveTransactions'), + WriteIOPS: this.makeInstanceMetrics('WriteIOPS'), WriteLatency: this.makeInstanceMetrics('WriteLatency', { unit: cloudwatch.Unit.MILLISECONDS, }), - DatabaseCursorsTimedOut: this.makeInstanceMetrics( - 'DatabaseCursorsTimedOut', - { statistic: 'sum' }, - ), - Transactions: this.makeInstanceMetrics('ActiveTransactions'), - Queries: this.makeInstanceMetrics('Queries'), }; this.alarms = [ ...this.metrics.ReadIOPS.map((metric: cloudwatch.Metric, idx: number) => { return new cloudwatch.Alarm(this, `CPUUtilizationAlarm-${idx}`, { - metric, - threshold: 50, - evaluationPeriods: 3, alarmDescription: `${Stack.of(this).stackName} ${ metric.label } cpu utilization alarm`, + evaluationPeriods: 3, + metric, + threshold: 50, }); }), ...this.metrics.BufferCacheHitRatio.map((metric, idx) => { return new cloudwatch.Alarm(this, `BufferCacheHitRatioAlarm-${idx}`, { - metric, - threshold: 90, - evaluationPeriods: 3, - comparisonOperator: - cloudwatch.ComparisonOperator.LESS_THAN_OR_EQUAL_TO_THRESHOLD, alarmDescription: `${Stack.of(this).stackName} ${ metric.label } buffer cache hit ratio alarm`, + comparisonOperator: + cloudwatch.ComparisonOperator.LESS_THAN_OR_EQUAL_TO_THRESHOLD, + evaluationPeriods: 3, + metric, + threshold: 90, }); }), ...this.metrics.DiskQueueDepth.map((metric, idx) => { return new cloudwatch.Alarm(this, `DiskQueueDepth-${idx}`, { - metric, - threshold: 1, - evaluationPeriods: 3, alarmDescription: `${Stack.of(this).stackName} ${ metric.label } disk queue depth`, + evaluationPeriods: 3, + metric, + threshold: 1, }); }), ...this.metrics.ReadLatency.map((metric, idx) => { return new cloudwatch.Alarm(this, `ReadLatency-${idx}`, { - metric, - threshold: 20, - evaluationPeriods: 3, - treatMissingData: cloudwatch.TreatMissingData.IGNORE, alarmDescription: `${Stack.of(this).stackName} ${ metric.label } read latency alarm`, + evaluationPeriods: 3, + metric, + threshold: 20, + treatMissingData: cloudwatch.TreatMissingData.IGNORE, }); }), ...this.metrics.WriteLatency.map((metric, idx) => { return new cloudwatch.Alarm(this, `WriteLatency-${idx}`, { - metric, - threshold: 100, - evaluationPeriods: 3, - treatMissingData: cloudwatch.TreatMissingData.IGNORE, alarmDescription: `${Stack.of(this).stackName} ${ metric.label } write latency alarm`, + evaluationPeriods: 3, + metric, + threshold: 100, + treatMissingData: cloudwatch.TreatMissingData.IGNORE, }); }), ...this.metrics.DatabaseCursorsTimedOut.map((metric, idx) => { @@ -237,12 +219,12 @@ class CacclRdsDb extends CacclDbBase { this, `DatabaseCursorsTimedOutAlarm-${idx}`, { - metric, - threshold: 1, - evaluationPeriods: 1, alarmDescription: `${Stack.of(this).stackName} ${ metric.label } cursors timed out alarm`, + evaluationPeriods: 1, + metric, + threshold: 1, }, ); }), @@ -254,6 +236,23 @@ class CacclRdsDb extends CacclDbBase { const dbClusterId = this.dbCluster.clusterIdentifier; return `https://console.aws.amazon.com/rds/home?region=${region}#database:id=${dbClusterId};is-cluster=true`; } + + makeInstanceMetrics( + metricName: string, + extraProps = {}, + ): cloudwatch.Metric[] { + return this.dbCluster.instanceIdentifiers.map((id) => { + const metric = new cloudwatch.Metric({ + dimensionsMap: { DBInstanceIdentifier: id }, + label: id, + metricName, + namespace: this.metricNamespace, + ...extraProps, + }).with({ period: Duration.minutes(1) }); + + return metric.attachTo(this.dbCluster); + }); + } } export default CacclRdsDb; diff --git a/src/cdk/lib/classes/CacclScheduledTasks.ts b/src/cdk/lib/classes/CacclScheduledTasks.ts index a57b8e5..cacbccd 100644 --- a/src/cdk/lib/classes/CacclScheduledTasks.ts +++ b/src/cdk/lib/classes/CacclScheduledTasks.ts @@ -1,67 +1,65 @@ // Import NodeJS libs -import path, { dirname } from 'path'; -import { fileURLToPath } from 'url'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - -// Import AWS CDK lib import { + CfnOutput, + Duration, + Stack, aws_cloudwatch as cloudwatch, aws_ec2 as ec2, aws_events as events, - aws_events_targets as targets, aws_iam as iam, aws_lambda as lambda, - CfnOutput, - Stack, - Duration, + aws_events_targets as targets, } from 'aws-cdk-lib'; - // Import AWS constructs import { Construct } from 'constructs'; +import path, { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +// Import AWS CDK lib // Import shared types import { CacclScheduledTasksProps } from '../../../types/index.js'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + // TODO: JSDOC class CacclScheduledTasks extends Construct { - taskExecFunction: lambda.Function; + alarms: cloudwatch.Alarm[] = []; eventRules: events.Rule[] = []; - alarms: cloudwatch.Alarm[] = []; + taskExecFunction: lambda.Function; constructor(scope: Construct, id: string, props: CacclScheduledTasksProps) { super(scope, id); - const { stackName, region, account } = Stack.of(this); + const { account, region, stackName } = Stack.of(this); - const { clusterName, serviceName, taskDefinition, vpc, scheduledTasks } = + const { clusterName, scheduledTasks, serviceName, taskDefinition, vpc } = props; this.taskExecFunction = new lambda.Function( this, 'ScheduledTaskExecFunction', { - functionName: `${stackName}-scheduled-task-exec`, - runtime: lambda.Runtime.NODEJS_12_X, - handler: 'index.handler', code: lambda.Code.fromAsset( path.join(__dirname, '../../assets/scheduled_task_exec'), ), - vpc, - vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, environment: { ECS_CLUSTER: clusterName, ECS_SERVICE: serviceName, ECS_TASK_DEFINITION: taskDefinition.family, }, + functionName: `${stackName}-scheduled-task-exec`, + handler: 'index.handler', + runtime: lambda.Runtime.NODEJS_12_X, + vpc, + vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, }, ); // create a cloudwatch event rule for each configured task - Object.keys(scheduledTasks).forEach((scheduledTaskId) => { + for (const scheduledTaskId of Object.keys(scheduledTasks)) { const scheduledTask = scheduledTasks[scheduledTaskId]; // the target is always our lambda function, but with variable commands to execute the task with // e.g., "python manage.py some-recurring-job" @@ -79,20 +77,20 @@ class CacclScheduledTasks extends Construct { this, `ScheduledTaskEventRule${scheduledTaskId}`, { + description: scheduledTask.description, ruleName, schedule, targets: [eventTarget], - description: scheduledTask.description, }, ); this.eventRules.push(eventRule); - }); + } // function needs to read various ecs stuff this.taskExecFunction.addToRolePolicy( new iam.PolicyStatement({ - effect: iam.Effect.ALLOW, actions: ['ecs:Describe*', 'ecs:List*'], + effect: iam.Effect.ALLOW, resources: ['*'], }), ); @@ -100,8 +98,8 @@ class CacclScheduledTasks extends Construct { // function needs to be able to run our task this.taskExecFunction.addToRolePolicy( new iam.PolicyStatement({ - effect: iam.Effect.ALLOW, actions: ['ecs:RunTask'], + effect: iam.Effect.ALLOW, resources: [ `arn:aws:ecs:${region}:${account}:task-definition/${taskDefinition.family}`, ], @@ -113,10 +111,11 @@ class CacclScheduledTasks extends Construct { if (taskDefinition.executionRole) { passRoleArns.push(taskDefinition.executionRole.roleArn); } + this.taskExecFunction.addToRolePolicy( new iam.PolicyStatement({ - effect: iam.Effect.ALLOW, actions: ['iam:PassRole'], + effect: iam.Effect.ALLOW, resources: passRoleArns, }), ); @@ -124,22 +123,22 @@ class CacclScheduledTasks extends Construct { this.alarms = [ // alarm on any function errors new cloudwatch.Alarm(this, 'ErrorAlarm', { + alarmDescription: `${stackName} scheduled task execution error alarm`, + evaluationPeriods: 1, metric: this.taskExecFunction .metricErrors() .with({ period: Duration.minutes(5) }), threshold: 1, - evaluationPeriods: 1, - alarmDescription: `${stackName} scheduled task execution error alarm`, }), // alarm if function isn't invoked at least once per day new cloudwatch.Alarm(this, 'InvocationsAlarm', { + alarmDescription: `${stackName} no invocations alarm`, + comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD, + evaluationPeriods: 1, metric: this.taskExecFunction .metricInvocations() .with({ period: Duration.days(1) }), threshold: 1, - evaluationPeriods: 1, - alarmDescription: `${stackName} no invocations alarm`, - comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD, }), ]; diff --git a/src/cdk/lib/classes/CacclService.ts b/src/cdk/lib/classes/CacclService.ts index e5d8368..f18c8d9 100644 --- a/src/cdk/lib/classes/CacclService.ts +++ b/src/cdk/lib/classes/CacclService.ts @@ -1,12 +1,11 @@ // Import AWS CDK lib import { + CfnOutput, + Stack, aws_cloudwatch as cloudwatch, aws_ec2 as ec2, aws_ecs as ecs, - CfnOutput, - Stack, } from 'aws-cdk-lib'; - // Import AWS constructs import { Construct } from 'constructs'; @@ -14,43 +13,43 @@ import { Construct } from 'constructs'; import { CacclServiceProps } from '../../../types/index.js'; class CacclService extends Construct { - loadBalancerTarget: ecs.IEcsLoadBalancerTarget; + alarms: cloudwatch.Alarm[]; ecsService: ecs.FargateService; - alarms: cloudwatch.Alarm[]; + loadBalancerTarget: ecs.IEcsLoadBalancerTarget; constructor(scope: Construct, id: string, props: CacclServiceProps) { super(scope, id); const { cluster, - taskDef, - taskCount, - loadBalancerSg, enableExecuteCommand = false, + loadBalancerSg, + taskCount, + taskDef, } = props; const serviceSg = new ec2.SecurityGroup(this, 'SecurityGroup', { - vpc: cluster.vpc, description: 'ecs service security group', + vpc: cluster.vpc, }); // Load balancer to tasks serviceSg.connections.allowFrom(loadBalancerSg, ec2.Port.tcp(443)); this.ecsService = new ecs.FargateService(this, 'FargateService', { - cluster, - securityGroups: [serviceSg], - platformVersion: ecs.FargatePlatformVersion.VERSION1_4, - taskDefinition: taskDef.taskDef, - desiredCount: taskCount, - minHealthyPercent: 100, - maxHealthyPercent: 200, circuitBreaker: { rollback: true, }, - propagateTags: ecs.PropagatedTagSource.SERVICE, + cluster, + desiredCount: taskCount, enableExecuteCommand, + maxHealthyPercent: 200, + minHealthyPercent: 100, + platformVersion: ecs.FargatePlatformVersion.VERSION1_4, + propagateTags: ecs.PropagatedTagSource.SERVICE, + securityGroups: [serviceSg], + taskDefinition: taskDef.taskDef, }); // this is the thing that gets handed off to the load balancer diff --git a/src/cdk/lib/classes/CacclSshBastion.ts b/src/cdk/lib/classes/CacclSshBastion.ts index a0246e2..b65f1ba 100644 --- a/src/cdk/lib/classes/CacclSshBastion.ts +++ b/src/cdk/lib/classes/CacclSshBastion.ts @@ -1,9 +1,8 @@ -import { aws_ec2 as ec2, Stack, CfnOutput } from 'aws-cdk-lib'; +import { CfnOutput, Stack, aws_ec2 as ec2 } from 'aws-cdk-lib'; import { Construct } from 'constructs'; // Import shared types import { CacclSshBastionProps } from '../../../types/index.js'; - // Import constants import DEFAULT_AMI_MAP from '../constants/DEFAULT_AMI_MAP.js'; @@ -13,14 +12,14 @@ class CacclSshBastion extends Construct { constructor(scope: Construct, id: string, props: CacclSshBastionProps) { super(scope, id); - const { vpc, sg } = props; + const { sg, vpc } = props; this.instance = new ec2.BastionHostLinux(this, 'SshBastionHost', { - vpc, - subnetSelection: { subnetType: ec2.SubnetType.PUBLIC }, instanceName: `${Stack.of(this).stackName}-bastion`, - securityGroup: sg, machineImage: ec2.MachineImage.genericLinux(DEFAULT_AMI_MAP), + securityGroup: sg, + subnetSelection: { subnetType: ec2.SubnetType.PUBLIC }, + vpc, }); new CfnOutput(this, 'DbBastionHostIp', { diff --git a/src/cdk/lib/classes/CacclTaskDef.ts b/src/cdk/lib/classes/CacclTaskDef.ts index 2bb0509..2d9fd88 100644 --- a/src/cdk/lib/classes/CacclTaskDef.ts +++ b/src/cdk/lib/classes/CacclTaskDef.ts @@ -1,46 +1,46 @@ // Import AWS CDK lib import { + CfnOutput, + RemovalPolicy, + Stack, aws_ecs as ecs, aws_logs as logs, - Stack, - RemovalPolicy, - CfnOutput, } from 'aws-cdk-lib'; - // Import AWS constructs import { Construct } from 'constructs'; -// Import shared types -import CacclContainerImage from './CacclContainerImage.js'; -import CacclGitRepoVolumeContainer from './CacclGitRepoVolumeContainer.js'; import { CacclTaskDefProps } from '../../../types/index.js'; - // Import constants import DEFAULT_PROXY_REPO_NAME from '../constants/DEFAULT_PROXY_REPO_NAME.js'; +import CacclContainerImage from './CacclContainerImage.js'; +// Import shared types +import CacclGitRepoVolumeContainer from './CacclGitRepoVolumeContainer.js'; // Import classes class CacclTaskDef extends Construct { - taskDef: ecs.FargateTaskDefinition; + appContainer: ecs.ContainerDefinition; appOnlyTaskDef: ecs.FargateTaskDefinition; - proxyContainer: ecs.ContainerDefinition; + logGroup: logs.LogGroup; - appContainer: ecs.ContainerDefinition; + proxyContainer: ecs.ContainerDefinition; - logGroup: logs.LogGroup; + taskDef: ecs.FargateTaskDefinition; constructor(scope: Construct, id: string, props: CacclTaskDefProps) { super(scope, id); const { + appEnvironment, appImage, + gitRepoVolume, + logRetentionDays = 90, proxyImage = `${DEFAULT_PROXY_REPO_NAME}:latest`, - appEnvironment, taskCpu = 256, // in cpu units; 256 == .25 vCPU taskMemory = 512, // in MiB - logRetentionDays = 90, + vpcCidrBlock, } = props; const appContainerImage = new CacclContainerImage(this, 'AppImage', { @@ -61,19 +61,19 @@ class CacclTaskDef extends Construct { // params for the fargate service's app container const appContainerParams = { - image: appContainerImage.image, - taskDefinition: this.taskDef, // using the standard task def - essential: true, environment: appEnvironment?.env, - secrets: appEnvironment?.secrets, + essential: true, + image: appContainerImage.image, logging: ecs.LogDriver.awsLogs({ - streamPrefix: 'app', logGroup: new logs.LogGroup(this, 'AppLogGroup', { logGroupName: `/${Stack.of(this).stackName}/app`, removalPolicy: RemovalPolicy.DESTROY, retention: logRetentionDays, }), + streamPrefix: 'app', }), + secrets: appEnvironment?.secrets, + taskDefinition: this.taskDef, // using the standard task def }; // the container definition associated with our fargate service task def @@ -113,26 +113,26 @@ class CacclTaskDef extends Construct { * because of how the value can't come with the * rest of the task def configuration */ - if (props.vpcCidrBlock !== undefined) { - environment.VPC_CIDR = props.vpcCidrBlock; - } else { + if (vpcCidrBlock === undefined) { throw new Error('proxy contianer environment needs the vpc cidr!'); + } else { + environment.VPC_CIDR = vpcCidrBlock; } // this container is the proxy this.proxyContainer = new ecs.ContainerDefinition(this, 'ProxyContainer', { - image: proxyContainerImage.image, environment, essential: true, - taskDefinition: this.taskDef, + image: proxyContainerImage.image, logging: ecs.LogDriver.awsLogs({ - streamPrefix: 'proxy', logGroup: new logs.LogGroup(this, 'ProxyLogGroup', { logGroupName: `/${Stack.of(this).stackName}/proxy`, removalPolicy: RemovalPolicy.DESTROY, retention: logRetentionDays, }), + streamPrefix: 'proxy', }), + taskDefinition: this.taskDef, }); this.proxyContainer.addPortMappings({ @@ -158,8 +158,8 @@ class CacclTaskDef extends Construct { * a repo into a configured mount point. the repo can be private, in which case the url would need * to include the user:pass info, therefore the repo url value has to come from secrets manager */ - if (props.gitRepoVolume) { - const { repoUrlSecretArn, appContainerPath } = props.gitRepoVolume; + if (gitRepoVolume) { + const { appContainerPath, repoUrlSecretArn } = gitRepoVolume; if (repoUrlSecretArn === undefined) { throw new Error( @@ -174,10 +174,10 @@ class CacclTaskDef extends Construct { } new CacclGitRepoVolumeContainer(this, 'VolumeContainer', { - repoUrlSecretArn, + appContainer: this.appContainer, appContainerPath, + repoUrlSecretArn, taskDefinition: this.taskDef, - appContainer: this.appContainer, }); } } diff --git a/src/cdk/lib/constants/DEFAULT_AURORA_MYSQL_ENGINE_VERSION.ts b/src/cdk/lib/constants/DEFAULT_AURORA_MYSQL_ENGINE_VERSION.ts index 2e467b7..d81cf49 100644 --- a/src/cdk/lib/constants/DEFAULT_AURORA_MYSQL_ENGINE_VERSION.ts +++ b/src/cdk/lib/constants/DEFAULT_AURORA_MYSQL_ENGINE_VERSION.ts @@ -1,5 +1,5 @@ /** - * + * */ const DEFAULT_AURORA_MYSQL_ENGINE_VERSION = '5.7.mysql_aurora.2.11.2'; // current LTS diff --git a/src/cdk/lib/helpers/createDbConstruct.ts b/src/cdk/lib/helpers/createDbConstruct.ts index f5d7baa..a38f626 100644 --- a/src/cdk/lib/helpers/createDbConstruct.ts +++ b/src/cdk/lib/helpers/createDbConstruct.ts @@ -3,7 +3,6 @@ import { Construct } from 'constructs'; // Import shared types import { CacclDbProps } from '../../../types/index.js'; - // Import classes import CacclDocDb from '../classes/CacclDocDb.js'; import CacclRdsDb from '../classes/CacclRdsDb.js'; @@ -18,12 +17,17 @@ import CacclRdsDb from '../classes/CacclRdsDb.js'; const createDbConstruct = (scope: Construct, props: CacclDbProps) => { const { options } = props; switch (options.engine.toLowerCase()) { - case 'docdb': + case 'docdb': { return new CacclDocDb(scope, 'DocDb', props); - case 'mysql': + } + + case 'mysql': { return new CacclRdsDb(scope, 'RdsDb', props); - default: - throw Error(`Invalid dbOptions.engine value: ${options.engine}`); + } + + default: { + throw new Error(`Invalid dbOptions.engine value: ${options.engine}`); + } } }; diff --git a/src/commands/apps.ts b/src/commands/apps.ts index 9dcb2d3..39b6893 100644 --- a/src/commands/apps.ts +++ b/src/commands/apps.ts @@ -1,19 +1,16 @@ // Import oclif import { Flags } from '@oclif/core'; - // Import table import { table } from 'table'; // Import aws import { getAppList, getCfnStacks } from '../aws/index.js'; - // Import base command import { BaseCommand } from '../base.js'; - // Import deploy config import DeployConfig from '../deployConfig/index.js'; - +// eslint-disable-next-line no-use-before-define export default class Apps extends BaseCommand { static override description = 'list available app configurations'; @@ -24,24 +21,25 @@ export default class Apps extends BaseCommand { static override flags = { 'full-status': Flags.boolean({ - char: 'f', aliases: ['full-status', 'f'], + char: 'f', default: false, - description: 'show the full status of each app including CFN stack and config state', + description: + 'show the full status of each app including CFN stack and config state', }), }; public async run(): Promise { // Destructure flags const { - 'ssm-root-prefix': ssmRootPrefix, 'cfn-stack-prefix': cfnStackPrefix, 'full-status': fullStatus, + 'ssm-root-prefix': ssmRootPrefix, } = this.flags; const apps = await getAppList(ssmRootPrefix); - if (!apps.length) { + if (apps.length === 0) { this.exitWithError( `No app configurations found using ssm root prefix ${ssmRootPrefix}`, ); @@ -50,8 +48,7 @@ export default class Apps extends BaseCommand { const appData: Record = {}; const tableColumns = ['App']; - for (let i = 0; i < apps.length; i++) { - const app = apps[i]; + for (const app of apps) { appData[app] = []; } @@ -64,8 +61,7 @@ export default class Apps extends BaseCommand { ); const cfnStacks = await getCfnStacks(cfnStackPrefix); - for (let i = 0; i < apps.length; i++) { - const app = apps[i]; + for (const app of apps) { const cfnStackName = this.getCfnStackName(app); const appPrefix = this.getAppPrefix(app); @@ -95,8 +91,9 @@ export default class Apps extends BaseCommand { if (cfnStackDeployConfigHashOutput) { const deployConfigHash = DeployConfig.toHash(deployConfig); const cfnOutputValue = cfnStackDeployConfigHashOutput.OutputValue; - configDrift = cfnOutputValue !== deployConfigHash ? 'yes' : 'no'; + configDrift = cfnOutputValue === deployConfigHash ? 'no' : 'yes'; } + appData[app].push(cfnStack.StackStatus, configDrift); const cfnStackCacclDeployVersion = cfnStack.Outputs.find((o) => { @@ -105,6 +102,7 @@ export default class Apps extends BaseCommand { appData[app].push(cfnStackCacclDeployVersion?.OutputValue ?? 'N/A'); } } + const tableData = Object.keys(appData).map((app) => { return [app, ...appData[app]]; }); diff --git a/src/commands/connect.ts b/src/commands/connect.ts index 5beade3..b4f2d45 100644 --- a/src/commands/connect.ts +++ b/src/commands/connect.ts @@ -1,8 +1,6 @@ -import { Flags } from '@oclif/core' - -import yn from 'yn'; +import { Flags } from '@oclif/core'; import untildify from 'untildify'; - +import yn from 'yn'; import { EC2_INSTANCE_CONNECT_USER, @@ -10,61 +8,60 @@ import { resolveSecret, sendSSHPublicKey, } from '../aws/index.js'; - // Import base command import { BaseCommand } from '../base.js'; - +// eslint-disable-next-line no-use-before-define export default class Connect extends BaseCommand { - static override description = "connect to an app's peripheral services (db, redis, etc)"; + static override description = + "connect to an app's peripheral services (db, redis, etc)"; - static override examples = [ - '<%= config.bin %> <%= command.id %>', - ] + static override examples = ['<%= config.bin %> <%= command.id %>']; static override flags = { 'app': Flags.string({ char: 'a', - required: true, description: 'name of the app to work with', + required: true, }), 'list': Flags.boolean({ char: 'l', default: false, description: 'list the things to connect to', }), - 'service': Flags.string({ - char: 's', - description: 'service to connect to; use `--list` to see what is available', - required: true, + 'local-port': Flags.string({ + description: 'attach tunnel to a non-default local port', }), 'public-key': Flags.string({ char: 'k', - description: 'path to the ssh public key file to use', default: untildify('~/.ssh/id_rsa.pub'), - }), - 'local-port': Flags.string({ - description: 'attach tunnel to a non-default local port', + description: 'path to the ssh public key file to use', }), 'quiet': Flags.boolean({ char: 'q', - description: 'output only the ssh tunnel command', default: false, + description: 'output only the ssh tunnel command', + }), + 'service': Flags.string({ + char: 's', + description: + 'service to connect to; use `--list` to see what is available', + required: true, }), 'sleep': Flags.string({ char: 'S', - description: 'keep the tunnel alive for this long without activity', default: '60', + description: 'keep the tunnel alive for this long without activity', }), - } + }; public async run(): Promise { // Destructure flags const { + list, 'local-port': localPortFlag, 'public-key': publicKey, quiet, - list, service, sleep, } = this.flags; @@ -78,12 +75,13 @@ export default class Connect extends BaseCommand { const deployConfig = await this.getDeployConfig(assumedRole); const services = new Set(); - ['dbOptions' as const, 'cacheOptions' as const].forEach((optsKey) => { + for (const optsKey of ['dbOptions' as const, 'cacheOptions' as const]) { const serviceOptions = deployConfig[optsKey]; if (serviceOptions) { services.add(serviceOptions.engine); } - }); + } + if (yn(deployConfig.docDb)) { this.exitWithError( [ @@ -94,7 +92,9 @@ export default class Connect extends BaseCommand { } if (list) { - this.exitWithSuccess(['Valid `--service=` options:', ...services].join('\n ')); + this.exitWithSuccess( + ['Valid `--service=` options:', ...services].join('\n '), + ); } if (!services.has(service)) { @@ -104,8 +104,14 @@ export default class Connect extends BaseCommand { const cfnStackName = this.getCfnStackName(); const cfnStackExports = await getCfnStackExports(cfnStackName); - const { bastionHostAz, bastionHostId, bastionHostIp, dbPasswordSecretArn } = - cfnStackExports; + const { + bastionHostAz, + bastionHostId, + bastionHostIp, + cacheEndpoint, + dbClusterEndpoint, + dbPasswordSecretArn, + } = cfnStackExports; try { await sendSSHPublicKey({ @@ -113,11 +119,11 @@ export default class Connect extends BaseCommand { instanceId: bastionHostId, sshKeyPath: publicKey, }); - } catch (err) { + } catch (error) { const message = - err instanceof Error - ? err.message - : `Could not send SSH public key: ${err}`; + error instanceof Error + ? error.message + : `Could not send SSH public key: ${error}`; this.exitWithError(message); } @@ -125,8 +131,8 @@ export default class Connect extends BaseCommand { let localPort; let clientCommand; - if (['mysql', 'docdb'].includes(service)) { - endpoint = cfnStackExports.dbClusterEndpoint; + if (['docdb', 'mysql'].includes(service)) { + endpoint = dbClusterEndpoint; const password = await resolveSecret(dbPasswordSecretArn); if (service === 'mysql') { localPort = localPortFlag || '3306'; @@ -138,7 +144,7 @@ export default class Connect extends BaseCommand { clientCommand = `mongo ${tlsOpts} --username root --password ${password} --port ${localPort}`; } } else if (service === 'redis') { - endpoint = cfnStackExports.cacheEndpoint; + endpoint = cacheEndpoint; localPort = localPortFlag || '6379'; clientCommand = `redis-cli -p ${localPort}`; } else { diff --git a/src/commands/delete.ts b/src/commands/delete.ts index d59d831..419f5ff 100644 --- a/src/commands/delete.ts +++ b/src/commands/delete.ts @@ -1,44 +1,35 @@ // Import oclif -import { Flags } from '@oclif/core' - -// Import base command -import { BaseCommand } from '../base.js'; +import { Flags } from '@oclif/core'; // Import aws helpers import { cfnStackExists } from '../aws/index.js'; - +// Import base command +import { BaseCommand } from '../base.js'; // Import config prompts import { confirm, confirmProductionOp } from '../configPrompts/index.js'; - // Import deploy config import DeployConfig from '../deployConfig/index.js'; - // Import errors import AppNotFound from '../shared/errors/AppNotFound.js'; - +// eslint-disable-next-line no-use-before-define export default class Delete extends BaseCommand { static override description = 'delete an app configuration'; - static override examples = [ - '<%= config.bin %> <%= command.id %>', - ] + static override examples = ['<%= config.bin %> <%= command.id %>']; static override flags = { - 'app': Flags.string({ + app: Flags.string({ char: 'a', - required: true, description: 'name of the app to work with', + required: true, }), - } + }; public async run(): Promise { // Destructure flags - const { - app, - yes, - } = this.flags; - + const { app, yes } = this.flags; + const cfnStackName = this.getCfnStackName(); if (await cfnStackExists(cfnStackName)) { this.exitWithError( @@ -55,6 +46,7 @@ export default class Delete extends BaseCommand { if (!(yes || (await confirm('Are you sure?')))) { this.exitWithSuccess(); } + // extra confirm if this is a production deployment if (!(await confirmProductionOp(yes))) { this.exitWithSuccess(); @@ -63,8 +55,8 @@ export default class Delete extends BaseCommand { await DeployConfig.wipeExisting(this.getAppPrefix(), false); this.exitWithSuccess(`${app} configuration deleted`); - } catch (err) { - if (err instanceof AppNotFound) { + } catch (error) { + if (error instanceof AppNotFound) { this.exitWithError(`${app} app configuration not found!`); } } diff --git a/src/commands/exec.ts b/src/commands/exec.ts index 4dc71b1..623a007 100644 --- a/src/commands/exec.ts +++ b/src/commands/exec.ts @@ -1,18 +1,15 @@ // Import oclif import { Flags } from '@oclif/core'; -import { BaseCommand } from '../base.js'; - // Import aws import { execTask, getCfnStackExports } from '../aws/index.js'; - +import { BaseCommand } from '../base.js'; import { confirmProductionOp } from '../configPrompts/index.js'; - // TODO: pull out into type (also in execTask) type EnvVariable = { - name: string, - value: string, + name: string; + value: string; }; // TODO: pull out into helper @@ -20,47 +17,43 @@ const envVarParser = (inputs: string[] | undefined): EnvVariable[] => { if (!inputs) { return []; } + return inputs.map((envVar: string): EnvVariable => { const [key, value] = envVar.split('='); return { name: key, - value: value, + value, }; }); }; +// eslint-disable-next-line no-use-before-define export default class Exec extends BaseCommand { static override description = 'execute a one-off task using the app image'; - static override examples = [ - '<%= config.bin %> <%= command.id %>', - ]; + static override examples = ['<%= config.bin %> <%= command.id %>']; static override flags = { - name: Flags.string({char: 'n', description: 'name to print'}), - 'app': Flags.string({ + app: Flags.string({ char: 'a', - required: true, description: 'name of the app to work with', + required: true, }), - 'command': Flags.string({ + command: Flags.string({ char: 'c', description: 'the app task command to run', required: true, }), - 'env': Flags.string({ + env: Flags.string({ char: 'e', description: 'add or override container environment variables', multiple: true, - }) - } + }), + name: Flags.string({ char: 'n', description: 'name to print' }), + }; public async run(): Promise { - const { - command, - env, - yes, - } = this.flags; + const { command, env, yes } = this.flags; const cfnStackName = this.getCfnStackName(); const { appOnlyTaskDefName, clusterName, serviceName } = @@ -70,21 +63,20 @@ export default class Exec extends BaseCommand { if (!yes && !(await this.stackVersionDiffCheck())) { this.exitWithSuccess(); } + if (!(await confirmProductionOp(yes))) { this.exitWithSuccess(); } this.log( - `Running command '${ - command - }' on service ${serviceName} using task def ${appOnlyTaskDefName}`, + `Running command '${command}' on service ${serviceName} using task def ${appOnlyTaskDefName}`, ); const taskArn = await execTask({ clusterName, + command, + environment: envVarParser(env), serviceName, taskDefName: appOnlyTaskDefName, - command: command, - environment: envVarParser(env), }); this.exitWithSuccess(`Task ${taskArn} started`); } diff --git a/src/commands/images.ts b/src/commands/images.ts index 99d46b6..02e93f7 100644 --- a/src/commands/images.ts +++ b/src/commands/images.ts @@ -1,56 +1,53 @@ -// Import aws SDK -import { ECR } from 'aws-sdk'; - // Import oclif -import { Flags } from '@oclif/core' - +import { Flags } from '@oclif/core'; +// Import AWS SDK +import { ECR } from 'aws-sdk'; // Import moment import moment from 'moment'; - // Import table import { table } from 'table'; +// Import AWS +import { + createEcrArn, + getCurrentRegion, + getRepoImageList, +} from '../aws/index.js'; // Import base command import { BaseCommand } from '../base.js'; -// Import aws helpers -import { createEcrArn, getCurrentRegion, getRepoImageList } from '../aws/index.js'; - -// Import helpers -import looksLikeSemver from '../shared/helpers/looksLikeSemver.js'; - +// eslint-disable-next-line no-use-before-define export default class Images extends BaseCommand { - static override description = 'list the most recent available ECR images for an app'; + static override description = + 'list the most recent available ECR images for an app'; - static override examples = [ - '<%= config.bin %> <%= command.id %>', - ]; + static override examples = ['<%= config.bin %> <%= command.id %>']; static override flags = { - 'repo': Flags.string({ - char: 'r', - required: true, - description: 'the name of the ECR repo; use `caccl-deploy app repos` for available repos', - }), - 'all': Flags.boolean({ + all: Flags.boolean({ char: 'a', - description: 'show all images; default is to show only semver-tagged releases', default: false, + description: + 'show all images; default is to show only semver-tagged releases', + }), + repo: Flags.string({ + char: 'r', + description: + 'the name of the ECR repo; use `caccl-deploy app repos` for available repos', + required: true, }), }; public async run(): Promise { // Destructure flags - const { - all, - repo, - } = this.flags; - + const { all, repo } = this.flags; + const assumedRole = this.getAssumedRole(); // see the README section on cross-account ECR access if (this.ecrAccessRoleArn !== undefined) { assumedRole.setAssumedRoleArn(this.ecrAccessRoleArn); } + const images = await getRepoImageList(assumedRole, repo, all); const region = getCurrentRegion(); @@ -69,24 +66,25 @@ export default class Images extends BaseCommand { */ const imageArns = tags .reduce((collect: string[], t) => { - collect.push( - createEcrArn({ - repoName: repo, - imageTag: t, - account, - region, - }), - ); + collect.push( + createEcrArn({ + account, + imageTag: t, + region, + repoName: repo, + }), + ); return collect; }, []) .join('\n'); return [moment(image.imagePushedAt).format(), imageTags, imageArns]; }); - if (data.length) { + if (data.length > 0) { const tableOutput = table([['Pushed On', 'Tags', 'ARNs'], ...data]); this.exitWithSuccess(tableOutput); } + this.exitWithError('No images found'); } } diff --git a/src/commands/new.ts b/src/commands/new.ts index 017039c..96fa040 100644 --- a/src/commands/new.ts +++ b/src/commands/new.ts @@ -1,49 +1,40 @@ // Import chalk +import { Flags } from '@oclif/core'; import chalk from 'chalk'; - // Import figlet import figlet from 'figlet'; // Import oclif -import { Flags } from '@oclif/core' // Import aws -import { - cfnStackExists, - getAppList, -} from '../aws/index.js'; - +import { cfnStackExists, getAppList } from '../aws/index.js'; // Import base command import { BaseCommand } from '../base.js'; - // Import config prompts import { confirm, confirmProductionOp, promptAppName, } from '../configPrompts/index.js'; - // Import deploy config import DeployConfig from '../deployConfig/index.js'; - // Import errors import NoPromptChoices from '../shared/errors/NoPromptChoices.js'; import UserCancel from '../shared/errors/UserCancel.js'; - +// eslint-disable-next-line no-use-before-define export default class New extends BaseCommand { - static override description = 'create a new app deploy config via import and/or prompts'; + static override description = + 'create a new app deploy config via import and/or prompts'; - static override examples = [ - '<%= config.bin %> <%= command.id %>', - ]; + static override examples = ['<%= config.bin %> <%= command.id %>']; static override flags = { - 'app': Flags.string({ + app: Flags.string({ char: 'a', description: 'name of the app to work with', }), - 'import': Flags.string({ + import: Flags.string({ char: 'i', description: 'import new deploy config from a json file or URL', }), @@ -52,9 +43,9 @@ export default class New extends BaseCommand { public async run(): Promise { // Destructure flags const { - 'ssm-root-prefix': ssmRootPrefix, app, - 'import': importFlag, + import: importFlag, + 'ssm-root-prefix': ssmRootPrefix, yes, } = this.flags; @@ -62,16 +53,18 @@ export default class New extends BaseCommand { if (this.ecrAccessRoleArn !== undefined) { assumedRole.setAssumedRoleArn(this.ecrAccessRoleArn); } + const existingApps = await getAppList(ssmRootPrefix); let appName; try { appName = app || (await promptAppName()); - } catch (err) { - if (err instanceof UserCancel) { + } catch (error) { + if (error instanceof UserCancel) { this.exitWithSuccess(); } - throw err; + + throw error; } const appPrefix = this.getAppPrefix(appName); @@ -88,6 +81,7 @@ export default class New extends BaseCommand { if (!(await confirmProductionOp(yes))) { this.exitWithSuccess(); } + await DeployConfig.wipeExisting(appPrefix); } else { this.exitWithSuccess(); @@ -109,18 +103,19 @@ export default class New extends BaseCommand { let deployConfig; try { deployConfig = await DeployConfig.generate(assumedRole, importedConfig); - } catch (err) { - if (err instanceof UserCancel) { + } catch (error) { + if (error instanceof UserCancel) { this.exitWithSuccess(); - } else if (err instanceof NoPromptChoices) { + } else if (error instanceof NoPromptChoices) { this.exitWithError( [ 'Something went wrong trying to generate your config: ', - err.message, + error.message, ].join('\n'), ); } - throw err; + + throw error; } await DeployConfig.syncToSsm(deployConfig, appPrefix); diff --git a/src/commands/release.ts b/src/commands/release.ts index 686d09b..f4ab5f2 100644 --- a/src/commands/release.ts +++ b/src/commands/release.ts @@ -1,25 +1,21 @@ -import { Flags} from '@oclif/core' - -// Import base command -import { BaseCommand } from '../base.js'; +import { Flags } from '@oclif/core'; import { createEcrArn, getCfnStackExports, - isLatestTag as getIsLatestTag, imageTagExists as getImageTagExists, + isLatestTag as getIsLatestTag, parseEcrArn, restartEcsService, updateTaskDefAppImage, } from '../aws/index.js'; - +// Import base command +import { BaseCommand } from '../base.js'; import { confirm, confirmProductionOp } from '../configPrompts/index.js'; - import DeployConfig from '../deployConfig/index.js'; - import CfnStackNotFound from '../shared/errors/CfnStackNotFound.js'; - +// eslint-disable-next-line no-use-before-define export default class Release extends BaseCommand { static override description = 'release a new version of an app'; @@ -30,29 +26,30 @@ export default class Release extends BaseCommand { static override flags = { 'app': Flags.string({ char: 'a', - required: true, description: 'name of the app to work with', + required: true, }), 'image-tag': Flags.string({ char: 'i', - required: true, description: 'the docker image version tag to release', + required: true, }), 'no-deploy': Flags.boolean({ - description: "Update the Fargate Task Definition but don't restart the service", default: false, + description: + "Update the Fargate Task Definition but don't restart the service", }), - } + }; public async run(): Promise { // Destructure flags const { + app, 'image-tag': imageTag, 'no-deploy': noDeploy, - app, yes, } = this.flags; - + const assumedRole = this.getAssumedRole(); // see the README section on cross-account ECR access if (this.ecrAccessRoleArn !== undefined) { @@ -65,19 +62,21 @@ export default class Release extends BaseCommand { let cfnExports: Record; try { cfnExports = await getCfnStackExports(cfnStackName); - ['taskDefName', 'clusterName', 'serviceName'].forEach((exportValue) => { + for (const exportValue of ['taskDefName', 'clusterName', 'serviceName']) { if (cfnExports[exportValue] === undefined) { throw new Error(`Incomplete app stack: missing ${exportValue}`); } - }); - } catch (err) { + } + } catch (error) { if ( - err instanceof Error && - (err instanceof CfnStackNotFound || err.message.includes('Incomplete')) + error instanceof Error && + (error instanceof CfnStackNotFound || + error.message.includes('Incomplete')) ) { - this.exitWithError(err.message); + this.exitWithError(error.message); } - throw err; + + throw error; } /** @@ -100,7 +99,9 @@ export default class Release extends BaseCommand { imageTag, ); if (!imageTagExists) { - this.exitWithError(`No image with tag ${imageTag} in ${repoArn.repoName}`); + this.exitWithError( + `No image with tag ${imageTag} in ${repoArn.repoName}`, + ); } // check if it's the latest release and prompt if not @@ -118,7 +119,7 @@ export default class Release extends BaseCommand { // generate the new repo image arn to be deployed const newAppImage = createEcrArn({ ...repoArn, - imageTag: imageTag, + imageTag, }); /** @@ -127,7 +128,7 @@ export default class Release extends BaseCommand { * to get/extract it via the api. `taskDefName` here is also known as the * "family" and doesn't include the task def revision/version number */ - const { taskDefName, appOnlyTaskDefName, clusterName, serviceName } = + const { appOnlyTaskDefName, clusterName, serviceName, taskDefName } = cfnExports; // check that we're not using a wildly different version of the cli @@ -157,8 +158,8 @@ export default class Release extends BaseCommand { // update the ssm parameter this.log('Updating stored deployment configuration'); await DeployConfig.update({ - deployConfig, appPrefix: this.getAppPrefix(), + deployConfig, param: 'appImage', value: newAppImage, }); @@ -168,12 +169,13 @@ export default class Release extends BaseCommand { this.log(`Restarting the ${serviceName} service...`); await restartEcsService({ cluster: clusterName, - service: serviceName, newTaskDefArn, + service: serviceName, wait: true, }); this.exitWithSuccess('done.'); } + this.exitWithSuccess( [ 'Redployment skipped', diff --git a/src/commands/repos.ts b/src/commands/repos.ts index a00889e..58be082 100644 --- a/src/commands/repos.ts +++ b/src/commands/repos.ts @@ -2,21 +2,17 @@ import { table } from 'table'; // Import aws helpers -import { - getRepoList, -} from '../aws/index.js'; - +import { getRepoList } from '../aws/index.js'; // Import base command -import { BaseCommand } from '../base.js' +import { BaseCommand } from '../base.js'; // Import helpers +// eslint-disable-next-line no-use-before-define export default class Repos extends BaseCommand { static override description = 'list the available ECR repositories'; - static override examples = [ - '<%= config.bin %> <%= command.id %>', - ]; + static override examples = ['<%= config.bin %> <%= command.id %>']; public async run(): Promise { const assumedRole = this.getAssumedRole(); @@ -24,15 +20,17 @@ export default class Repos extends BaseCommand { if (this.ecrAccessRoleArn !== undefined) { assumedRole.setAssumedRoleArn(this.ecrAccessRoleArn); } + const repos = await getRepoList(assumedRole); const data = repos.map((r) => { return [r]; }); - if (data.length) { + if (data.length > 0) { const tableOutput = table([['Repository Name'], ...data]); this.exitWithSuccess(tableOutput); } + this.exitWithError('No ECR repositories found'); } } diff --git a/src/commands/restart.ts b/src/commands/restart.ts index 41f9b0d..0c2ebb0 100644 --- a/src/commands/restart.ts +++ b/src/commands/restart.ts @@ -1,28 +1,23 @@ // Import oclif -import { Flags } from '@oclif/core' +import { Flags } from '@oclif/core'; +import { getCfnStackExports, restartEcsService } from '../aws/index.js'; // Import base command import { BaseCommand } from '../base.js'; - -import { getCfnStackExports, restartEcsService } from '../aws/index.js'; - import { confirmProductionOp } from '../configPrompts/index.js'; - import CfnStackNotFound from '../shared/errors/CfnStackNotFound.js'; - +// eslint-disable-next-line no-use-before-define export default class Restart extends BaseCommand { static override description = 'no changes; just force a restart'; - static override examples = [ - '<%= config.bin %> <%= command.id %>', - ]; + static override examples = ['<%= config.bin %> <%= command.id %>']; static override flags = { - 'app': Flags.string({ + app: Flags.string({ char: 'a', - required: true, description: 'name of the app to work with', + required: true, }), }; @@ -31,12 +26,14 @@ export default class Restart extends BaseCommand { let cfnExports; try { cfnExports = await getCfnStackExports(cfnStackName); - } catch (err) { - if (err instanceof CfnStackNotFound) { - this.exitWithError(err.message); + } catch (error) { + if (error instanceof CfnStackNotFound) { + this.exitWithError(error.message); } - throw err; + + throw error; } + const { clusterName, serviceName } = cfnExports; this.log(`Restarting service ${serviceName} on cluster ${clusterName}`); diff --git a/src/commands/schedule.ts b/src/commands/schedule.ts index 921c24d..27cf973 100644 --- a/src/commands/schedule.ts +++ b/src/commands/schedule.ts @@ -1,59 +1,55 @@ // Import oclif -import { Flags } from '@oclif/core' - +import { Flags } from '@oclif/core'; // Import table import { table } from 'table'; // Import base command import { BaseCommand } from '../base.js'; - // Import config prompts import { confirm } from '../configPrompts/index.js'; - // Import deploy config import DeployConfig from '../deployConfig/index.js'; - // Import helpers import validSSMParamName from '../shared/helpers/validSSMParamName.js'; - +// eslint-disable-next-line no-use-before-define export default class Schedule extends BaseCommand { - static override description = 'create a scheduled task that executes the app image with a custom command'; + static override description = + 'create a scheduled task that executes the app image with a custom command'; - static override examples = [ - '<%= config.bin %> <%= command.id %>', - ]; + static override examples = ['<%= config.bin %> <%= command.id %>']; static override flags = { 'app': Flags.string({ char: 'a', - required: true, description: 'name of the app to work with', + required: true, + }), + 'delete': Flags.string({ + char: 'D', + description: 'delete a scheduled task', }), 'list': Flags.boolean({ char: 'l', description: 'list the existing scheduled tasks', }), - 'task-id': Flags.string({ - char: 't', - description: 'give the task a string id; by default one will be generated', + 'task-command': Flags.string({ + char: 'c', + description: 'the app task command to run', }), 'task-description': Flags.string({ char: 'd', description: 'description of what the task does', }), - 'delete': Flags.string({ - char: 'D', - description: 'delete a scheduled task', + 'task-id': Flags.string({ + char: 't', + description: + 'give the task a string id; by default one will be generated', }), 'task-schedule': Flags.string({ char: 's', description: 'a cron expression, e.g. "0 4 * * *"', }), - 'task-command': Flags.string({ - char: 'c', - description: 'the app task command to run', - }), }; public async run(): Promise { @@ -62,11 +58,11 @@ export default class Schedule extends BaseCommand { app, delete: deleteFlag, list, - yes, - 'task-id': taskIdFlag, + 'task-command': taskCommand, 'task-description': taskDescriptionFlag, + 'task-id': taskIdFlag, 'task-schedule': taskSchedule, - 'task-command': taskCommand, + yes, } = this.flags; const assumedRole = this.getAssumedRole(); @@ -76,10 +72,10 @@ export default class Schedule extends BaseCommand { if (list) { // format existing as a table and exitWithSuccess - if (existingTaskIds.length) { + if (existingTaskIds.length > 0) { const tableRows = existingTaskIds.map((id) => { const taskSettings = existingTasks[id]; - const { command, schedule, description } = taskSettings; + const { command, description, schedule } = taskSettings; return [id, schedule, command, description]; }); const tableOutput = table([ @@ -88,33 +84,35 @@ export default class Schedule extends BaseCommand { ]); this.exitWithSuccess(tableOutput); } + this.exitWithSuccess('No scheduled tasks configured'); } else if (deleteFlag) { // delete the existing entry if (!existingTaskIds.includes(deleteFlag)) { this.exitWithError(`No scheduled task with id ${deleteFlag}`); } + const existingTask = existingTasks[deleteFlag]; - if ( - !(yes || (await confirm(`Delete scheduled task ${deleteFlag}?`))) - ) { + if (!(yes || (await confirm(`Delete scheduled task ${deleteFlag}?`)))) { this.exitWithSuccess(); } + const existingTaskParams = Object.keys(existingTask); - for (let i = 0; i < existingTaskParams.length; i++) { + for (const existingTaskParam of existingTaskParams) { await DeployConfig.deleteParam( deployConfig, this.getAppPrefix(), - `scheduledTasks/${deleteFlag}/${existingTaskParams[i]}`, + `scheduledTasks/${deleteFlag}/${existingTaskParam}`, ); } + this.exitWithSuccess(`Scheduled task ${deleteFlag} deleted`); } else if (!(taskSchedule && taskCommand)) { // FIXME: need to guarantee that this exits (throw an error?) this.exitWithError('Invalid options. See `--help` output'); } - const taskId = taskIdFlag || Math.random().toString(36).substring(2, 16); + const taskId = taskIdFlag || Math.random().toString(36).slice(2, 16); const taskDescription = taskDescriptionFlag || ''; if (!validSSMParamName(taskId)) { @@ -123,20 +121,16 @@ export default class Schedule extends BaseCommand { ); } - if ( - existingTaskIds.some((t) => { - return t === taskId; - }) - ) { + if (existingTaskIds.includes(taskId)) { this.exitWithError( `A schedule task with id ${taskId} already exists for ${app}`, ); } const params = { + [`scheduledTasks/${taskId}/command`]: taskCommand ?? '', // FIXME: [`scheduledTasks/${taskId}/description`]: taskDescription, [`scheduledTasks/${taskId}/schedule`]: taskSchedule ?? '', // FIXME: - [`scheduledTasks/${taskId}/command`]: taskCommand ?? '', // FIXME: }; await DeployConfig.syncToSsm(deployConfig, this.getAppPrefix(), params); diff --git a/src/commands/show.ts b/src/commands/show.ts index 7f397a5..0fe6945 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -1,62 +1,57 @@ // Import oclif -import { Flags } from '@oclif/core' +import { Flags } from '@oclif/core'; // Import base command -import { BaseCommand } from '../base.js' - +import { BaseCommand } from '../base.js'; // Import deploy config import DeployConfig from '../deployConfig/index.js'; - +// eslint-disable-next-line no-use-before-define export default class Show extends BaseCommand { static override description = "display an app's current configuration"; - static override examples = [ - '<%= config.bin %> <%= command.id %>', - ]; + static override examples = ['<%= config.bin %> <%= command.id %>']; static override flags = { 'app': Flags.string({ char: 'a', - required: true, description: 'name of the app to work with', + required: true, }), 'flat': Flags.boolean({ char: 'f', + default: false, description: 'display the flattened, key: value form of the config', + }), + 'keep-secret-arns': Flags.boolean({ default: false, + description: + 'show app environment secret value ARNs instead of dereferencing', }), 'sha': Flags.boolean({ char: 's', - description: 'output a sha1 hash of the current configuration', - default: false, - }), - 'keep-secret-arns': Flags.boolean({ - description: 'show app environment secret value ARNs instead of dereferencing', default: false, + description: 'output a sha1 hash of the current configuration', }), }; public async run(): Promise { // Destructure flags - const { - flat, - sha, - 'keep-secret-arns': keepSecretArns, - } = this.flags; + const { flat, 'keep-secret-arns': keepSecretArns, sha } = this.flags; // get assumed role const assumedRole = this.getAssumedRole(); - + // we only want to see that sha1 hash (likely for debugging) if (sha) { const deployConfig = await this.getDeployConfig(assumedRole); this.exitWithSuccess(DeployConfig.toHash(deployConfig)); } - - const deployConfig = await this.getDeployConfig(assumedRole, keepSecretArns); - this.exitWithSuccess( - DeployConfig.toString(deployConfig, true, flat), + + const deployConfig = await this.getDeployConfig( + assumedRole, + keepSecretArns, ); + this.exitWithSuccess(DeployConfig.toString(deployConfig, true, flat)); } } diff --git a/src/commands/stack.ts b/src/commands/stack.ts index 512407a..8c62ed7 100644 --- a/src/commands/stack.ts +++ b/src/commands/stack.ts @@ -1,65 +1,61 @@ // Import path -import path, { dirname } from 'path'; -import { fileURLToPath } from 'url'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - +import { Flags } from '@oclif/core'; // Import oclif -import { Flags } from '@oclif/core' +import { execSync } from 'node:child_process'; +import path, { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { temporaryWriteTask } from 'tempy'; +import { + cfnStackExists, + getAccountId, + getCfnStackExports, +} from '../aws/index.js'; // Import base command import { BaseCommand } from '../base.js'; - -import { execSync } from 'child_process'; - -import { temporaryWriteTask } from 'tempy'; - -import { cfnStackExists, getAccountId, getCfnStackExports } from '../aws/index.js'; - import { confirmProductionOp } from '../configPrompts/index.js'; - import CACCL_DEPLOY_VERSION from '../constants/CACCL_DEPLOY_VERSION.js'; - -import isProdAccount from '../helpers/isProdAccount.js'; import DeployConfig from '../deployConfig/index.js'; +import isProdAccount from '../helpers/isProdAccount.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); type EnvAdditions = { + AWS_PROFILE?: string; AWS_REGION: string; CDK_DISABLE_VERSION_CHECK: string; - AWS_PROFILE?: string; CDK_STACK_PROPS_FILE_PATH?: string; }; +// eslint-disable-next-line no-use-before-define export default class Stack extends BaseCommand { - static override description = "diff, deploy, or delete the app's AWS resources"; + static override description = + "diff, deploy, or delete the app's AWS resources"; - static override examples = [ - '<%= config.bin %> <%= command.id %>', - ]; + static override examples = ['<%= config.bin %> <%= command.id %>']; static override flags = { - 'app': Flags.string({ + app: Flags.string({ char: 'a', - required: true, description: 'name of the app to work with', + required: true, }), - } + }; static override strict = false; public async run(): Promise { // Destructure flags - const { - yes, - profile, - } = this.flags; + const { profile, yes } = this.flags; // get this without resolved secrets for passing to cdk - const assumedRole = this.getAssumedRole() + const assumedRole = this.getAssumedRole(); const deployConfig = await this.getDeployConfig(assumedRole, true); // get it again with resolved secrets so we can make our hash - const deployConfigHash = DeployConfig.toHash(await this.getDeployConfig(assumedRole)); + const deployConfigHash = DeployConfig.toHash( + await this.getDeployConfig(assumedRole), + ); /** * Get the important ids/names from our infrastructure stack: @@ -69,24 +65,23 @@ export default class Stack extends BaseCommand { */ const cfnStackName = this.getCfnStackName(); const stackExists = await cfnStackExists(cfnStackName); - const { vpcId, ecsClusterName, albLogBucketName } = await getCfnStackExports( - deployConfig.infraStackName, - ); + const { albLogBucketName, ecsClusterName, vpcId } = + await getCfnStackExports(deployConfig.infraStackName); /** * Create an object structure with all the info * the CDK stack operation will need */ const cdkStackProps = { - vpcId, - ecsClusterName, albLogBucketName, - cacclDeployVersion: CACCL_DEPLOY_VERSION, - deployConfigHash, - stackName: cfnStackName, awsAccountId: await getAccountId(), awsRegion: process.env.AWS_REGION || 'us-east-1', + cacclDeployVersion: CACCL_DEPLOY_VERSION, deployConfig, + deployConfigHash, + ecsClusterName, + stackName: cfnStackName, + vpcId, }; const envAdditions: EnvAdditions = { @@ -98,20 +93,37 @@ export default class Stack extends BaseCommand { const cdkArgs = [...this.argv]; // FIXME: // default cdk operation is `list` - if (!cdkArgs.length) { + if (cdkArgs.length === 0) { cdkArgs.push('list'); - } else if (cdkArgs[0] === 'dump') { - this.exitWithSuccess(JSON.stringify(cdkStackProps, null, ' ')); - } else if (cdkArgs[0] === 'info') { - if (!stackExists) { - this.exitWithError(`Stack ${cfnStackName} has not been deployed yet`); + } else + switch (cdkArgs[0]) { + case 'dump': { + this.exitWithSuccess(JSON.stringify(cdkStackProps, null, ' ')); + + break; + } + + case 'info': { + if (!stackExists) { + this.exitWithError( + `Stack ${cfnStackName} has not been deployed yet`, + ); + } + + const stackExports = await getCfnStackExports(cfnStackName); + this.exitWithSuccess(JSON.stringify(stackExports, null, ' ')); + + break; + } + + case 'changeset': { + cdkArgs.shift(); + cdkArgs.unshift('deploy', '--no-execute'); + + break; + } + // No default } - const stackExports = await getCfnStackExports(cfnStackName); - this.exitWithSuccess(JSON.stringify(stackExports, null, ' ')); - } else if (cdkArgs[0] === 'changeset') { - cdkArgs.shift(); - cdkArgs.unshift('deploy', '--no-execute'); - } // tell cdk to use the same profile if (profile !== undefined) { @@ -120,10 +132,7 @@ export default class Stack extends BaseCommand { } // disable cdk prompting if user included `--yes` flag - if ( - yes && - (cdkArgs.includes('deploy') || cdkArgs.includes('changeset')) - ) { + if (yes && (cdkArgs.includes('deploy') || cdkArgs.includes('changeset'))) { cdkArgs.push('--require-approval-never'); } @@ -136,6 +145,7 @@ export default class Stack extends BaseCommand { if (stackExists && !yes && !(await this.stackVersionDiffCheck())) { this.exitWithSuccess(); } + // production failsafe if we're actually changing anything if (!(await confirmProductionOp(yes))) { this.exitWithSuccess(); @@ -147,9 +157,8 @@ export default class Stack extends BaseCommand { cdkStackProps.deployConfig.dbOptions && !cdkStackProps.deployConfig.dbOptions.removalPolicy ) { - cdkStackProps.deployConfig.dbOptions.removalPolicy = (await isProdAccount()) - ? 'RETAIN' - : 'DESTROY'; + cdkStackProps.deployConfig.dbOptions.removalPolicy = + (await isProdAccount()) ? 'RETAIN' : 'DESTROY'; } /** @@ -163,24 +172,24 @@ export default class Stack extends BaseCommand { envAdditions.CDK_STACK_PROPS_FILE_PATH = tempPath; const execOpts = { - stdio: 'inherit' as const, - // exec the cdk process in the cdk directory - // FIXME: put `cdk` in oclif data dir and set cwd to that // but how do I access node_modules then... cwd: path.join(__dirname, '../..'), + // exec the cdk process in the cdk directory + // FIXME: put `cdk` in oclif data dir and set cwd to that // inject our additional env vars env: { ...process.env, ...envAdditions }, + stdio: 'inherit' as const, }; try { execSync(['node_modules/.bin/cdk', ...cdkArgs].join(' '), execOpts); this.exitWithSuccess('done!'); - } catch (err) { + } catch (error) { const message = - err instanceof Error - ? err.message - : `Error while executing CDK: ${err}`; - this.exitWithError(message); + error instanceof Error + ? error.message + : `Error while executing CDK: ${error}`; + this.exitWithError(message); } }, ); diff --git a/src/commands/update.ts b/src/commands/update.ts index 1cbf8a3..2a0db09 100644 --- a/src/commands/update.ts +++ b/src/commands/update.ts @@ -1,38 +1,34 @@ // Import oclif -import { Args, Flags } from '@oclif/core' +import { Args, Flags } from '@oclif/core'; // Import base command import { BaseCommand } from '../base.js'; - // Import config prompts import { confirmProductionOp } from '../configPrompts/index.js'; - // Import deploy config import DeployConfig from '../deployConfig/index.js'; - // Import helpers import validSSMParamName from '../shared/helpers/validSSMParamName.js'; - +// eslint-disable-next-line no-use-before-define export default class Update extends BaseCommand { - static override description = 'update (or delete) a single deploy config setting'; + static override args = { + param: Args.string({ description: 'parameter to update' }), + value: Args.string({ description: 'value update the parameter to' }), + }; - static override examples = [ - '<%= config.bin %> <%= command.id %>', - ]; + static override description = + 'update (or delete) a single deploy config setting'; - static override args = { - param: Args.string({description: 'parameter to update'}), - value: Args.string({description: 'value update the parameter to'}), - } + static override examples = ['<%= config.bin %> <%= command.id %>']; static override flags = { - 'app': Flags.string({ + app: Flags.string({ char: 'a', - required: true, description: 'name of the app to work with', + required: true, }), - 'delete': Flags.boolean({ + delete: Flags.boolean({ char: 'D', description: 'delete the named parameter instead of creating/updating', }), @@ -40,11 +36,9 @@ export default class Update extends BaseCommand { public async run(): Promise { // Destructure flags - const { - yes, - } = this.flags; + const { yes } = this.flags; - const assumedRole = this.getAssumedRole() + const assumedRole = this.getAssumedRole(); const deployConfig = await this.getDeployConfig(assumedRole, true); if (!(await confirmProductionOp(yes))) { @@ -53,24 +47,29 @@ export default class Update extends BaseCommand { try { const { param, value } = this.args; - + if (this.flags.delete && param) { - await DeployConfig.deleteParam(deployConfig, this.getAppPrefix(), param); + await DeployConfig.deleteParam( + deployConfig, + this.getAppPrefix(), + param, + ); } else if (param && value) { if (!validSSMParamName(param)) { throw new Error(`Invalid param name: '${param}'`); } + await DeployConfig.update({ - deployConfig, appPrefix: this.getAppPrefix(), + deployConfig, param, value, }); } else { // TODO: throw error? } - } catch (err) { - const message = err instanceof Error ? err.message : `${err}`; + } catch (error) { + const message = error instanceof Error ? error.message : `${error}`; this.exitWithError(`Something went wrong: ${message}`); } } diff --git a/src/conf.ts b/src/conf.ts index e382c27..6b4a351 100644 --- a/src/conf.ts +++ b/src/conf.ts @@ -7,18 +7,18 @@ import CacclConfSchema from './shared/types/CacclConfSchema.js'; // Construct options const confOpts: Conf.Options = { schema: { - ssmRootPrefix: { + cfnStackPrefix: { type: 'string', }, ecrAccessRoleArn: { type: 'string', }, - cfnStackPrefix: { - type: 'string', - }, productionAccounts: { type: 'array', }, + ssmRootPrefix: { + type: 'string', + }, }, }; @@ -27,18 +27,19 @@ if (process.env.CACCL_DEPLOY_CONF_DIR !== undefined) { confOpts.cwd = process.env.CACCL_DEPLOY_CONF_DIR; } +// eslint-disable-next-line new-cap const conf = new Conf.default(confOpts); const configDefaults = { - ssmRootPrefix: '/caccl-deploy', cfnStackPrefix: 'CacclDeploy-', productionAccounts: [], + ssmRootPrefix: '/caccl-deploy', }; const setConfigDefaults = () => { - Object.entries(configDefaults).forEach(([k, v]) => { + for (const [k, v] of Object.entries(configDefaults)) { conf.set(k, v); - }); + } }; export { conf, configDefaults, setConfigDefaults }; diff --git a/src/configPrompts/confirm.ts b/src/configPrompts/confirm.ts index 17f002b..5090b5c 100644 --- a/src/configPrompts/confirm.ts +++ b/src/configPrompts/confirm.ts @@ -10,10 +10,10 @@ import prompt from './prompt.js'; */ const confirm = async (message: string, defaultsToYes?: boolean) => { const response = await prompt({ - type: 'confirm', - name: 'yesorno', initial: defaultsToYes, message, + name: 'yesorno', + type: 'confirm', }); return response.yesorno; }; diff --git a/src/configPrompts/confirmProductionOp.ts b/src/configPrompts/confirmProductionOp.ts index f869684..463ebd3 100644 --- a/src/configPrompts/confirmProductionOp.ts +++ b/src/configPrompts/confirmProductionOp.ts @@ -1,43 +1,43 @@ // Import chalk import chalk from 'chalk'; - // Import figlet import figlet from 'figlet'; -// Import aws -import confirm from './confirm.js'; import { getAccountId } from '../aws/index.js'; - // Import conf import { conf } from '../conf.js'; - -// Import shared errors -import UserCancel from '../shared/errors/UserCancel.js'; - // Import logger import logger from '../logger.js'; +import UserCancel from '../shared/errors/UserCancel.js'; +import confirm from './confirm.js'; +// Import shared errors +// Import aws const confirmProductionOp = async (yes?: boolean) => { if (yes) { return true; } + const prodAccounts = conf.get('productionAccounts'); - if (prodAccounts === undefined || !prodAccounts.length) { + if (prodAccounts === undefined || prodAccounts.length === 0) { return true; } + const accountId = await getAccountId(); if (!prodAccounts.includes(accountId)) { return true; } + logger.log(chalk.redBright(figlet.textSync('Production Account!'))); try { const ok = await confirm('\nPlease confirm you wish to proceed\n'); return ok; - } catch (err) { - if (err instanceof UserCancel) { + } catch (error) { + if (error instanceof UserCancel) { return false; } - throw err; + + throw error; } }; diff --git a/src/configPrompts/index.ts b/src/configPrompts/index.ts index 994910f..d814afa 100644 --- a/src/configPrompts/index.ts +++ b/src/configPrompts/index.ts @@ -1,18 +1,9 @@ // Import prompt functions -import confirm from './confirm.js'; -import confirmProductionOp from './confirmProductionOp.js'; -import promptAppImage from './promptAppImage.js'; -import promptAppName from './promptAppName.js'; -import promptCertificateArn from './promptCertificateArn.js'; -import promptInfraStackName from './promptInfraStackName.js'; -import promptKeyValuePairs from './promptKeyValuePairs.js'; -export { - confirm, - confirmProductionOp, - promptAppName, - promptInfraStackName, - promptCertificateArn, - promptAppImage, - promptKeyValuePairs, -}; +export { default as confirm } from './confirm.js'; +export { default as confirmProductionOp } from './confirmProductionOp.js'; +export { default as promptAppImage } from './promptAppImage.js'; +export { default as promptAppName } from './promptAppName.js'; +export { default as promptCertificateArn } from './promptCertificateArn.js'; +export { default as promptInfraStackName } from './promptInfraStackName.js'; +export { default as promptKeyValuePairs } from './promptKeyValuePairs.js'; diff --git a/src/configPrompts/prompt.ts b/src/configPrompts/prompt.ts index cb5244b..a199f08 100644 --- a/src/configPrompts/prompt.ts +++ b/src/configPrompts/prompt.ts @@ -7,16 +7,16 @@ import UserCancel from '../shared/errors/UserCancel.js'; /** * Prompt wrapper, with continue/cancel errors built-in. * @author Jay Luker - * @param question PromptObject to be used - * @param continueOnCancel Whether to continue or throw an error on user-cancel - * @returns + * @param {PromptObject} question PromptObject to be used + * @param {boolean} continueOnCancel Whether to continue or throw an error on user-cancel + * @returns {void} */ const prompt = async ( question: PromptObject, continueOnCancel?: boolean, ) => { return prompts(question, { - onCancel: () => { + onCancel() { if (!continueOnCancel) { throw new UserCancel(''); } diff --git a/src/configPrompts/promptAppImage.ts b/src/configPrompts/promptAppImage.ts index 381568f..386a172 100644 --- a/src/configPrompts/promptAppImage.ts +++ b/src/configPrompts/promptAppImage.ts @@ -1,8 +1,6 @@ // Import prompts import { Choice } from 'prompts'; -// Import aws -import prompt from './prompt.js'; import { AssumedRole, createEcrArn, @@ -10,20 +8,17 @@ import { getRepoImageList, getRepoList, } from '../aws/index.js'; - // Import shared errors import NoPromptChoices from '../shared/errors/NoPromptChoices.js'; - // Import shared helpers import looksLikeSemver from '../shared/helpers/looksLikeSemver.js'; +import prompt from './prompt.js'; +// Import aws // Import helpers const promptAppImage = async (assumedRole: AssumedRole) => { const inputType = await prompt({ - type: 'select', - name: 'value', - message: 'How would you like to select your image?', choices: [ { title: 'Select from a list of ECR repos', @@ -34,18 +29,22 @@ const promptAppImage = async (assumedRole: AssumedRole) => { value: 'string', }, ], + message: 'How would you like to select your image?', + name: 'value', + type: 'select', }); let appImage; switch (inputType.value) { case 'string': { const inputString = await prompt({ - type: 'text', - name: 'value', message: 'Enter the image id', + name: 'value', + type: 'text', }); appImage = inputString.value; break; } + case 'select': { // TODO: deal with AssumedRole const repoList = await getRepoList(assumedRole); @@ -57,15 +56,15 @@ const promptAppImage = async (assumedRole: AssumedRole) => { }; }); - if (!repoChoices.length) { + if (repoChoices.length === 0) { throw new NoPromptChoices('No ECR repositories'); } const repoChoice = await prompt({ - type: 'select', - name: 'value', - message: 'Select the ECR repo', choices: repoChoices, + message: 'Select the ECR repo', + name: 'value', + type: 'select', }); const images = await getRepoImageList(assumedRole, repoChoice.value); @@ -83,10 +82,10 @@ const promptAppImage = async (assumedRole: AssumedRole) => { } const appImageValue = createEcrArn({ - region: getCurrentRegion(), account: image.registryId, - repoName: repoChoice.value, imageTag: releaseTag, + region: getCurrentRegion(), + repoName: repoChoice.value, }); if (releaseTag) { @@ -95,25 +94,29 @@ const promptAppImage = async (assumedRole: AssumedRole) => { value: appImageValue, }); } + return choices; }, []); - if (!imageTagsChoices.length) { + if (imageTagsChoices.length === 0) { throw new NoPromptChoices('No valid image tags to choose from'); } const imageTagChoice = await prompt({ - type: 'select', - name: 'value', - message: 'Select a release tag', choices: imageTagsChoices, + message: 'Select a release tag', + name: 'value', + type: 'select', }); appImage = imageTagChoice.value; break; } - default: + + default: { break; + } } + return appImage; }; diff --git a/src/configPrompts/promptAppName.ts b/src/configPrompts/promptAppName.ts index e5df089..1a2843a 100644 --- a/src/configPrompts/promptAppName.ts +++ b/src/configPrompts/promptAppName.ts @@ -1,18 +1,18 @@ // Import shared helpers -import prompt from './prompt.js'; import validSSMParamName from '../shared/helpers/validSSMParamName.js'; +import prompt from './prompt.js'; // Import helpers const promptAppName = async () => { const appName = await prompt({ - type: 'text', - name: 'value', message: 'Enter a name for your app', - validate: (v) => { - return !validSSMParamName(v) - ? 'app name can only contain alphanumeric and/or the characters ".-_"' - : true; + name: 'value', + type: 'text', + validate(v) { + return validSSMParamName(v) + ? true + : 'app name can only contain alphanumeric and/or the characters ".-_"'; }, }); return appName.value; diff --git a/src/configPrompts/promptCertificateArn.ts b/src/configPrompts/promptCertificateArn.ts index 5662010..a3820ae 100644 --- a/src/configPrompts/promptCertificateArn.ts +++ b/src/configPrompts/promptCertificateArn.ts @@ -1,9 +1,8 @@ // Import aws -import prompt from './prompt.js'; import { getAcmCertList } from '../aws/index.js'; - // Import shared errors import NoPromptChoices from '../shared/errors/NoPromptChoices.js'; +import prompt from './prompt.js'; // Import helpers @@ -18,15 +17,15 @@ const promptCertificateArn = async () => { }; }); - if (!certChoices.length) { + if (certChoices.length === 0) { throw new NoPromptChoices('No ACM certificates to choose from'); } const certificateArn = await prompt({ - type: 'select', - name: 'value', - message: 'Select the hostname associated with your ACM certificate', choices: certChoices, + message: 'Select the hostname associated with your ACM certificate', + name: 'value', + type: 'select', }); return certificateArn.value; }; diff --git a/src/configPrompts/promptInfraStackName.ts b/src/configPrompts/promptInfraStackName.ts index 67556ea..c6d64bd 100644 --- a/src/configPrompts/promptInfraStackName.ts +++ b/src/configPrompts/promptInfraStackName.ts @@ -1,9 +1,8 @@ // Import aws -import prompt from './prompt.js'; import { getInfraStackList } from '../aws/index.js'; - // Import shared errors import NoPromptChoices from '../shared/errors/NoPromptChoices.js'; +import prompt from './prompt.js'; // Import helpers @@ -21,15 +20,15 @@ const promptInfraStackName = async () => { }; }); - if (!infraStackChoices.length) { + if (infraStackChoices.length === 0) { throw new NoPromptChoices('No infrastructure stacks'); } const infraStackName = await prompt({ - type: 'select', - name: 'value', - message: 'Select a base infrastructure stack to deploy to', choices: infraStackChoices, + message: 'Select a base infrastructure stack to deploy to', + name: 'value', + type: 'select', }); return infraStackName.value; }; diff --git a/src/configPrompts/promptKeyValuePairs.ts b/src/configPrompts/promptKeyValuePairs.ts index 216795b..d73fe9f 100644 --- a/src/configPrompts/promptKeyValuePairs.ts +++ b/src/configPrompts/promptKeyValuePairs.ts @@ -1,8 +1,7 @@ // Import prompt -import prompt from './prompt.js'; - // Import logger import logger from '../logger.js'; +import prompt from './prompt.js'; const promptKeyValuePairs = async ( label: string, @@ -11,15 +10,16 @@ const promptKeyValuePairs = async ( ): Promise> => { const pairs = { ...current }; const displayList: string[] = []; - Object.entries(pairs).forEach(([k, v]) => { + for (const [k, v] of Object.entries(pairs)) { displayList.push(`${k}=${v}`); - }); + } + logger.log(`Current ${label}(s):\n${displayList.join('\n')}`); const newEntry = await prompt({ - type: 'text', - name: 'value', message: `Enter a new ${label}, e.g. ${example}. Leave empty to continue.`, - validate: (v) => { + name: 'value', + type: 'text', + validate(v) { return v !== '' && v.split('=').length !== 2 ? 'invalid entry format' : true; @@ -30,6 +30,7 @@ const promptKeyValuePairs = async ( pairs[newKey] = newValue; return promptKeyValuePairs(label, example, pairs); } + return pairs; }; diff --git a/src/deployConfig/helpers/create.ts b/src/deployConfig/helpers/create.ts index 06022e9..fb864c5 100644 --- a/src/deployConfig/helpers/create.ts +++ b/src/deployConfig/helpers/create.ts @@ -5,8 +5,8 @@ import { DeployConfigData } from '../../types/index.js'; * Parse a DeployConfigData from a generic key-value object. * @author Jay Luker * @author Benedikt Arnarsson - * @param data - * @returns + * @param {Record} data raw data to be parsed into deploy configuration + * @returns {DeployConfigData} parsed out deploy configuration */ const create = (data: Record): DeployConfigData => { return DeployConfigData.parse(data); diff --git a/src/deployConfig/helpers/fromFlattened.ts b/src/deployConfig/helpers/fromFlattened.ts index 5322761..17d9c50 100644 --- a/src/deployConfig/helpers/fromFlattened.ts +++ b/src/deployConfig/helpers/fromFlattened.ts @@ -1,9 +1,9 @@ // Import flat import flat from 'flat'; -// Import shared types -import create from './create.js'; import { DeployConfigData } from '../../types/index.js'; +import create from './create.js'; +// Import shared types // Import helpers @@ -11,8 +11,8 @@ import { DeployConfigData } from '../../types/index.js'; * Construct a DeployConfigData from a flattened set of parameters. * Primarily used for parsing the SSM values. * @author Jay Luker - * @param flattenedData - * @returns + * @param {Record} flattenedData flattened, key-value configuration + * @returns {DeployConfigData} unflattened deploy configuration */ const fromFlattened = ( flattenedData: Record, diff --git a/src/deployConfig/helpers/wipeConfig.ts b/src/deployConfig/helpers/wipeConfig.ts index 85eea0b..e50b3a4 100644 --- a/src/deployConfig/helpers/wipeConfig.ts +++ b/src/deployConfig/helpers/wipeConfig.ts @@ -14,6 +14,7 @@ const wipeConfig = async ( if (v.toString().startsWith('arn:aws:secretsmanager')) { arns.push(v); } + return arns; }, [], diff --git a/src/deployConfig/index.ts b/src/deployConfig/index.ts index 6983af2..92accbd 100644 --- a/src/deployConfig/index.ts +++ b/src/deployConfig/index.ts @@ -1,17 +1,9 @@ /* eslint-disable @typescript-eslint/no-namespace */ // Import flat import flat from 'flat'; - // Import object-hash import { sha1 } from 'object-hash'; -// Import shared types -import create from './helpers/create.js'; -import fromFlattened from './helpers/fromFlattened.js'; -import wipeConfig from './helpers/wipeConfig.js'; -import { DeployConfigData } from '../types/index.js'; - -// Import from aws import { AssumedRole, deleteSecrets, @@ -21,29 +13,22 @@ import { putSsmParameter, resolveSecret, } from '../aws/index.js'; - -// Import config prompts import { - promptInfraStackName, - promptCertificateArn, promptAppImage, + promptCertificateArn, + promptInfraStackName, promptKeyValuePairs, } from '../configPrompts/index.js'; - -// Import shared errors +import logger from '../logger.js'; import AppNotFound from '../shared/errors/AppNotFound.js'; import ExistingSecretWontDelete from '../shared/errors/ExistingSecretWontDelete.js'; - -// Import shared helpers import readJson from '../shared/helpers/readJson.js'; - -// Import shared types import AwsTag from '../shared/types/AwsTag.js'; +import { DeployConfigData } from '../types/index.js'; +import create from './helpers/create.js'; +import fromFlattened from './helpers/fromFlattened.js'; +import wipeConfig from './helpers/wipeConfig.js'; -// Import logger -import logger from '../logger.js'; - -// TODO: JSDoc namespace DeployConfig { /*------------------------------------------------------------------------*/ /* ---------------------------- Constructors ---------------------------- */ @@ -69,15 +54,14 @@ namespace DeployConfig { keepSecretArns?: boolean, ): Promise => { const ssmParams = await getSsmParametersByPrefix(appPrefix); - if (!ssmParams.length) { + if (ssmParams.length === 0) { throw new AppNotFound( `No configuration found using app prefix ${appPrefix}`, ); } const flattened: Record = {}; - for (let i = 0; i < ssmParams.length; i += 1) { - const param = ssmParams[i]; + for (const param of ssmParams) { if (!param.Name || !param.Value) continue; // trim off the prefix of the parameter name (path) // e.g. '/foo/bar/baz/12345' becomes 'baz/12345' @@ -90,6 +74,7 @@ namespace DeployConfig { flattened[paramName] = value; } + return fromFlattened(flattened); }; @@ -157,10 +142,11 @@ namespace DeployConfig { export const tagsForAws = (deployConfig: DeployConfigData): AwsTag[] => { if ( deployConfig.tags === undefined || - !Object.keys(deployConfig.tags).length + Object.keys(deployConfig.tags).length === 0 ) { return []; } + return Object.entries(deployConfig.tags).map(([Key, Value]) => { return { Key, Value }; }); @@ -176,11 +162,8 @@ namespace DeployConfig { const paramEntries = Object.entries(flattened); const awsTags = tagsForAws(deployConfig); - for (let i = 0; i < paramEntries.length; i += 1) { - const [flattenedName, rawValue] = paramEntries[i]; - + for (const [flattenedName, rawValue] of paramEntries) { if (!rawValue || typeof rawValue === 'object') { - // eslint-disable-next-line no-continue continue; } @@ -197,20 +180,21 @@ namespace DeployConfig { try { paramValue = await putSecret( { + Description: 'Created and managed by caccl-deploy.', Name: paramName, SecretString: rawValue, - Description: 'Created and managed by caccl-deploy.', }, awsTags, ); - } catch (err) { - if (err instanceof ExistingSecretWontDelete) { - logger.log(err.message); + } catch (error) { + if (error instanceof ExistingSecretWontDelete) { + logger.log(error.message); logger.log('Aborting import and cleaning up.'); await wipeConfig(appPrefix, flattened); return; } } + isSecret = true; } @@ -220,11 +204,11 @@ namespace DeployConfig { ].join(' '); const paramOpts = { + Description: paramDescription, Name: paramName, - Value: paramValue, - Type: 'String', Overwrite: true, - Description: paramDescription, + Type: 'String', + Value: paramValue, }; await putSsmParameter(paramOpts, awsTags); @@ -238,13 +222,13 @@ namespace DeployConfig { // FIXME: does not address flattening export const update = async (opts: { - deployConfig: DeployConfigData; appPrefix: string; + deployConfig: DeployConfigData; param: string; value: string; }): Promise => { // Destructure opts - const { deployConfig, appPrefix, param, value } = opts; + const { appPrefix, deployConfig, param, value } = opts; // Create new deployConfig const newDeployConfig = DeployConfigData.parse({ @@ -270,9 +254,11 @@ namespace DeployConfig { if (value === undefined) { throw new Error(`${param} doesn't exist`); } + if (value.startsWith('arn:aws:secretsmanager')) { await deleteSecrets([value]); } + const paramPath = [appPrefix, param].join('/'); await deleteSsmParameters([paramPath]); }; @@ -284,16 +270,17 @@ namespace DeployConfig { let existingConfig; try { existingConfig = await fromSsmParams(ssmPrefix, true); - } catch (err) { - if (err instanceof AppNotFound) { + } catch (error) { + if (error instanceof AppNotFound) { if (ignoreMissing) { return; } + throw new AppNotFound( `No configuration found using prefix ${ssmPrefix}`, ); } else { - throw err; + throw error; } } diff --git a/src/helpers/isProdAccount.ts b/src/helpers/isProdAccount.ts index aaed10c..2e7f8cc 100644 --- a/src/helpers/isProdAccount.ts +++ b/src/helpers/isProdAccount.ts @@ -1,6 +1,5 @@ // Import aws import { getAccountId } from '../aws/index.js'; - // Import config import { conf } from '../conf.js'; diff --git a/src/index.ts b/src/index.ts index d271234..a91eaa2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,3 @@ -export { run } from '@oclif/core' - export * as aws from './aws/index.js'; + +export { run } from '@oclif/core'; diff --git a/src/logger.ts b/src/logger.ts index cb8be78..6900565 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -3,17 +3,18 @@ * @author Benedikt Arnarsson */ +// eslint-disable-next-line @typescript-eslint/no-namespace namespace logger { - type LogFunction = (msg: string) => void; + type LogFunction = (_msg: string) => void; - type Logger = { - log: LogFunction, - error: LogFunction + type Logger = { + error: LogFunction; + log: LogFunction; }; - let logger: Logger = { - log: console.log, + const _logger: Logger = { error: console.error, + log: console.log, }; /** @@ -21,20 +22,22 @@ namespace logger { * @author Benedikt Arnarsson * @param log function for standard logs. * @param error function for error logs. + * @returns {void} */ export const setLogger = (log: LogFunction, error: LogFunction) => { - logger.log = log; - logger.error = error; - } ; + _logger.log = log; + _logger.error = error; + }; /** * Log a standard message to the set logger output. * Defaults to console.log. * @author Benedikt Arnarsson * @param msg string that will be pushed to the output. + * @returns {void} */ - export const log = (msg: string): void => { - logger.log(msg); + export const log = (msg: string): void => { + _logger.log(msg); }; /** @@ -42,9 +45,10 @@ namespace logger { * Defaults to console.error. * @author Benedikt Arnarsson * @param msg string that will be pushed to the output. + * @returns {void} */ export const error = (msg: string): void => { - logger.error(msg); + _logger.error(msg); }; } diff --git a/src/shared/helpers/generateVersion.ts b/src/shared/helpers/generateVersion.ts index 197d446..f1869dc 100644 --- a/src/shared/helpers/generateVersion.ts +++ b/src/shared/helpers/generateVersion.ts @@ -1,16 +1,15 @@ -import { execSync } from 'child_process'; -import { fileURLToPath } from 'url'; -import { dirname } from 'path'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); +import { execSync } from 'node:child_process'; +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; // Import logger import logger from '../../logger.js'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); const getCommandResult = (cmd: string) => { - return execSync(cmd, { stdio: 'pipe', cwd: __dirname }).toString().trim(); + return execSync(cmd, { cwd: __dirname, stdio: 'pipe' }).toString().trim(); }; const generateVersion = () => { @@ -30,13 +29,13 @@ const generateVersion = () => { try { const gitLsThisFile = getCommandResult(`git ls-files ${__filename}`); inGitRepo = gitLsThisFile !== ''; - } catch (err) { + } catch (error) { // error will be capitalized depending on version of git if ( - err instanceof Error && - !err.message.toLowerCase().includes('not a git repository') + error instanceof Error && + !error.message.toLowerCase().includes('not a git repository') ) { - logger.log(String(err)); + logger.log(String(error)); } } @@ -45,12 +44,12 @@ const generateVersion = () => { try { const gitTag = getCommandResult('git describe --exact-match --abbrev=0'); version.push(`tag=${gitTag}`); - } catch (err) { + } catch (error) { if ( - err instanceof Error && - !err.message.includes('no tag exactly matches') + error instanceof Error && + !error.message.includes('no tag exactly matches') ) { - logger.log(String(err)); + logger.log(String(error)); } } @@ -60,8 +59,8 @@ const generateVersion = () => { if (gitBranch.length > 0) { version.unshift(`branch=${gitBranch}`); } - } catch (err) { - logger.log(String(err)); + } catch (error) { + logger.log(String(error)); } } diff --git a/src/shared/helpers/readFile.ts b/src/shared/helpers/readFile.ts index d8157f3..78ee1d4 100644 --- a/src/shared/helpers/readFile.ts +++ b/src/shared/helpers/readFile.ts @@ -1,6 +1,6 @@ // Import NodeJS libs -import fs from 'fs'; -import path from 'path'; +import fs from 'node:fs'; +import path from 'node:path'; /** * Read a file into a string. Uses default utf8 encoding. diff --git a/src/shared/helpers/validSSMParamName.ts b/src/shared/helpers/validSSMParamName.ts index 5fb79d3..d0b260b 100644 --- a/src/shared/helpers/validSSMParamName.ts +++ b/src/shared/helpers/validSSMParamName.ts @@ -5,7 +5,7 @@ * @returns true if the string is valid, else false. */ const validSSMParamName = (name: string): boolean => { - return /^([a-z0-9:/_-]+)$/i.test(name); + return /^([\w/:-]+)$/i.test(name); }; export default validSSMParamName; diff --git a/src/shared/helpers/warnAboutVersionDiff.ts b/src/shared/helpers/warnAboutVersionDiff.ts index 0eb7fb3..d700a31 100644 --- a/src/shared/helpers/warnAboutVersionDiff.ts +++ b/src/shared/helpers/warnAboutVersionDiff.ts @@ -37,6 +37,7 @@ const warnAboutVersionDiff = ( if (!semver.valid(v1) || !semver.valid(v2)) { return true; } + // warn if diff is greater than a patch version return !semver.satisfies(v1, `${v2.slice(0, -1)}x`); }; diff --git a/src/shared/types/CacclConfSchema.ts b/src/shared/types/CacclConfSchema.ts index dc42e56..43c1c1d 100644 --- a/src/shared/types/CacclConfSchema.ts +++ b/src/shared/types/CacclConfSchema.ts @@ -3,10 +3,10 @@ * @author Benedikt Arnarsson */ type CacclConfSchema = { - ssmRootPrefix: string; - ecrAccessRoleArn: string; cfnStackPrefix: string; + ecrAccessRoleArn: string; productionAccounts: string[]; + ssmRootPrefix: string; }; export default CacclConfSchema; diff --git a/src/shared/types/EcrImage.ts b/src/shared/types/EcrImage.ts index 1380b89..74ade2f 100644 --- a/src/shared/types/EcrImage.ts +++ b/src/shared/types/EcrImage.ts @@ -3,11 +3,11 @@ * @author Benedikt ARnarsson */ type EcrImage = { - service: string; - region: string; account: string; - repoName: string; imageTag: string; + region: string; + repoName: string; + service: string; }; export default EcrImage; diff --git a/src/shared/types/SecretOpts.ts b/src/shared/types/SecretOpts.ts index 0aa9e58..b240355 100644 --- a/src/shared/types/SecretOpts.ts +++ b/src/shared/types/SecretOpts.ts @@ -4,8 +4,8 @@ * @author Benedikt Arnarsson */ type SecretOpts = { - Name: string; Description: string; + Name: string; SecretString: string; }; diff --git a/src/types/CacclAppEnvironmentProps.ts b/src/types/CacclAppEnvironmentProps.ts index 64a5c52..26f895f 100644 --- a/src/types/CacclAppEnvironmentProps.ts +++ b/src/types/CacclAppEnvironmentProps.ts @@ -1,4 +1,3 @@ -// TODO: JSDoc type CacclAppEnvironmentProps = { envVars: { [key: string]: string }; }; diff --git a/src/types/CacclCacheOptions.ts b/src/types/CacclCacheOptions.ts index e1396ff..ebdfacf 100644 --- a/src/types/CacclCacheOptions.ts +++ b/src/types/CacclCacheOptions.ts @@ -2,12 +2,11 @@ import { z } from 'zod'; const CacclCacheOptions = z.object({ + cacheNodeType: z.string().optional(), engine: z.string(), numCacheNodes: z.number().optional(), - cacheNodeType: z.string().optional(), }); -// TODO: JSDoc type CacclCacheOptions = z.infer; export default CacclCacheOptions; diff --git a/src/types/CacclCacheProps.ts b/src/types/CacclCacheProps.ts index e3a982b..659cd5f 100644 --- a/src/types/CacclCacheProps.ts +++ b/src/types/CacclCacheProps.ts @@ -5,11 +5,10 @@ import { aws_ec2 as ec2 } from 'aws-cdk-lib'; import CacclCacheOptions from './CacclCacheOptions.js'; import ICacclAppEnvironment from './ICacclAppEnvironment.js'; -// TODO: JSDoc type CacclCacheProps = { - vpc: ec2.Vpc; - options: CacclCacheOptions; appEnv: ICacclAppEnvironment; + options: CacclCacheOptions; + vpc: ec2.Vpc; }; export default CacclCacheProps; diff --git a/src/types/CacclDbOptions.ts b/src/types/CacclDbOptions.ts index 5c2f2e6..6593035 100644 --- a/src/types/CacclDbOptions.ts +++ b/src/types/CacclDbOptions.ts @@ -5,25 +5,24 @@ import { z } from 'zod'; import CacclDbEngine from './CacclDbEngine.js'; const CacclDbOptions = z.object({ + // only used by mysql, provisioning will create the named database + databaseName: z.string().optional(), // currently either 'docdb' or 'mysql' engine: CacclDbEngine, - // see the aws docs for supported types - instanceType: z.string().optional(), - // > 1 will get you multi-az - instanceCount: z.number().optional(), // use a non-default engine version (shouldn't be necessary) engineVersion: z.string().optional(), + // > 1 will get you multi-az + instanceCount: z.number().optional(), + // see the aws docs for supported types + instanceType: z.string().optional(), // use a non-default parameter group family (also unnecessary) parameterGroupFamily: z.string().optional(), // only used by docdb, turns on extra profiling profiler: z.boolean().optional(), - // only used by mysql, provisioning will create the named database - databaseName: z.string().optional(), // removal policy controls what happens to the db if it's replaced or otherwise stops being managed by CloudFormation removalPolicy: z.string().optional(), }); -// TODO: JSDoc type CacclDbOptions = z.infer; export default CacclDbOptions; diff --git a/src/types/CacclDbProps.ts b/src/types/CacclDbProps.ts index ba46c39..b4e51c8 100644 --- a/src/types/CacclDbProps.ts +++ b/src/types/CacclDbProps.ts @@ -4,11 +4,11 @@ import CacclDbOptions from './CacclDbOptions.js'; import ICacclAppEnvironment from './ICacclAppEnvironment.js'; type CacclDbProps = { - // the vpc the db will be put into - vpc: ec2.Vpc; - options: CacclDbOptions; // so that we can add this construct's environment variables appEnv: ICacclAppEnvironment; + options: CacclDbOptions; + // the vpc the db will be put into + vpc: ec2.Vpc; }; export default CacclDbProps; diff --git a/src/types/CacclDeployStackProps.ts b/src/types/CacclDeployStackProps.ts index d636d1e..dbc322a 100644 --- a/src/types/CacclDeployStackProps.ts +++ b/src/types/CacclDeployStackProps.ts @@ -9,22 +9,21 @@ import CacclNotificationsProps from './CacclNotificationsProps.js'; import CacclScheduledTask from './CacclScheduledTask.js'; import CacclTaskDefProps from './CacclTaskDefProps.js'; -// TODO: JSDoc interface CacclDeployStackProps extends StackProps { - vpcId?: string; - certificateArn?: string; - ecsClusterName?: string; - appEnvironment: Record; - taskDefProps: CacclTaskDefProps; - taskCount: number; - notifications: Partial; albLogBucketName?: string; + appEnvironment: Record; cacheOptions?: CacclCacheOptions; + certificateArn?: string; dbOptions?: CacclDbOptions; - scheduledTasks?: Record; - lbOptions?: CacclLoadBalancerExtraOptions; - firewallSgId?: string; + ecsClusterName?: string; enableExecuteCommand?: boolean; + firewallSgId?: string; + lbOptions?: CacclLoadBalancerExtraOptions; + notifications: Partial; + scheduledTasks?: Record; + taskCount: number; + taskDefProps: CacclTaskDefProps; + vpcId?: string; } export default CacclDeployStackProps; diff --git a/src/types/CacclDeployStackPropsData.ts b/src/types/CacclDeployStackPropsData.ts index 01c10cf..bf7f150 100644 --- a/src/types/CacclDeployStackPropsData.ts +++ b/src/types/CacclDeployStackPropsData.ts @@ -5,15 +5,15 @@ import { z } from 'zod'; import DeployConfigData from './DeployConfigData.js'; const CacclDeployStackPropsData = z.object({ - stackName: z.string(), - vpcId: z.string().optional(), - ecsClusterName: z.string().optional(), albLogBucketName: z.string().optional(), - awsRegion: z.string().optional(), awsAccountId: z.string().optional(), + awsRegion: z.string().optional(), cacclDeployVersion: z.string(), - deployConfigHash: z.string(), deployConfig: DeployConfigData, + deployConfigHash: z.string(), + ecsClusterName: z.string().optional(), + stackName: z.string(), + vpcId: z.string().optional(), }); type CacclDeployStackPropsData = z.infer; diff --git a/src/types/CacclGitRepoVolumeContainerProps.ts b/src/types/CacclGitRepoVolumeContainerProps.ts index 9a0b2aa..a3ed8a9 100644 --- a/src/types/CacclGitRepoVolumeContainerProps.ts +++ b/src/types/CacclGitRepoVolumeContainerProps.ts @@ -2,10 +2,10 @@ import { aws_ecs as ecs } from 'aws-cdk-lib'; type CacclGitRepoVolumeContainerProps = { - taskDefinition: ecs.TaskDefinition; appContainer: ecs.ContainerDefinition; - repoUrlSecretArn: string; appContainerPath: string; + repoUrlSecretArn: string; + taskDefinition: ecs.TaskDefinition; }; export default CacclGitRepoVolumeContainerProps; diff --git a/src/types/CacclLoadBalancerExtraOptions.ts b/src/types/CacclLoadBalancerExtraOptions.ts index 216f261..65f3b43 100644 --- a/src/types/CacclLoadBalancerExtraOptions.ts +++ b/src/types/CacclLoadBalancerExtraOptions.ts @@ -6,7 +6,6 @@ const CacclLoadBalancerExtraOptions = z.object({ targetDeregistrationDelay: z.number().optional(), }); -// TODO: JSDoc type CacclLoadBalancerExtraOptions = z.infer< typeof CacclLoadBalancerExtraOptions >; diff --git a/src/types/CacclLoadBalancerProps.ts b/src/types/CacclLoadBalancerProps.ts index 5d50750..1cc0a10 100644 --- a/src/types/CacclLoadBalancerProps.ts +++ b/src/types/CacclLoadBalancerProps.ts @@ -5,15 +5,14 @@ import { aws_ec2 as ec2, aws_ecs as ecs } from 'aws-cdk-lib'; import CacclLoadBalancerExtraOptions from './CacclLoadBalancerExtraOptions.js'; import LoadBalancerSecurityGroups from './LoadBalancerSecurityGroups.js'; -// TODO: JSDoc type CacclLoadBalancerProps = { - vpc: ec2.Vpc; - securityGroups: LoadBalancerSecurityGroups; - certificateArn?: string; - loadBalancerTarget: ecs.IEcsLoadBalancerTarget; albLogBucketName?: string; + certificateArn?: string; extraOptions?: CacclLoadBalancerExtraOptions; + loadBalancerTarget: ecs.IEcsLoadBalancerTarget; + securityGroups: LoadBalancerSecurityGroups; targetDeregistrationDelay?: number; // in seconds + vpc: ec2.Vpc; }; export default CacclLoadBalancerProps; diff --git a/src/types/CacclMonitoringProps.ts b/src/types/CacclMonitoringProps.ts index 2c191ab..d7a12ad 100644 --- a/src/types/CacclMonitoringProps.ts +++ b/src/types/CacclMonitoringProps.ts @@ -2,7 +2,6 @@ import ICacclLoadBalancer from './ICacclLoadBalancer.js'; import ICacclService from './ICacclService.js'; -// TODO: JSDoc type CacclMonitoringProps = { cacclLoadBalancer: ICacclLoadBalancer; cacclService: ICacclService; diff --git a/src/types/CacclNotificationsProps.ts b/src/types/CacclNotificationsProps.ts index 5db6437..5898442 100644 --- a/src/types/CacclNotificationsProps.ts +++ b/src/types/CacclNotificationsProps.ts @@ -11,11 +11,10 @@ const CacclNotificationsProps = z.object({ slack: z.string().optional(), }); -// TODO: JSDoc -type CacclNotificationsProps = z.infer & { - service: ICacclService; - loadBalancer: ICacclLoadBalancer; +type CacclNotificationsProps = { db?: ICacclDb; -}; + loadBalancer: ICacclLoadBalancer; + service: ICacclService; +} & z.infer; export default CacclNotificationsProps; diff --git a/src/types/CacclScheduledTask.ts b/src/types/CacclScheduledTask.ts index ebd8bed..4f0454b 100644 --- a/src/types/CacclScheduledTask.ts +++ b/src/types/CacclScheduledTask.ts @@ -2,12 +2,11 @@ import { z } from 'zod'; const CacclScheduledTask = z.object({ + command: z.string(), description: z.string().optional(), schedule: z.string(), - command: z.string(), }); -// TODO: JSDoc type CacclScheduledTask = z.infer; export default CacclScheduledTask; diff --git a/src/types/CacclScheduledTasksProps.ts b/src/types/CacclScheduledTasksProps.ts index 5df3d32..5702650 100644 --- a/src/types/CacclScheduledTasksProps.ts +++ b/src/types/CacclScheduledTasksProps.ts @@ -4,13 +4,12 @@ import { aws_ec2 as ec2, aws_ecs as ecs } from 'aws-cdk-lib'; // Import types import CacclScheduledTask from './CacclScheduledTask.js'; -// TODO: JSDoc type CacclScheduledTasksProps = { - vpc: ec2.Vpc; - scheduledTasks: { [key: string]: CacclScheduledTask }; clusterName: string; + scheduledTasks: { [key: string]: CacclScheduledTask }; serviceName: string; taskDefinition: ecs.FargateTaskDefinition; + vpc: ec2.Vpc; }; export default CacclScheduledTasksProps; diff --git a/src/types/CacclServiceProps.ts b/src/types/CacclServiceProps.ts index ec8b29f..0a54fad 100644 --- a/src/types/CacclServiceProps.ts +++ b/src/types/CacclServiceProps.ts @@ -6,10 +6,10 @@ import ICacclTaskDef from './ICacclTaskDef.js'; type CacclServiceProps = { cluster: ecs.Cluster; - taskDef: ICacclTaskDef; - taskCount: number; - loadBalancerSg: ec2.SecurityGroup; enableExecuteCommand?: boolean; + loadBalancerSg: ec2.SecurityGroup; + taskCount: number; + taskDef: ICacclTaskDef; }; export default CacclServiceProps; diff --git a/src/types/CacclSshBastionProps.ts b/src/types/CacclSshBastionProps.ts index c9a17c2..bec2f79 100644 --- a/src/types/CacclSshBastionProps.ts +++ b/src/types/CacclSshBastionProps.ts @@ -1,10 +1,9 @@ // Import AWS cdk-lib import { aws_ec2 as ec2 } from 'aws-cdk-lib'; -// TODO: JSDoc type CacclSshBastionProps = { - vpc: ec2.Vpc; sg: ec2.SecurityGroup; + vpc: ec2.Vpc; }; export default CacclSshBastionProps; diff --git a/src/types/CacclTaskDefProps.ts b/src/types/CacclTaskDefProps.ts index ef49048..de01ab0 100644 --- a/src/types/CacclTaskDefProps.ts +++ b/src/types/CacclTaskDefProps.ts @@ -1,16 +1,15 @@ // Import types import ICacclAppEnvironment from './ICacclAppEnvironment.js'; -// TODO: JSDoc type CacclTaskDefProps = { + appEnvironment?: ICacclAppEnvironment; appImage: string; + gitRepoVolume?: Record; + logRetentionDays?: number; proxyImage?: string; - vpcCidrBlock?: string; - appEnvironment?: ICacclAppEnvironment; taskCpu?: number; taskMemory?: number; - logRetentionDays?: number; - gitRepoVolume?: Record; + vpcCidrBlock?: string; }; export default CacclTaskDefProps; diff --git a/src/types/DeployConfigData.ts b/src/types/DeployConfigData.ts index 52a5b17..d620bd7 100644 --- a/src/types/DeployConfigData.ts +++ b/src/types/DeployConfigData.ts @@ -9,32 +9,32 @@ import CacclNotificationsProps from './CacclNotificationsProps.js'; import CacclScheduledTask from './CacclScheduledTask.js'; const DeployConfigData = z.object({ + appEnvironment: z.object({}).catchall(z.string()).optional(), // appImage: z.string(), - proxyImage: z.string().optional(), - taskCpu: z.number().optional(), - taskMemory: z.number().optional(), - logRetentionDays: z.number().optional(), - gitRepoVolume: z.object({}).catchall(z.string()).optional(), - // CloudFormation infrastructure stack name - infraStackName: z.string(), - // Container image ARN - notifications: CacclNotificationsProps.optional(), - certificateArn: z.string().optional(), - appEnvironment: z.object({}).catchall(z.string()).optional(), - tags: z.object({}).catchall(z.string()).optional(), - scheduledTasks: z.object({}).catchall(CacclScheduledTask).optional(), - taskCount: z.string(), - firewallSgId: z.string().optional(), - lbOptions: CacclLoadBalancerExtraOptions.optional(), cacheOptions: CacclCacheOptions.optional(), + certificateArn: z.string().optional(), dbOptions: CacclDbOptions.optional(), - enableExecuteCommand: z.union([z.string(), z.boolean()]).optional(), // DEPRECATED: docDb: z.any(), docDbInstanceCount: z.number().optional(), docDbInstanceType: z.string().optional(), docDbProfiler: z.boolean().optional(), + enableExecuteCommand: z.union([z.string(), z.boolean()]).optional(), + firewallSgId: z.string().optional(), + gitRepoVolume: z.object({}).catchall(z.string()).optional(), + // CloudFormation infrastructure stack name + infraStackName: z.string(), + lbOptions: CacclLoadBalancerExtraOptions.optional(), + logRetentionDays: z.number().optional(), + // Container image ARN + notifications: CacclNotificationsProps.optional(), + proxyImage: z.string().optional(), + scheduledTasks: z.object({}).catchall(CacclScheduledTask).optional(), + tags: z.object({}).catchall(z.string()).optional(), + taskCount: z.string(), + taskCpu: z.number().optional(), + taskMemory: z.number().optional(), }); /** diff --git a/src/types/ICacclAppEnvironment.ts b/src/types/ICacclAppEnvironment.ts index 8cd7655..63ab1ec 100644 --- a/src/types/ICacclAppEnvironment.ts +++ b/src/types/ICacclAppEnvironment.ts @@ -3,11 +3,11 @@ import { aws_ecs as ecs } from 'aws-cdk-lib'; interface ICacclAppEnvironment { - env: Record; - secrets: Record; - addEnvironmentVar(k: string, v: string): void; addSecret(k: string, secret: ecs.Secret): void; + + env: Record; + secrets: Record; } export default ICacclAppEnvironment; diff --git a/src/types/ICacclDb.ts b/src/types/ICacclDb.ts index 86c2bcc..75cbd7e 100644 --- a/src/types/ICacclDb.ts +++ b/src/types/ICacclDb.ts @@ -1,45 +1,31 @@ /* eslint-disable no-unused-vars */ import { + RemovalPolicy, aws_cloudwatch as cloudwatch, aws_docdb as docdb, aws_ec2 as ec2, aws_rds as rds, aws_secretsmanager as secretsmanager, - RemovalPolicy, } from 'aws-cdk-lib'; interface ICacclDb { - // the hostname of the cluster's endpoint - host: string; - - // cluster endpoint port - port: string; + addSecurityGroupIngress(vpcCidrBlock: string): void; - // will get the generated master password for the db - dbPasswordSecret: secretsmanager.Secret; + // collection of cloudwatch metric alarms + alarms: cloudwatch.Alarm[]; - // overrides that get set in the cluster-level parameter group, // e.g. enabling performance monitoring clusterParameterGroupParams: Record; - // overrides for the instance-level param group - // e.g. turning on slow query logging - instanceParameterGroupParams: Record; + // overrides that get set in the cluster-level parameter group, + createMetricsAndAlarms(): void; + // overrides for the instance-level param group // the actual cluster construct dbCluster: docdb.DatabaseCluster | rds.DatabaseCluster; - // cloudwatch metrics namespace - metricNamespace: string; - - // collection of metric constructs - metrics: { [key: string]: cloudwatch.Metric[] }; - - // collection of cloudwatch metric alarms - alarms: cloudwatch.Alarm[]; - - // basic removal policy for the cluster/instances - removalPolicy: RemovalPolicy; + // will get the generated master password for the db + dbPasswordSecret: secretsmanager.Secret; // the database security group dbSg: ec2.SecurityGroup; @@ -47,9 +33,23 @@ interface ICacclDb { // the "etcetera" policy for the parameter group(s) and security group etcRemovalPolicy: RemovalPolicy; - addSecurityGroupIngress(vpcCidrBlock: string): void; - createMetricsAndAlarms(): void; getDashboardLink(): string; + + // the hostname of the cluster's endpoint + host: string; + + // e.g. turning on slow query logging + instanceParameterGroupParams: Record; + + // cloudwatch metrics namespace + metricNamespace: string; + + // collection of metric constructs + metrics: { [key: string]: cloudwatch.Metric[] }; + // cluster endpoint port + port: string; + // basic removal policy for the cluster/instances + removalPolicy: RemovalPolicy; } export default ICacclDb; diff --git a/src/types/ICacclLoadBalancer.ts b/src/types/ICacclLoadBalancer.ts index 9a04132..4c2cd41 100644 --- a/src/types/ICacclLoadBalancer.ts +++ b/src/types/ICacclLoadBalancer.ts @@ -3,15 +3,14 @@ import { aws_elasticloadbalancingv2 as elb, } from 'aws-cdk-lib'; -// TODO: JSDoc interface ICacclLoadBalancer { - loadBalancer: elb.ApplicationLoadBalancer; + alarms: cloudwatch.Alarm[]; httpsListener: elb.ApplicationListener; - metrics: Record; + loadBalancer: elb.ApplicationLoadBalancer; - alarms: cloudwatch.Alarm[]; + metrics: Record; } export default ICacclLoadBalancer; diff --git a/src/types/ICacclService.ts b/src/types/ICacclService.ts index 8ce395d..42d0929 100644 --- a/src/types/ICacclService.ts +++ b/src/types/ICacclService.ts @@ -1,11 +1,11 @@ import { aws_cloudwatch as cloudwatch, aws_ecs as ecs } from 'aws-cdk-lib'; interface ICacclService { - loadBalancerTarget: ecs.IEcsLoadBalancerTarget; + alarms: cloudwatch.Alarm[]; ecsService: ecs.FargateService; - alarms: cloudwatch.Alarm[]; + loadBalancerTarget: ecs.IEcsLoadBalancerTarget; } export default ICacclService; diff --git a/src/types/ICacclTaskDef.ts b/src/types/ICacclTaskDef.ts index 6c6a281..3fccfaa 100644 --- a/src/types/ICacclTaskDef.ts +++ b/src/types/ICacclTaskDef.ts @@ -1,15 +1,15 @@ import { aws_ecs as ecs, aws_logs as logs } from 'aws-cdk-lib'; interface ICacclTaskDef { - taskDef: ecs.FargateTaskDefinition; + appContainer: ecs.ContainerDefinition; appOnlyTaskDef: ecs.FargateTaskDefinition; - proxyContainer: ecs.ContainerDefinition; + logGroup: logs.LogGroup; - appContainer: ecs.ContainerDefinition; + proxyContainer: ecs.ContainerDefinition; - logGroup: logs.LogGroup; + taskDef: ecs.FargateTaskDefinition; } export default ICacclTaskDef; diff --git a/src/types/LoadBalancerSecurityGroups.ts b/src/types/LoadBalancerSecurityGroups.ts index da81c31..3fbcb89 100644 --- a/src/types/LoadBalancerSecurityGroups.ts +++ b/src/types/LoadBalancerSecurityGroups.ts @@ -1,10 +1,9 @@ // Import AWS CDK lib import { aws_ec2 as ec2 } from 'aws-cdk-lib'; -// TODO: JSDoc type LoadBalancerSecurityGroups = { - primary?: ec2.SecurityGroup; misc?: ec2.SecurityGroup; + primary?: ec2.SecurityGroup; }; export default LoadBalancerSecurityGroups; diff --git a/src/types/index.ts b/src/types/index.ts index fd82e20..ea5ba44 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -3,58 +3,30 @@ * @author Benedikt Arnarsson */ -import type CacclAppEnvironmentProps from './CacclAppEnvironmentProps.js'; -import CacclCacheOptions from './CacclCacheOptions.js'; -import type CacclCacheProps from './CacclCacheProps.js'; -import type CacclContainerImageOptions from './CacclContainerImageOptions.js'; -import CacclDbEngine from './CacclDbEngine.js'; -import CacclDbOptions from './CacclDbOptions.js'; -import type CacclDbProps from './CacclDbProps.js'; -import type CacclDeployStackProps from './CacclDeployStackProps.js'; -import CacclDeployStackPropsData from './CacclDeployStackPropsData.js'; -import type CacclGitRepoVolumeContainerProps from './CacclGitRepoVolumeContainerProps.js'; -import CacclLoadBalancerExtraOptions from './CacclLoadBalancerExtraOptions.js'; -import type CacclLoadBalancerProps from './CacclLoadBalancerProps.js'; -import type CacclMonitoringProps from './CacclMonitoringProps.js'; -import CacclNotificationsProps from './CacclNotificationsProps.js'; -import type CacclScheduledTask from './CacclScheduledTask.js'; -import type CacclScheduledTasksProps from './CacclScheduledTasksProps.js'; -import type CacclServiceProps from './CacclServiceProps.js'; -import type CacclSshBastionProps from './CacclSshBastionProps.js'; -import type CacclTaskDefProps from './CacclTaskDefProps.js'; -import DeployConfigData from './DeployConfigData.js'; -import type ICacclAppEnvironment from './ICacclAppEnvironment.js'; -import type ICacclDb from './ICacclDb.js'; -import type ICacclLoadBalancer from './ICacclLoadBalancer.js'; -import type ICacclService from './ICacclService.js'; -import type ICacclTaskDef from './ICacclTaskDef.js'; -import type LoadBalancerSecurityGroups from './LoadBalancerSecurityGroups.js'; +export { type default as CacclAppEnvironmentProps } from './CacclAppEnvironmentProps.js'; +export { default as CacclCacheOptions } from './CacclCacheOptions.js'; +export { type default as CacclCacheProps } from './CacclCacheProps.js'; +export { type default as CacclContainerImageOptions } from './CacclContainerImageOptions.js'; +export { default as CacclDbEngine } from './CacclDbEngine.js'; +export { default as CacclDbOptions } from './CacclDbOptions.js'; -export { - CacclAppEnvironmentProps, - CacclCacheOptions, - CacclCacheProps, - CacclContainerImageOptions, - CacclDbEngine, - CacclDbOptions, - CacclDbProps, - CacclDeployStackProps, - CacclDeployStackPropsData, - CacclGitRepoVolumeContainerProps, - CacclLoadBalancerExtraOptions, - CacclLoadBalancerProps, - CacclMonitoringProps, - CacclNotificationsProps, - CacclScheduledTask, - CacclScheduledTasksProps, - CacclServiceProps, - CacclSshBastionProps, - CacclTaskDefProps, - DeployConfigData, - ICacclAppEnvironment, - ICacclDb, - ICacclLoadBalancer, - ICacclService, - ICacclTaskDef, - LoadBalancerSecurityGroups, -}; +export { type default as CacclDbProps } from './CacclDbProps.js'; +export { type default as CacclDeployStackProps } from './CacclDeployStackProps.js'; +export { default as CacclDeployStackPropsData } from './CacclDeployStackPropsData.js'; +export { type default as CacclGitRepoVolumeContainerProps } from './CacclGitRepoVolumeContainerProps.js'; +export { default as CacclLoadBalancerExtraOptions } from './CacclLoadBalancerExtraOptions.js'; +export { type default as CacclLoadBalancerProps } from './CacclLoadBalancerProps.js'; +export { type default as CacclMonitoringProps } from './CacclMonitoringProps.js'; +export { default as CacclNotificationsProps } from './CacclNotificationsProps.js'; +export { type default as CacclScheduledTask } from './CacclScheduledTask.js'; +export { type default as CacclScheduledTasksProps } from './CacclScheduledTasksProps.js'; +export { type default as CacclServiceProps } from './CacclServiceProps.js'; +export { type default as CacclSshBastionProps } from './CacclSshBastionProps.js'; +export { type default as CacclTaskDefProps } from './CacclTaskDefProps.js'; +export { default as DeployConfigData } from './DeployConfigData.js'; +export { type default as ICacclAppEnvironment } from './ICacclAppEnvironment.js'; +export { type default as ICacclDb } from './ICacclDb.js'; +export { type default as ICacclLoadBalancer } from './ICacclLoadBalancer.js'; +export { type default as ICacclService } from './ICacclService.js'; +export { type default as ICacclTaskDef } from './ICacclTaskDef.js'; +export { type default as LoadBalancerSecurityGroups } from './LoadBalancerSecurityGroups.js'; diff --git a/test/commands/apps.test.ts b/test/commands/apps.test.ts index 30784c2..bebf19f 100644 --- a/test/commands/apps.test.ts +++ b/test/commands/apps.test.ts @@ -32,7 +32,9 @@ describe('apps', () => { const { error, stdout, stderr } = await runCommand('apps'); // Assert - expect(stdout).to.equal(`${table([['App'], ['test-app-1'], ['test-app-3']])}\n`) + expect(stdout).to.contain( + `${table([['App'], ['test-app-1'], ['test-app-3']])}\n`, + ); // No errors expect(stderr).to.equal(''); diff --git a/test/commands/images.test.ts b/test/commands/images.test.ts index 82079ee..fdd75fe 100644 --- a/test/commands/images.test.ts +++ b/test/commands/images.test.ts @@ -44,7 +44,11 @@ describe('images', () => { expect(stdout).to.equal( `${table([ ['Pushed On', 'Tags', 'ARNs'], - [moment(1725416968).format(), 'main', 'arn:aws:ecr:us-east-1:test-registry-id:repository/test:main'], + [ + moment(1725416968).format(), + 'main', + 'arn:aws:ecr:us-east-1:test-registry-id:repository/test:main', + ], ])}\n`, ); @@ -86,9 +90,21 @@ describe('images', () => { expect(stdout).to.equal( `${table([ ['Pushed On', 'Tags', 'ARNs'], - [moment(1725416968).format(), 'main', 'arn:aws:ecr:us-east-1:test-registry-id:repository/test:main'], - [moment(1725416068).format(), '1.0', 'arn:aws:ecr:us-east-1:test-registry-id:repository/test:1.0'], - [moment(1725410968).format(), 'feature/test', 'arn:aws:ecr:us-east-1:test-registry-id:repository/test:feature/test'], + [ + moment(1725416968).format(), + 'main', + 'arn:aws:ecr:us-east-1:test-registry-id:repository/test:main', + ], + [ + moment(1725416068).format(), + '1.0', + 'arn:aws:ecr:us-east-1:test-registry-id:repository/test:1.0', + ], + [ + moment(1725410968).format(), + 'feature/test', + 'arn:aws:ecr:us-east-1:test-registry-id:repository/test:feature/test', + ], ])}\n`, ); diff --git a/test/commands/repos.test.ts b/test/commands/repos.test.ts index 38dabb0..66b415b 100644 --- a/test/commands/repos.test.ts +++ b/test/commands/repos.test.ts @@ -51,12 +51,7 @@ describe('repos', () => { expect(error.message).to.equal('EEXIT: 0'); } expect(stdout).to.contain( - table([ - ['Repository Name'], - ['test-1'], - ['test-2'], - ['test-3'], - ]), + table([['Repository Name'], ['test-1'], ['test-2'], ['test-3']]), ); }); -}) +}); diff --git a/test/hooks.ts b/test/hooks.ts index 2d87c6e..586905e 100644 --- a/test/hooks.ts +++ b/test/hooks.ts @@ -31,7 +31,10 @@ const mochaHooks = { const awsCredPath = path.join(tempDir, 'credentials'); process.env.AWS_SHARED_CREDENTIALS_FILE = awsCredPath; - fs.writeFileSync(awsCredPath, '[default]\naws_access_key_id=fakeaccesskeyid\naws_secret_access_key=fakeaccesskey'); + fs.writeFileSync( + awsCredPath, + '[default]\naws_access_key_id=fakeaccesskeyid\naws_secret_access_key=fakeaccesskey', + ); // Setup config setConfigDefaults(); @@ -40,9 +43,7 @@ const mochaHooks = { afterEach() { // @ts-ignore AWSMock.restore(); - } + }, }; -export { - mochaHooks, -}; \ No newline at end of file +export { mochaHooks }; diff --git a/test/tsconfig.json b/test/tsconfig.json index 95898fc..460cf36 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -3,7 +3,5 @@ "compilerOptions": { "noEmit": true }, - "references": [ - {"path": ".."} - ] + "references": [{ "path": ".." }] } diff --git a/tsconfig.json b/tsconfig.json index 5c1c3c8..182f6db 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,8 +19,8 @@ "inlineSourceMap": true, "inlineSources": true, "experimentalDecorators": true, - "strictPropertyInitialization":false -}, + "strictPropertyInitialization": false + }, "include": ["./src/**/*", "src/types/**/*"], "ts-node": { "esm": true