diff --git a/.github/auto-assign-config.yml b/.github/auto-assign-config.yml index a6f9e810..6e4d849d 100644 --- a/.github/auto-assign-config.yml +++ b/.github/auto-assign-config.yml @@ -3,7 +3,5 @@ addReviewers: true addAssignees: author reviewers: - - Shreyas-vgr - - doiron - - tkm22 + - tydonelson - CamdenFoucht diff --git a/.github/workflows/functional-test-clean-up.yml b/.github/workflows/functional-test-clean-up.yml index 9bde89b5..cc5a9729 100644 --- a/.github/workflows/functional-test-clean-up.yml +++ b/.github/workflows/functional-test-clean-up.yml @@ -11,9 +11,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: '16.x' - run: npm install diff --git a/.github/workflows/functional-test.yml b/.github/workflows/functional-test.yml index fdb61185..b8a22dfb 100644 --- a/.github/workflows/functional-test.yml +++ b/.github/workflows/functional-test.yml @@ -11,9 +11,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: '16.x' - run: git config --global user.email "ask-cli-test@amazon.com" diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 77df3142..e55be7e3 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -13,12 +13,11 @@ on: jobs: build: - runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - node: [16] + node: [16, 18] steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node }} @@ -26,7 +25,7 @@ jobs: with: node-version: ${{ matrix.node }} - name: Set up Python 3.x - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: '3.x' - run: npm install diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index ae0f1cdb..286f473f 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -2,7 +2,7 @@ name: Unit Test on: push: - branches: + branches: - master - develop paths-ignore: @@ -13,13 +13,11 @@ on: jobs: build: - runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - node: [14, 16] - + node: [16, 18] steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node }} diff --git a/.prettierignore b/.prettierignore index 945997df..a268fb00 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,3 +5,5 @@ node_modules docs scripts *.md +coverage +.nyc_output/ diff --git a/CHANGELOG.md b/CHANGELOG.md index c34773dd..930b8748 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,72 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [2.30.7](https://github.com/alexa/ask-cli/compare/v2.30.6...v2.30.7) (2024-02-07) + + +### Bug Fixes + +* grammatical error in deploy message ([#502](https://github.com/alexa/ask-cli/issues/502)) ([3067f13](https://github.com/alexa/ask-cli/commit/3067f13dabaf60b02c7a60ff07566520dfa1c339)) +* update hosted skills default python version to 3.8 ([#501](https://github.com/alexa/ask-cli/pull/501)) ([6b15c51](https://github.com/alexa/ask-cli/commit/6b15c518acbbdd2a50628b94b1e9709bfd8386c6)) + +### [2.30.6](https://github.com/alexa/ask-cli/compare/v2.30.5...v2.30.6) (2023-12-09) + +### Features + +* add ASK_FORCE_ENABLE to allow skipping domain validation during enablement ([487f8db](https://github.com/alexa/ask-cli/commit/487f8dbcdc9429d04b6fd475aa4a2a8430831f1f)) + +### Bug Fixes + +* display message property for all error instance types ([a0d2f19](https://github.com/alexa/ask-cli/commit/a0d2f19faeee36523be701522585272cff2a2d6d)) +* use npm registry https url ([9e92ee5](https://github.com/alexa/ask-cli/commit/9e92ee5bf9aedcba1f683c1db877d0a9c1442cae)) + +### [2.30.5](https://github.com/alexa/ask-cli/compare/v2.30.4...v2.30.5) (2023-08-09) + + +### Bug Fixes + +* deploy skill package when icon uri path relative to its asset files ([#487](https://github.com/alexa/ask-cli/issues/487)) ([4b6ac2f](https://github.com/alexa/ask-cli/commit/4b6ac2ff8cd8b6511bdcf42938f05518ecf31361)) +* display warning object message correctly ([#488](https://github.com/alexa/ask-cli/issues/488)) ([abbdc57](https://github.com/alexa/ask-cli/commit/abbdc574df25757990d2101d931cc6d063f64af2)) +* skill-id option for legacy skills not supported ([#489](https://github.com/alexa/ask-cli/issues/489)) ([3a71908](https://github.com/alexa/ask-cli/commit/3a719081e613f5a03d119b2cd8e32f35df15825e)) + +### [2.30.4](https://github.com/alexa/ask-cli/compare/v2.30.3...v2.30.4) (2023-06-23) + + +### Bug Fixes + +* fix: Local Credential Hijacking fix (part 2) [#475](https://github.com/alexa/ask-cli/pull/475) ([e096f42](https://github.com/alexa/ask-cli/pull/482/commits/e096f425edcd79e0233113d03961da388e9e695a)) + +### [2.30.3](https://github.com/alexa/ask-cli/compare/v2.30.2...v2.30.3) (2023-06-23) + + +### Bug Fixes + +* updating axios to resolve issue [#480](https://github.com/alexa/ask-cli/issues/480) ([5502acf](https://github.com/alexa/ask-cli/commit/5502acf546f46a81b4d7a2fe41100edd40fa8d9a)) + +### [2.30.2](https://github.com/alexa/ask-cli/compare/v2.30.1...v2.30.2) (2023-06-22) + + +### Bug Fixes + +* prevent errors to be displayed as [Error]: [object Object] ([767e104](https://github.com/alexa/ask-cli/commit/767e10481fb7230c6748f784c6d5e6a483508950)) + +## [2.30.0](https://github.com/alexa/ask-cli/compare/v2.29.1...v2.30.0) (2023-05-22) + + +### Features + +- **Breaking:** add proxy support for smapi commands [#434](https://github.com/alexa/ask-cli/issues/434) ([fd20898](https://github.com/alexa/ask-cli/commit/fd20898d6d87cf30ce4dc3e7a78434aac531929b)). For more information on breaking changes see [#485](https://github.com/alexa/ask-cli/issues/485) + + +### [2.29.2](https://github.com/alexa/ask-cli/compare/v2.29.1...v2.29.2) (2023-04-19) + +### Bug Fixes + +* [#455](https://github.com/alexa/ask-cli/issues/455) latest code was not waiting for nodemon ([393e36e](https://github.com/alexa/ask-cli/commit/393e36e8a9f93568befeffdeaf73edc0a3bba63f)) +* correct faulty error message for `ask smapi` command ([fb2d0d7](https://github.com/alexa/ask-cli/commit/fb2d0d782e61bf8e7dda1ca5e2283892f33c5a8e)) +* update aws sdk to v3 ([fd96a52](https://github.com/alexa/ask-cli/commit/fd96a52acd459f99b58c4483888c9713aba81815)) + + ## [2.28.0](https://github.com/alexa/ask-cli/compare/v2.27.0...v2.28.0) (2022-08-15) diff --git a/bin/askx-skill.ts b/bin/askx-skill.ts deleted file mode 100644 index 7a3eb98c..00000000 --- a/bin/askx-skill.ts +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env node - -import {commander, SKILL_COMMAND_MAP} from "../lib/commands/skill/skill-commander"; - -commander.parse(process.argv); - -if (!process.argv.slice(2).length) { - commander.outputHelp(); -} else if (SKILL_COMMAND_MAP[process.argv[2]] === undefined) { - console.error('Command not recognized. Please run "ask skill" to check the user instructions.'); - process.exit(1); -} diff --git a/bin/askx-smapi.ts b/bin/askx-smapi.ts deleted file mode 100644 index a8c69f36..00000000 --- a/bin/askx-smapi.ts +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env node - -import Messenger from "../lib/view/messenger"; -import jsonView from "../lib/view/json-view"; -import {makeSmapiCommander} from "../lib/commands/smapi/smapi-commander"; - -const commander = makeSmapiCommander(); - -if (!process.argv.slice(2).length) { - commander.outputHelp(); -} else { - commander - .parseAsync(process.argv) - .then((result) => Messenger.getInstance().info(result)) - .catch((err) => { - Messenger.getInstance().error(jsonView.toString(err)); - process.exit(1); - }); -} diff --git a/bin/askx-util.ts b/bin/askx-util.ts deleted file mode 100644 index e0fcd518..00000000 --- a/bin/askx-util.ts +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env node -import {commander, UTIL_COMMAND_MAP} from "../lib/commands/util/util-commander"; - -commander.parse(process.argv); - -if (!process.argv.slice(2).length) { - commander.outputHelp(); -} else if (UTIL_COMMAND_MAP[process.argv[2]] === undefined) { - console.error('Command not recognized. Please run "ask util" to check the user instructions.'); - process.exit(1); -} diff --git a/docs/concepts/Alexa-Hosted-Skill-Commands.md b/docs/concepts/Alexa-Hosted-Skill-Commands.md index 23253992..bb0d8dd8 100644 --- a/docs/concepts/Alexa-Hosted-Skill-Commands.md +++ b/docs/concepts/Alexa-Hosted-Skill-Commands.md @@ -14,33 +14,28 @@ Using `ask new`, the Alexa hosted skill service will create a new AWS account, w **debug**: Optional. Show debug messages. - - -## WORKFLOW: +## WORKFLOW Users will be asked the following questions to create a new skill: * Prompts user for `programming language` - * Select programming language - * AHS supports Python3.7 and Node12.x + * Select programming language + * AHS supports Python3.8 and Node16.x * Prompts user for a method to host your skill's backend resources - * Select `Alexa-hosted skills` + * Select `Alexa-hosted skills` * Prompts user for `skill name` - * Leave empty to use the default skill name `Hello World Skill` + * Leave empty to use the default skill name `hosted hello world` * Prompts user for a `folder name` for the skill project - * Leave empty to use the default folder name `HelloWorldSkill` + * Leave empty to use the default folder name `HelloWorldSkill` The user is not prompted for a `skill template`. The [Hello World Skill](https://github.com/alexa/skill-sample-nodejs-hello-world) is the only option for now. - - # DOWNLOAD SKILL - INIT COMMAND `ask init --hosted-skill-id ` -- download an existing Alexa-Hosted Skill to their local environment. This command initializes Alexa Hosted Skills by cloning the project from the hosted skill service, downloading the latest Alexa skill package, and provide a git-ready environment. Developers can then checkout, pull from, and push to a remote Git repository from their local machines. - **STRUCTURE OF INIT COMMAND:** `ask init [--hosted-skill-id ] [-p | --profile ] [--debug] [-h | --help]` @@ -53,16 +48,12 @@ This command initializes Alexa Hosted Skills by cloning the project from the hos **debug**: Optional. Show debug messages. - - ## GIT CREDENTIALS To access the CodeCommit repository, the Alexa hosted service uses git-credential along with ASK-CLI and SMAPI to automatically pass down temporary Git credentials. Using `ask util git-credentials-helper` in the skill root directory can retrieve the username and password of the Git credentials. - - # UPGRADE PROJECT - UPGRADE COMMANDS Skills created with CLI 1.x will need to update their project structure in order to deploy with the CLI v2. @@ -78,22 +69,21 @@ Skills created with CLI 1.x will need to update their project structure in order **debug**: Optional. Show debug messages. +## UPGRADE STEPS -## UPGRADE STEPS: 1. Using ask-cli 1.x, deploy your skill: - * `$ ask deploy` + * `$ ask deploy` 2. Install ask-cli: - * `$ npm install -g ask-cli` + * `$ npm install -g ask-cli` 3. Upgrade your skill project with ask-cli. From your project's root directory, run: - * `$ ask util upgrade-project` + * `$ ask util upgrade-project` * A hidden folder named ./legacy contains a copy of your v1 skill project. * The CLI v2 skill-package directory is downloaded to the working directory. * The CLI v2 ask-resources.json will be generated. * The dev branch is merged into the master branch. The dev branch is then removed. 4. Commit upgrade changes: - * `$ git commit -m "upgrade project for CLI v2"` - +* `$ git commit -m "upgrade project for CLI v2"` # DEPLOY SKILL - GIT PUSH @@ -101,25 +91,25 @@ Skills created with CLI 1.x will need to update their project structure in order Unlike in CLI v1, running `ask deploy` on hosted skills will no longer trigger skill deployment in CLI v2. Instead, `$ git push` sends the latest source code to Lambda. It also deploys skill-package changes such as the interaction model, skill manifest and in-skill products. -## DEPLOYMENT STEPS: +## DEPLOYMENT STEPS + * Push to deploy skill code and resources: - * `$ git push` + * `$ git push` * Pushing to `master` branch deploys "lambda" folder to user's `development` stage AWS Lambda function, and deploys "skill-package" folder as skill's JSON files * Pushing to `prod` branch deploys "lambda" folder to user's `live` stage AWS Lambda function, and deploys "skill-package" folder as skill's JSON files - Note: dev branch is only used to be displayed in the web console. You only need to push to dev branch if you want to sync version that is displayed in the web console. When you receive the following warning: "The master branch of your skill is ahead of the dev version. To re-enable the code editor, you need to use the ASK CLI to merge the remote master branch to dev and push.", you need to use following steps to sync your master branch back to dev: -``` +```shell git checkout dev git pull --rebase git merge master # fix any merge conflicts if you have git push --no-verify ``` - + ## DEVELOPMENT CONSOLE, BRANCHES AND STAGES * dev branch corresponds to the code you see in the web console editor. @@ -129,5 +119,3 @@ git push --no-verify ## Git Pre-push Hook CLI v2 supports Alexa Hosted skill, a git-native service, to track deployment states using the pre-push hook. When $ git push executes, the pre-push hook prints the skill portal URL to allow users to track deployment states. - - diff --git a/lib/builtins/deploy-delegates/cfn-deployer/helper.js b/lib/builtins/deploy-delegates/cfn-deployer/helper.js index e9f71aab..559bbfd1 100644 --- a/lib/builtins/deploy-delegates/cfn-deployer/helper.js +++ b/lib/builtins/deploy-delegates/cfn-deployer/helper.js @@ -3,8 +3,8 @@ const fs = require("fs"); const sleep = require("util").promisify(setTimeout); const CliCFNDeployerError = require("../../../exceptions/cli-cfn-deployer-error"); -const CloudformationClient = require("../../../clients/aws-client/cloudformation-client"); -const S3Client = require("../../../clients/aws-client/s3-client"); +const CloudformationClient = require("../../../clients/aws-client/cloudformation-client").default; +const S3Client = require("../../../clients/aws-client/s3-client").default; const SmapiClient = require("../../../clients/smapi-client").default; module.exports = class Helper { @@ -12,89 +12,36 @@ module.exports = class Helper { this.awsProfile = awsProfile; this.awsRegion = awsRegion; this.reporter = reporter; - this.sleep = sleep; - this.s3Client = new S3Client({awsProfile, awsRegion}).client; - this.cloudformationClient = new CloudformationClient({awsProfile, awsRegion}).client; + this.s3Client = new S3Client({awsProfile, awsRegion}); + this.cloudformationClient = new CloudformationClient({awsProfile, awsRegion}); this.smapiClient = new SmapiClient({profile, doDebug}); } - async _s3BucketExists(bucketName) { - try { - await this.s3Client.headBucket({Bucket: bucketName}).promise(); - return true; - } catch (err) { - return false; - } - } - - async _createS3Bucket(bucketName) { - const params = { - Bucket: bucketName, - }; - if (this.awsRegion !== "us-east-1") { - params.CreateBucketConfiguration = { - LocationConstraint: this.awsRegion, - }; - } - await this.s3Client.createBucket(params).promise(); - return this.s3Client.waitFor("bucketExists", {Bucket: bucketName}).promise(); - } - - /** - * Creates new S3 bucket if it does not exist - * @param {string} bucketName Bucket Name - * @returns {Promise{<{}> | void}} - */ - async createS3BucketIfNotExists(bucketName) { - const exists = await this._s3BucketExists(bucketName); - if (!exists) { - return this._createS3Bucket(bucketName); - } - } - - /** - * Enables S3 bucket versioning if it is not enabled - * @param {string} bucketName Bucket Name - * @returns {Promise{<{}> | void}} - */ - async enableS3BucketVersioningIfNotEnabled(bucketName) { - const response = await this.s3Client.getBucketVersioning({Bucket: bucketName}).promise(); - if (typeof response === "object" && Object.keys(response).length === 0) { - const params = { - Bucket: bucketName, - VersioningConfiguration: { - MFADelete: "Disabled", - Status: "Enabled", - }, - }; - return this.s3Client.putBucketVersioning(params).promise(); - } - } - /** Uploads object to S3 * @param {string} bucketName Bucket name * @param {string} bucketKey Bucket key - * @param {} filePath File path for file to upload + * @param {string} filePath File path for file to upload * @returns {Promise{<{ETag: string, VersionId: string}>}} */ async uploadToS3(bucketName, bucketKey, filePath) { - const params = { - Bucket: bucketName, - Key: bucketKey, - Body: fs.readFileSync(filePath), - }; + // check if bucket exists + const bucketExits = await this.s3Client.bucketExits(bucketName); + // create and wait for bucket if not found + if (!bucketExits) { + this.reporter.updateStatus(`Creating s3 bucket "${bucketName}"...`); + await this.s3Client.createBucket(bucketName, this.awsRegion); + await this.s3Client.waitForBucketExists(bucketName); + } + // get bucket versioning + const versioning = await this.s3Client.getBucketVersioning(bucketName); + // enable bucket versioning if status not enabled + if (versioning.Status !== "Enabled") { + this.reporter.updateStatus(`Enabling versioning on s3 bucket "${bucketName}"...`); + await this.s3Client.enableBucketVersioning(bucketName); + } // TODO: add caching when is code modified is fixed in the code builder this.reporter.updateStatus(`Uploading code artifact to s3://${bucketName}/${bucketKey}`); - return this.s3Client.putObject(params).promise(); - } - - _stackExists(stackId) { - if (!stackId) return false; - return this.cloudformationClient - .describeStacks({StackName: stackId}) - .promise() - .then((data) => !data.Stacks[0].StackStatus.startsWith("DELETE_")) - .catch(() => false); + return this.s3Client.putObject(bucketName, bucketKey, fs.readFileSync(filePath)); } /** @@ -104,75 +51,47 @@ module.exports = class Helper { * @param {Buffer} templateBody cloud formation template body * @param {Array<{ParameterKey: string, ParameterValue: string}>} parameters cloud formation parameters * @param {Array} capabilities cloud formation capabilities - * @returns {Promise{<{StackId: string}>}} + * @returns {Promise{<{stackId: string, stackInfo: Stack, endpointUri: string}>}} */ async deployStack(stackId, stackName, templateBody, parameters, capabilities) { - const stackExists = await this._stackExists(stackId); + const stackExists = await this.cloudformationClient.stackExists(stackId); if (stackExists) { this.reporter.updateStatus(`Updating stack (${stackId})...`); + stackId = await this.cloudformationClient.updateStack(stackId, templateBody, parameters, capabilities); } else { this.reporter.updateStatus(`No stack exists or stack has been deleted. Creating cloudformation stack "${stackName}"...`); + stackId = await this.cloudformationClient.createStack(stackName, templateBody, parameters, capabilities); } - const params = { - StackName: stackExists ? stackId : stackName, - TemplateBody: templateBody, - Parameters: parameters, - Capabilities: capabilities, - }; - - if (stackExists) { - return this.cloudformationClient.updateStack(params).promise(); - } - return this.cloudformationClient.createStack(params).promise(); + return this._waitForStackDeploy(stackId); } /** * Waits for stack to be created or updated * @param {string} stackId stack id - * @returns {Promise{<{ - * stackInfo: { - * StackId: string, - * StackName: string, - * Parameters: Array<{ParameterKey: string, ParameterValue: string}>}}>, - * CreationTime: timestamp, - * RollbackConfiguration: {}, - * StackStatus: string, - * DisableRollback: boolean, - * NotificationARNs: Array, - * Capabilities: Array, - * Outputs: Array<{OutputKey: string, OutputValue: string, Description: string}>, - * Tags: Array, - * EnableTerminationProtection: boolean, - * DriftInformation: {} - * } - * endpointUri: string - * } + * @returns {Promise{<{stackId: string, stackInfo: Stack, endpointUri: string}>}} */ - async waitForStackDeploy(stackId) { - let pooling = true; + async _waitForStackDeploy(stackId) { let stackInfo; - while (pooling) { - const response = await this.cloudformationClient.describeStacks({StackName: stackId}).promise(); - [stackInfo] = response.Stacks; + while (true) { + stackInfo = await this.cloudformationClient.getStack(stackId); const stackStatus = stackInfo.StackStatus; const statusReason = stackInfo.StackStatusReason; const reasonMsg = statusReason ? `Status reason: ${statusReason}.` : ""; this.reporter.updateStatus(`Current stack status: ${stackStatus}... ${reasonMsg}`); - await this.sleep(2000); - pooling = !stackStatus.endsWith("_COMPLETE"); + if (stackStatus.endsWith("_COMPLETE")) break; + await sleep(2000); } if (["CREATE_COMPLETE", "UPDATE_COMPLETE"].includes(stackInfo.StackStatus)) { const skillEndpointOutput = stackInfo.Outputs.find((o) => o.OutputKey === "SkillEndpoint"); const endpointUri = skillEndpointOutput.OutputValue; - return {stackInfo, endpointUri}; + return {stackId, stackInfo, endpointUri}; } // default fallback error message - let message = - "Cloud Formation deploy failed. We could not find details for deploy error. " + "Please check AWS Console for more details."; + let message = "CloudFormation deploy failed. We could not find details for deploy error. Please check AWS Console for more details."; // finding the last error - const events = await this.cloudformationClient.describeStackEvents({StackName: stackId}).promise(); - const error = events.StackEvents.find((e) => e.ResourceStatus.endsWith("_FAILED")); + const events = await this.cloudformationClient.getStackEvents(stackId); + const error = events.find((e) => e.ResourceStatus.endsWith("_FAILED")); if (error) { const {LogicalResourceId, ResourceType, ResourceStatus, ResourceStatusReason} = error; message = `${LogicalResourceId}[${ResourceType}] ${ResourceStatus} (${ResourceStatusReason})`; @@ -185,7 +104,7 @@ module.exports = class Helper { * @param {string} skillId skill id * @return {Promise{<{clientId: string, clientSecret: string}>}} */ - async getSkillCredentials(skillId) { + getSkillCredentials(skillId) { return new Promise((resolve, reject) => { this.smapiClient.skill.getSkillCredentials(skillId, (error, response) => { if (error) { diff --git a/lib/builtins/deploy-delegates/cfn-deployer/index.js b/lib/builtins/deploy-delegates/cfn-deployer/index.js index 06c37ed4..d916c04d 100644 --- a/lib/builtins/deploy-delegates/cfn-deployer/index.js +++ b/lib/builtins/deploy-delegates/cfn-deployer/index.js @@ -20,7 +20,7 @@ module.exports = { * @param {Object} options * @param {Function} callback */ -function bootstrap(options, callback) { +async function bootstrap(options, callback) { const {profile, workspacePath} = options; const userConfig = options.userConfig || {}; const templateLocation = path.join(workspacePath, SKILL_STACK_PUBLIC_FILE_NAME); @@ -28,12 +28,12 @@ function bootstrap(options, callback) { try { const templateContent = fs.readFileSync(path.join(__dirname, "assets", SKILL_STACK_ASSET_FILE_NAME), "utf-8"); const awsProfile = awsUtil.getAWSProfile(profile); - const awsDefaultRegion = awsUtil.getCLICompatibleDefaultRegion(awsProfile); + const awsDefaultRegion = await awsUtil.getCLICompatibleDefaultRegion(awsProfile); fs.writeFileSync(templateLocation, templateContent); userConfig.templatePath = `./${path.posix.join("infrastructure", path.basename(workspacePath), SKILL_STACK_PUBLIC_FILE_NAME)}`; updatedUserConfig = R.set(R.lensPath(["awsRegion"]), awsDefaultRegion, userConfig); - } catch (e) { - return callback(e.message); + } catch (err) { + return callback(err.message); } callback(null, {userConfig: updatedUserConfig}); } @@ -64,17 +64,16 @@ async function invoke(reporter, options, callback) { deployProgress.resultMessage = deployProgress.isDeploySkipped ? _makeSkippedMessage(deployProgress.deployRegion, alexaRegion) : _makeSuccessMessage(deployProgress.endpoint.uri, alexaRegion); - callback(null, deployProgress); } catch (err) { deployProgress.resultMessage = _makeErrorMessage(err, alexaRegion); - callback(null, deployProgress); } + callback(null, deployProgress); } async function _deploy(reporter, options, deployProgress) { const {profile, doDebug, alexaRegion, skillId, skillName, code, userConfig, deployState = {}, deployRegions} = options; - let {stackId} = deployProgress.deployState; + const {stackId} = deployProgress.deployState; const awsProfile = _getAwsProfile(profile); const awsRegion = _getAwsRegion(alexaRegion, deployRegions); const templateBody = _getTemplateBody(alexaRegion, userConfig); @@ -97,9 +96,12 @@ async function _deploy(reporter, options, deployProgress) { templateBody.includes("SkillClientId") && templateBody.includes("SkillClientSecret") ? await helper.getSkillCredentials(skillId) : {}; // s3 upload - await helper.createS3BucketIfNotExists(bucketName); - await helper.enableS3BucketVersioningIfNotEnabled(bucketName); - const uploadResult = await helper.uploadToS3(bucketName, bucketKey, code.codeBuild); + let uploadResult; + try { + uploadResult = await helper.uploadToS3(bucketName, bucketKey, code.codeBuild); + } catch (err) { + throw new CliCFNDeployerError(`Failed to upload code build to S3: ${err.message}`); + } deployProgress.deployState.s3 = { bucket: bucketName, @@ -114,15 +116,12 @@ async function _deploy(reporter, options, deployProgress) { const stackParameters = _mapStackParameters(skillId, skillCredentials, userConfig, s3Artifact, userDefinedParameters); const capabilities = _getCapabilities(alexaRegion, userConfig); - const deployRequest = await helper.deployStack(stackId, stackName, templateBody, stackParameters, capabilities); - stackId = deployRequest.StackId; - const deployResult = await helper.waitForStackDeploy(stackId, reporter); + const deployResult = await helper.deployStack(stackId, stackName, templateBody, stackParameters, capabilities); - deployProgress.deployState.stackId = stackId; + deployProgress.deployState.stackId = deployResult.stackId; deployProgress.deployState.outputs = deployResult.stackInfo.Outputs; deployProgress.endpoint = {uri: deployResult.endpointUri}; deployProgress.isAllStepSuccess = true; - return deployResult; } function _getAwsProfile(profile) { @@ -218,7 +217,7 @@ function _getUserDefinedParameters(alexaRegion, userConfig) { Object.keys(parameters).forEach((key) => { if (reservedParametersKeys.has(key)) { const message = reservedParameters[key]; - throw new CliCFNDeployerError(`Cloud Formation parameter "${key}" is reserved. ${message}`); + throw new CliCFNDeployerError(`CloudFormation parameter "${key}" is reserved. ${message}`); } }); diff --git a/lib/builtins/deploy-delegates/lambda-deployer/helper.js b/lib/builtins/deploy-delegates/lambda-deployer/helper.js index d4aa084d..e1293fd2 100644 --- a/lib/builtins/deploy-delegates/lambda-deployer/helper.js +++ b/lib/builtins/deploy-delegates/lambda-deployer/helper.js @@ -3,8 +3,8 @@ const fs = require("fs"); const R = require("ramda"); const CONSTANTS = require("../../../utils/constants"); -const IAMClient = require("../../../clients/aws-client/iam-client"); -const LambdaClient = require("../../../clients/aws-client/lambda-client"); +const IAMClient = require("../../../clients/aws-client/iam-client").default; +const LambdaClient = require("../../../clients/aws-client/lambda-client").default; const Manifest = require("../../../model/manifest"); const ResourcesConfig = require("../../../model/resources-config"); const retryUtils = require("../../../utils/retry-utility"); @@ -16,8 +16,14 @@ module.exports = { deployLambdaFunction, }; +/** + * Loads lambda information + * @param {Object} reporter + * @param {Object} loadLambdaConfig + * @param {Function} callback + */ // TODO: use Error class -function loadLambdaInformation(reporter, loadLambdaConfig, callback) { +async function loadLambdaInformation(reporter, loadLambdaConfig, callback) { const {awsProfile, awsRegion, alexaRegion, deployState, userConfig, ignoreHash} = loadLambdaConfig; const lambdaClient = new LambdaClient({awsProfile, awsRegion}); // check if user sets userConfig with "sourceLambda" field to reuse existing Lambda @@ -39,10 +45,8 @@ function loadLambdaInformation(reporter, loadLambdaConfig, callback) { // Lambda exists, validate the deploy states reporter.updateStatus("Validating the deploy state of existing Lambda function..."); - lambdaClient.getFunction(lambdaArn, (err, data) => { - if (err) { - return callback(err); - } + try { + const data = await lambdaClient.getFunction(lambdaArn); // 1. check IAM role arn const localIAMRole = deployState.iamRole; const remoteIAMRole = data.Configuration.Role; @@ -67,67 +71,71 @@ To ignore this error run "ask deploy --ignore-hash".`); lastModified: data.Configuration.LastModified, }, }); - }); + } catch (err) { + callback(err); + } } +/** + * Loads lambda from user config source + * @param {Object} reporter + * @param {Object} lambdaClient + * @param {String} sourceLambdaArn + * @param {Function} callback + */ function _loadLambdaFromUserConfigSource(reporter, lambdaClient, sourceLambdaArn, callback) { - lambdaClient.getFunction(sourceLambdaArn, (err, data) => { - if (err) { - return callback(`Failed to load the Lambda (${sourceLambdaArn}) specified in "sourceLambda". ${err}`); - } - const iamRole = data.Configuration.Role; - const lambda = { - arn: sourceLambdaArn, - revisionId: data.Configuration.RevisionId, - lastModified: data.Configuration.LastModified, - }; - callback(undefined, {iamRole, lambda}); - }); + lambdaClient + .getFunction(sourceLambdaArn) + .then((data) => { + const iamRole = data.Configuration.Role; + const lambda = { + arn: sourceLambdaArn, + revisionId: data.Configuration.RevisionId, + lastModified: data.Configuration.LastModified, + }; + callback(undefined, {iamRole, lambda}); + }) + .catch((err) => { + callback(`Failed to load the Lambda (${sourceLambdaArn}) specified in "sourceLambda". ${err}`); + }); } -function deployIAMRole(reporter, deployIAMConfig, callback) { +/** + * Deploys an iam role + * @param {Object} reporter + * @param {Object} deployIAMConfig + * @param {Function} callback + */ +async function deployIAMRole(reporter, deployIAMConfig, callback) { const {awsProfile, alexaRegion, skillName, awsRegion, deployState} = deployIAMConfig; const iamClient = new IAMClient({awsProfile, awsRegion}); - const roleArn = deployState.iamRole; + let roleArn = deployState.iamRole; if (R.isNil(roleArn) || R.isEmpty(roleArn)) { reporter.updateStatus("No IAM role exists. Creating an IAM role..."); - _createIAMRole(reporter, iamClient, skillName, (roleErr, iamRoleArn) => { - if (roleErr) { - return callback(`Failed to create IAM role before deploying Lambda. ${roleErr}`); - } - callback(null, iamRoleArn); - }); + try { + const roleName = _getIAMRoleName(skillName); + const role = await iamClient.createBasicLambdaRole(roleName); + roleArn = role.Arn; + await iamClient.attachBasicLambdaRolePolicy(roleArn); + reporter.updateStatus(`Created IAM role: "${roleArn}"`); + callback(null, roleArn); + } catch (err) { + callback(`Failed to create IAM role before deploying Lambda. ${err}`); + } } else { - iamClient.getIAMRole(roleArn, (roleErr, roleData) => { - if (roleErr) { - if (roleErr.code === "NoSuchEntity") { - callback(`The IAM role is not found. Please check if your IAM role from region ${alexaRegion} is valid.`); - } else { - callback(`Failed to retrieve IAM role (${roleArn}) for Lambda. ${roleErr}`); - } + try { + const role = await iamClient.getIAMRole(roleArn); + roleArn = role.Arn; + reporter.updateStatus(`Current IAM role: "${roleArn}"`); + callback(null, roleArn); + } catch (err) { + if (err.$metadata?.httpStatusCode === 404) { + callback(`The IAM role is not found. Please check if your IAM role from region ${alexaRegion} is valid.`); } else { - reporter.updateStatus(`Current IAM role : "${roleArn}"...`); - callback(null, roleData.Role.Arn); + callback(`Failed to retrieve IAM role (${roleArn}) for Lambda. ${err}`); } - }); - } -} - -function _createIAMRole(reporter, iamClient, skillName, callback) { - const roleName = _getIAMRoleName(skillName); - iamClient.createBasicLambdaRole(roleName, (roleErr, roleData) => { - if (roleErr) { - return callback(roleErr); } - const roleArn = roleData.Role.Arn; - reporter.updateStatus(`Create Role (arn: ${roleArn}) in progress...`); - iamClient.attachBasicLambdaRolePolicy(roleArn, (policyErr) => { - if (policyErr) { - return callback(policyErr); - } - callback(null, roleData.Role.Arn); - }); - }); + } } /** @@ -149,6 +157,12 @@ function _getIAMRoleName(skillName) { return generateIAMRoleName(); } +/** + * Deploys a lambda function + * @param {Object} reporter + * @param {Object} options + * @param {Function} callback + */ function deployLambdaFunction(reporter, options, callback) { const {profile, awsProfile, alexaRegion, awsRegion, skillId, skillName, code, iamRoleArn, userConfig, deployState} = options; const lambdaClient = new LambdaClient({awsProfile, awsRegion}); @@ -186,6 +200,13 @@ function deployLambdaFunction(reporter, options, callback) { } } +/** + * Creates a lambda function + * @param {Object} reporter + * @param {Object} lambdaClient + * @param {Object} options + * @param {Function} callback + */ function _createLambdaFunction(reporter, lambdaClient, options, callback) { const {profile, alexaRegion, skillId, skillName, iamRoleArn, zipFilePath, userConfig} = options; const functionName = _getLambdaFunctionName(alexaRegion, userConfig, skillName, profile); @@ -196,22 +217,22 @@ function _createLambdaFunction(reporter, lambdaClient, options, callback) { factor: CONSTANTS.CONFIGURATION.RETRY.CREATE_LAMBDA_FUNCTION.FACTOR, maxRetry: CONSTANTS.CONFIGURATION.RETRY.CREATE_LAMBDA_FUNCTION.MAXRETRY, }; - const RETRY_MESSAGE = "The role defined for the function cannot be assumed by Lambda."; const retryCall = (loopCallback) => { // 1. Create a Lambda function - lambdaClient.createLambdaFunction(functionName, functionConfig, iamRoleArn, zipFile, (lambdaErr, lambdaData) => { - if (lambdaErr) { + lambdaClient + .createLambdaFunction(functionName, functionConfig, iamRoleArn, zipFile) + .then((data) => loopCallback(null, data)) + .catch((err) => { // There may be a (small) window of time after creating IAM role and adding policies, the role will trigger the error // if creating lambda function during this timming. Thus, use retry to bypass this issue. - if (lambdaErr.message === RETRY_MESSAGE) { - return loopCallback(null, RETRY_MESSAGE); + if (err.message === CONSTANTS.LAMBDA.ERROR_MESSAGE.ROLE_NOT_ASSUMED) { + loopCallback(); + } else { + loopCallback(err); } - return loopCallback(lambdaErr); - } - loopCallback(null, lambdaData); - }); + }); }; - const shouldRetryCondition = (retryResponse) => retryResponse === RETRY_MESSAGE; + const shouldRetryCondition = (retryResponse) => retryResponse === undefined; retryUtils.retry(retryConfig, retryCall, shouldRetryCondition, (retryErr, createData) => { if (retryErr) { return callback(retryErr); @@ -241,6 +262,14 @@ function _createLambdaFunction(reporter, lambdaClient, options, callback) { }); } +/** + * Adds event permissions + * @param {Object} lambdaClient + * @param {String} skillId + * @param {String} functionArn + * @param {Object} profile + * @param {Function} callback + */ function _addEventPermissions(lambdaClient, skillId, functionArn, profile, callback) { const targetEndpoints = ResourcesConfig.getInstance().getTargetEndpoints(profile); // for backward compatibility, defaulting to api from skill manifest if targetEndpoints is not defined @@ -248,7 +277,10 @@ function _addEventPermissions(lambdaClient, skillId, functionArn, profile, callb async.forEach( domains, (domain, permCallback) => { - lambdaClient.addAlexaPermissionByDomain(domain, skillId, functionArn, permCallback); + lambdaClient + .addAlexaPermissionByDomain(domain, skillId, functionArn) + .then(() => permCallback()) + .catch((err) => permCallback(err)); }, (permErr) => { if (permErr) { @@ -313,6 +345,13 @@ function _getLambdaFunctionConfig(alexaRegion, userConfig) { }; } +/** + * Updates lambda function + * @param {Object} reporter + * @param {Object} lambdaClient + * @param {Object} options + * @param {Function} callback + */ function _updateLambdaFunction(reporter, lambdaClient, options, callback) { _updateLambdaFunctionCode(reporter, lambdaClient, options, (codeErr, codeData) => { if (codeErr) { @@ -345,39 +384,56 @@ function _updateLambdaFunction(reporter, lambdaClient, options, callback) { }); } +/** + * Updates lambda function code + * @param {Object} reporter + * @param {Object} lambdaClient + * @param {Object} options + * @param {Function} callback + */ function _updateLambdaFunctionCode(reporter, lambdaClient, options, callback) { const {zipFilePath, deployState} = options; const zipFile = fs.readFileSync(zipFilePath); const functionArn = deployState.lambda.arn; const {revisionId} = deployState.lambda; - lambdaClient.updateFunctionCode(zipFile, functionArn, revisionId, (err) => { - if (err) { - return callback(err); - } - - reporter.updateStatus(`Update a lambda function code (${functionArn}) in progress...`); - - _waitForLambdaFunction(lambdaClient, functionArn, callback); - }); + lambdaClient + .updateFunctionCode(functionArn, zipFile, revisionId) + .then(() => { + reporter.updateStatus(`Update a lambda function code (${functionArn}) in progress...`); + _waitForLambdaFunction(lambdaClient, functionArn, callback); + }) + .catch((err) => callback(err)); } +/** + * Updates lambda function config + * @param {Object} reporter + * @param {Object} lambdaClient + * @param {Object} options + * @param {String} revisionId + * @param {Function} callback + */ function _updateLambdaFunctionConfig(reporter, lambdaClient, options, revisionId, callback) { const {alexaRegion, deployState, userConfig} = options; const functionArn = deployState.lambda.arn; const functionConfig = _getLambdaFunctionConfig(alexaRegion, userConfig); - lambdaClient.updateFunctionConfiguration(functionArn, functionConfig, revisionId, (err) => { - if (err) { - return callback(err); - } - - reporter.updateStatus(`Update a lambda function configuration (${functionArn}) in progress...`); - - _waitForLambdaFunction(lambdaClient, functionArn, callback); - }); + lambdaClient + .updateFunctionConfiguration(functionArn, functionConfig, revisionId) + .then(() => { + reporter.updateStatus(`Update a lambda function configuration (${functionArn}) in progress...`); + _waitForLambdaFunction(lambdaClient, functionArn, callback); + }) + .catch((err) => callback(err)); } +/** + * Waits for lambda function + * @param {Object} lambdaClient + * @param {String} functionArn + * @param {Function} callback + */ function _waitForLambdaFunction(lambdaClient, functionArn, callback) { const retryConfig = { base: CONSTANTS.CONFIGURATION.RETRY.WAIT_LAMBDA_FUNCTION.BASE, @@ -385,12 +441,10 @@ function _waitForLambdaFunction(lambdaClient, functionArn, callback) { maxRetry: CONSTANTS.CONFIGURATION.RETRY.WAIT_LAMBDA_FUNCTION.MAXRETRY, }; const retryCall = (loopCallback) => { - lambdaClient.getFunction(functionArn, (err, data) => { - if (err) { - return loopCallback(err); - } - loopCallback(null, data.Configuration); - }); + lambdaClient + .getFunction(functionArn) + .then((data) => loopCallback(null, data.Configuration)) + .catch((err) => loopCallback(err)); }; const shouldRetryCondition = (retryResponse) => retryResponse.State === CONSTANTS.LAMBDA.FUNCTION_STATE.PENDING || diff --git a/lib/builtins/deploy-delegates/lambda-deployer/index.js b/lib/builtins/deploy-delegates/lambda-deployer/index.js index 086f3246..7a266115 100644 --- a/lib/builtins/deploy-delegates/lambda-deployer/index.js +++ b/lib/builtins/deploy-delegates/lambda-deployer/index.js @@ -14,10 +14,10 @@ module.exports = { * @param {Object} options * @param {Function} callback */ -function bootstrap(options, callback) { +async function bootstrap(options, callback) { const {profile, userConfig} = options; const awsProfile = awsUtil.getAWSProfile(profile); - const awsDefaultRegion = awsUtil.getCLICompatibleDefaultRegion(awsProfile); + const awsDefaultRegion = await awsUtil.getCLICompatibleDefaultRegion(awsProfile); const updatedUserConfig = R.set(R.lensPath(["awsRegion"]), awsDefaultRegion, userConfig); callback(null, {userConfig: updatedUserConfig}); } diff --git a/lib/clients/aws-client/abstract-aws-client.js b/lib/clients/aws-client/abstract-aws-client.js deleted file mode 100644 index b7cc9432..00000000 --- a/lib/clients/aws-client/abstract-aws-client.js +++ /dev/null @@ -1,21 +0,0 @@ -const aws = require("aws-sdk"); - -const CONSTANTS = require("../../utils/constants"); -const stringUtils = require("../../utils/string-utils"); - -module.exports = class AbstractAwsClient { - constructor(configuration) { - const {awsProfile, awsRegion} = configuration; - if (!stringUtils.isNonBlankString(awsProfile) || !stringUtils.isNonBlankString(awsRegion)) { - throw new Error("Invalid awsProfile or Invalid awsRegion"); - } - if (awsProfile !== CONSTANTS.PLACEHOLDER.ENVIRONMENT_VAR.AWS_CREDENTIALS) { - aws.config.credentials = new aws.SharedIniFileCredentials({ - profile: awsProfile, - }); - } - this.awsRegion = awsRegion; - this.awsProfile = awsProfile; - aws.config.region = this.awsRegion; - } -}; diff --git a/lib/clients/aws-client/abstract-aws-client.ts b/lib/clients/aws-client/abstract-aws-client.ts new file mode 100644 index 00000000..6ee6cdb4 --- /dev/null +++ b/lib/clients/aws-client/abstract-aws-client.ts @@ -0,0 +1,41 @@ +import {fromEnv, fromIni} from "@aws-sdk/credential-providers"; +import {AwsCredentialIdentityProvider} from "@aws-sdk/types"; + +import CONSTANTS from "../../utils/constants"; +import stringUtils from "../../utils/string-utils"; + +/** + * Abstract Class for AWS Client + */ +export default abstract class AbstractAwsClient { + credentials: AwsCredentialIdentityProvider; + profile?: string; + region?: string; + + /** + * Constructor + * @param configuration aws client config + */ + constructor(configuration: AwsClientConfiguration) { + const {awsProfile, awsRegion} = configuration; + if (!stringUtils.isNonBlankString(awsProfile) || !stringUtils.isNonBlankString(awsRegion)) { + throw new Error("Invalid awsProfile or Invalid awsRegion"); + } + this.credentials = + awsProfile === CONSTANTS.PLACEHOLDER.ENVIRONMENT_VAR.AWS_CREDENTIALS + ? fromEnv() + : fromIni({ + profile: awsProfile, + }); + this.profile = awsProfile; + this.region = awsRegion; + } +} + +/** + * Interface for AWS CLient Configuration + */ +export interface AwsClientConfiguration { + awsProfile?: string; + awsRegion?: string; +} diff --git a/lib/clients/aws-client/aws-util.js b/lib/clients/aws-client/aws-util.js deleted file mode 100644 index c9404580..00000000 --- a/lib/clients/aws-client/aws-util.js +++ /dev/null @@ -1,82 +0,0 @@ -const aws = require("aws-sdk"); -const fs = require("fs-extra"); -const os = require("os"); -const path = require("path"); -const R = require("ramda"); - -const CONSTANT = require("../../utils/constants"); - -module.exports = { - getAWSProfile, - getCLICompatibleDefaultRegion, -}; - -/** - * function used to retrieve aws profile name - * @param {string} askProfile cli profile name - */ -function getAWSProfile(askProfile) { - if (askProfile === CONSTANT.PLACEHOLDER.ENVIRONMENT_VAR.PROFILE_NAME) { - const awsAccessKeyId = process.env.AWS_ACCESS_KEY_ID; - const awsSecretAccessKey = process.env.AWS_SECRET_ACCESS_KEY; - - if (awsAccessKeyId && awsSecretAccessKey) { - return CONSTANT.PLACEHOLDER.ENVIRONMENT_VAR.AWS_CREDENTIALS; - } - } - const askConfig = fs.readJSONSync(path.join(os.homedir(), ".ask", "cli_config")); - return R.view(R.lensPath(["profiles", askProfile, "aws_profile"]), askConfig); -} - -// We face the same issue as mentioned in https://github.com/aws/aws-sdk-js/issues/2181 -// Issue is about when we instantiate the aws-sdk, the region value is not passed in correctly based on the profile. -// Temporary solution is to mimic aws-sdk's credential provider chain and wait for the solution. -class SharedIniFile { - constructor(options) { - options = options || {}; - this.isConfig = options.isConfig === true; - this.filename = options.filename || this._getDefaultFilepath(); - } - - getProfile(profile) { - const profileIndex = profile !== aws.util.defaultProfile && this.isConfig ? `profile ${profile}` : profile; - const configFile = this._ensureFileLoaded(); - return configFile ? configFile[profileIndex] : null; - } - - _getDefaultFilepath() { - return path.join(os.homedir(), ".aws", this.isConfig ? "config" : "credentials"); - } - - _ensureFileLoaded() { - if (fs.existsSync(this.filename)) { - const contents = fs.readFileSync(this.filename, "utf-8").toString(); - return aws.util.ini.parse(contents); - } - return null; - } -} - -/** - * function used to retrieve default aws region or return a global default aws region if a set one is not found. - * @param {string} runtimeProfile aws profile name - */ -function getCLICompatibleDefaultRegion(awsProfile) { - const profile = awsProfile || process.env.AWS_PROFILE || process.env.AWS_DEFAULT_PROFILE || "default"; - const toCheck = [ - { - filename: process.env.AWS_SHARED_CREDENTIALS_FILE, - }, - { - isConfig: true, - filename: process.env.AWS_CONFIG_FILE, - }, - ]; - let region = process.env.AWS_REGION || process.env.AMAZON_REGION || process.env.AWS_DEFAULT_REGION || process.env.AMAZON_DEFAULT_REGION; - while (!region && toCheck.length > 0) { - const configFile = new SharedIniFile(toCheck.shift()); - const section = configFile.getProfile(profile); - region = section && section.region; - } - return region || CONSTANT.AWS_SKILL_INFRASTRUCTURE_DEFAULT_REGION; -} diff --git a/lib/clients/aws-client/aws-util.ts b/lib/clients/aws-client/aws-util.ts new file mode 100644 index 00000000..c54da507 --- /dev/null +++ b/lib/clients/aws-client/aws-util.ts @@ -0,0 +1,36 @@ +import {DEFAULT_PROFILE, parseKnownFiles} from "@smithy/shared-ini-file-loader"; +import fs from "fs-extra"; +import os from "os"; +import path from "path"; +import R from "ramda"; + +import CONSTANTS from "../../utils/constants"; + +/** + * Returns the associated aws profile name to a ask profile + * @param {string} askProfile cli profile name + */ +export function getAWSProfile(askProfile: string): string | undefined { + if (askProfile === CONSTANTS.PLACEHOLDER.ENVIRONMENT_VAR.PROFILE_NAME) { + if (!process.env.AWS_ACCESS_KEY_ID || !process.env.AWS_SECRET_ACCESS_KEY) { + throw new Error("Environmental variables AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY not defined."); + } + return CONSTANTS.PLACEHOLDER.ENVIRONMENT_VAR.AWS_CREDENTIALS; + } + const askConfig = fs.readJSONSync(path.join(os.homedir(), ".ask", "cli_config")); + return R.view(R.lensPath(["profiles", askProfile, "aws_profile"]), askConfig); +} + +/** + * Returns the default aws region or global default aws region if available. + * @param {string} awsProfile aws profile name + */ +export async function getCLICompatibleDefaultRegion(awsProfile: string): Promise { + const profile = awsProfile || process.env.AWS_PROFILE || process.env.AWS_DEFAULT_PROFILE || DEFAULT_PROFILE; + let region = process.env.AWS_REGION || process.env.AMAZON_REGION || process.env.AWS_DEFAULT_REGION || process.env.AMAZON_DEFAULT_REGION; + if (!region) { + const config = await parseKnownFiles({}).catch(() => undefined); + region = config && config[profile] && config[profile].region; + } + return region || CONSTANTS.AWS_SKILL_INFRASTRUCTURE_DEFAULT_REGION; +} diff --git a/lib/clients/aws-client/cloudformation-client.js b/lib/clients/aws-client/cloudformation-client.js deleted file mode 100644 index d0735a85..00000000 --- a/lib/clients/aws-client/cloudformation-client.js +++ /dev/null @@ -1,131 +0,0 @@ -const aws = require("aws-sdk"); -const R = require("ramda"); -const stringUtils = require("../../utils/string-utils"); -const AbstractAwsClient = require("./abstract-aws-client"); - -/** - * Class for AWS Cloudformation Client - */ -module.exports = class CloudformationClient extends AbstractAwsClient { - constructor(configuration) { - super(configuration); - this.client = new aws.CloudFormation(); - } - - /** - * Create a stack based on the parameters. - * @param {String} stackName The name for the stack - * @param {String} templateFile Template file's buffer (No bigger then 51200bytes) - * @param {Array} parameters Array of object that contains the input parameters - */ - createStack(stackName, templateFile, parameters) { - const params = { - StackName: stackName, - Capabilities: ["CAPABILITY_IAM"], - TemplateBody: templateFile, - }; - if (parameters && !R.isEmpty(parameters)) { - params.Parameters = parameters; - } - return this.client.createStack(params).promise(); - } - - /** - * Update the stack based on the stackName with input parameters. - * @param {String} stackName The name for the stack - * @param {String} templateFile Template file's buffer (No bigger then 51200bytes) - * @param {Array} parameters Array of object that contains the input parameters - */ - updateStack(stackName, templateFile, parameters) { - const params = { - StackName: stackName, - TemplateBody: templateFile, - Capabilities: ["CAPABILITY_IAM"], - }; - if (parameters && !R.isEmpty(parameters)) { - params.Parameters = parameters; - } - return this.client - .updateStack(params) - .promise() - .then((res) => res) - .catch((err) => { - const NO_UPDATE_MESSAGE = "No updates are to be performed."; - if (err.code === "ValidationError" && err.message === NO_UPDATE_MESSAGE) { - return NO_UPDATE_MESSAGE; - } - throw err; - }); - } - - stackExists(stackId) { - if (!stringUtils.isNonBlankString(stackId)) return false; - - return this.client - .describeStacks({StackName: stackId}) - .promise() - .then((data) => data.Stacks[0].StackStatus !== "DELETE_COMPLETE") - .catch(() => false); - } - - /** - * Describe stack status based on the stack ID - * @param {String} stackId The stack ID - * @param {Function} callback - */ - describeStack(stackId, callback) { - if (!stringUtils.isNonBlankString(stackId)) { - callback("Stack ID must be set to further describe"); - return; - } - const params = { - StackName: stackId, - }; - this.client.describeStacks(params, (err, response) => { - // callback the first stack's description since stackId is required for the method - callback(err, err ? null : response.Stacks[0]); - }); - } - - /** - * Describe specific resource in a stack - * @param {String} stackId The stack ID - * @param {String} logicalId The resource logical ID - * @param {Function} callback - */ - describeStackResource(stackId, logicalId, callback) { - if (!stringUtils.isNonBlankString(stackId)) { - callback("Stack ID must be set to describe its resources"); - return; - } - if (!stringUtils.isNonBlankString(logicalId)) { - callback("Logical ID must be set to describe its resources"); - return; - } - const params = { - StackName: stackId, - LogicalResourceId: logicalId, - }; - this.client.describeStackResource(params, (err, response) => { - callback(err, err ? null : response.StackResourceDetail); - }); - } - - /** - * Describe all the resources for a stack - * @param {String} stackId The stack ID - * @param {Function} callback - */ - describeStackResources(stackId, callback) { - if (!stringUtils.isNonBlankString(stackId)) { - callback("Stack ID must be set to describe its resources"); - return; - } - const params = { - StackName: stackId, - }; - this.client.describeStackResources(params, (err, response) => { - callback(err, err ? null : response.StackResources); - }); - } -}; diff --git a/lib/clients/aws-client/cloudformation-client.ts b/lib/clients/aws-client/cloudformation-client.ts new file mode 100644 index 00000000..93dd7d74 --- /dev/null +++ b/lib/clients/aws-client/cloudformation-client.ts @@ -0,0 +1,146 @@ +import { + CloudFormationClient as _CloudFormationClient, + CloudFormationServiceException, + CreateStackCommand, + CreateStackCommandOutput, + DescribeStacksCommand, + DescribeStacksCommandOutput, + DescribeStackEventsCommand, + DescribeStackEventsCommandOutput, + DescribeStackResourceCommand, + DescribeStackResourceCommandOutput, + DescribeStackResourcesCommand, + DescribeStackResourcesCommandOutput, + UpdateStackCommand, + UpdateStackCommandOutput, + Parameter, + Stack, + StackEvent, + StackResource, + StackResourceDetail, +} from "@aws-sdk/client-cloudformation"; +import R from "ramda"; +import AbstractAwsClient, {AwsClientConfiguration} from "./abstract-aws-client"; + +/** + * Class for AWS Cloudformation Client + */ +export default class CloudformationClient extends AbstractAwsClient { + client: _CloudFormationClient; + + /** + * Constructor + * @param configuration The AWS client config + */ + constructor(configuration: AwsClientConfiguration) { + super(configuration); + this.client = new _CloudFormationClient({ + credentials: this.credentials, + region: this.region, + }); + } + + /** + * Creates a stack based on the parameters. + * @param stackName The stack name + * @param templateBody The template body + * @param parameters The input parameters + * @param capabilities The input capabilities + */ + createStack(stackName: string, templateBody: string, parameters: Parameter[], capabilities: string[]): Promise { + const command = new CreateStackCommand({ + StackName: stackName, + TemplateBody: templateBody, + Capabilities: capabilities, + ...(!R.isEmpty(parameters) && {Parameters: parameters}), + }); + return this.client.send(command).then((data: CreateStackCommandOutput) => data.StackId); + } + + /** + * Updates the stack based on the stackName with input parameters. + * @param stackName The stack name + * @param templateBody The template body + * @param parameters The input parameters + * @param capabilities The input capabilities + */ + updateStack( + stackName: string, + templateBody: string, + parameters: Parameter[], + capabilities: string[], + ): Promise { + const command = new UpdateStackCommand({ + StackName: stackName, + TemplateBody: templateBody, + Capabilities: capabilities, + ...(!R.isEmpty(parameters) && {Parameters: parameters}), + }); + return this.client + .send(command) + .then((data: UpdateStackCommandOutput) => data.StackId) + .catch((err: CloudFormationServiceException) => { + if (err.name !== "ValidationError" || err.message !== "No updates are to be performed.") { + throw err; + } + }); + } + + /** + * Checks if stack exists + * @param stackName The stack name + */ + stackExists(stackName: string | undefined): Promise { + return stackName + ? this.getStack(stackName) + .then((data: Stack | undefined) => data !== undefined && data.StackStatus !== "DELETE_COMPLETE") + .catch(() => false) + : Promise.resolve(false); + } + + /** + * Returns information for a stack + * @param stackName The stack name + */ + getStack(stackName: string): Promise { + const command = new DescribeStacksCommand({ + StackName: stackName, + }); + return this.client.send(command).then((data: DescribeStacksCommandOutput) => data.Stacks?.[0]); + } + + /** + * Returns all events for a stack + * @param stackName The stack name + */ + getStackEvents(stackName: string): Promise { + const command = new DescribeStackEventsCommand({ + StackName: stackName, + }); + return this.client.send(command).then((data: DescribeStackEventsCommandOutput) => data.StackEvents); + } + + /** + * Returns a specific resource for a stack + * @param stackName The stack name + * @param logicalId The logical resource ID + */ + getStackResource(stackName: string, logicalId: string): Promise { + const command = new DescribeStackResourceCommand({ + StackName: stackName, + LogicalResourceId: logicalId, + }); + return this.client.send(command).then((data: DescribeStackResourceCommandOutput) => data.StackResourceDetail); + } + + /** + * Returns all the resources for a stack + * @param stackName The stack name + */ + getStackResources(stackName: string): Promise { + const command = new DescribeStackResourcesCommand({ + StackName: stackName, + }); + return this.client.send(command).then((data: DescribeStackResourcesCommandOutput) => data.StackResources); + } +} diff --git a/lib/clients/aws-client/iam-client.js b/lib/clients/aws-client/iam-client.js deleted file mode 100644 index de059979..00000000 --- a/lib/clients/aws-client/iam-client.js +++ /dev/null @@ -1,70 +0,0 @@ -const aws = require("aws-sdk"); - -const CONSTANTS = require("../../utils/constants"); -const AbstractAwsClient = require("./abstract-aws-client"); - -/** - * Class for AWS IAM Client - */ -module.exports = class IAMClient extends AbstractAwsClient { - constructor(configuration) { - super(configuration); - this.client = new aws.IAM(); - } - - /** - * Wrapper of iam sdk api - * Retrieves information about the specified role - * @param {string} roleArn The arn of the IAM role to get information about. - * @param {callback} callback { error, response } - */ - getIAMRole(roleArn, callback) { - const params = { - RoleName: this._extractIAMRoleName(roleArn), - }; - this.client.getRole(params, (err, response) => { - callback(err, !err ? response : null); - }); - } - - /** - * Wrapper of iam sdk api - * Creates a new role for AWS account. - * @param {string} roleName The name of the IAM role. - * @param {callback} callback { error, response } - */ - createBasicLambdaRole(roleName, callback) { - const policy = CONSTANTS.AWS.IAM.ROLE.LAMBDA_BASIC_ROLE.POLICY; - const params = { - RoleName: roleName, - AssumeRolePolicyDocument: JSON.stringify(policy), - }; - this.client.createRole(params, (err, response) => { - callback(err, !err ? response : null); - }); - } - - /** - * Wrapper of iam sdk api - * Attaches the specified managed policy to the specified IAM role. - * @param {string} roleArn The Amazon Resource Name (ARN) specifying the group. - * @param {callback} callback { error, response } - */ - attachBasicLambdaRolePolicy(roleArn, callback) { - const params = { - PolicyArn: CONSTANTS.AWS.IAM.ROLE.LAMBDA_BASIC_ROLE.POLICY_ARN, - RoleName: this._extractIAMRoleName(roleArn), - }; - this.client.attachRolePolicy(params, (err, response) => { - callback(err, !err ? response : null); - }); - } - - /** - * Extracts IAM Role from an existing iam role arn. - * @param {string} roleArn The Amazon Resource Name (ARN) specifying the group. - */ - _extractIAMRoleName(roleArn) { - return roleArn.split("role/").pop(); - } -}; diff --git a/lib/clients/aws-client/iam-client.ts b/lib/clients/aws-client/iam-client.ts new file mode 100644 index 00000000..e8bab515 --- /dev/null +++ b/lib/clients/aws-client/iam-client.ts @@ -0,0 +1,76 @@ +import { + IAMClient as _IAMClient, + AttachRolePolicyCommand, + AttachRolePolicyCommandOutput, + CreateRoleCommand, + CreateRoleCommandOutput, + GetRoleCommand, + GetRoleCommandOutput, + Role, +} from "@aws-sdk/client-iam"; + +import CONSTANTS from "../../utils/constants"; +import AbstractAwsClient, {AwsClientConfiguration} from "./abstract-aws-client"; + +/** + * Class for AWS IAM Client + */ +export default class IAMClient extends AbstractAwsClient { + client: _IAMClient; + + /** + * Constructor + * @param configuration The aws client config + */ + constructor(configuration: AwsClientConfiguration) { + super(configuration); + this.client = new _IAMClient({ + credentials: this.credentials, + region: this.region, + }); + } + + /** + * Returns information for an iam role + * @param roleArn The arn of the iam role to get information about + */ + getIAMRole(roleArn: string): Promise { + const command = new GetRoleCommand({ + RoleName: this._extractIAMRoleName(roleArn), + }); + return this.client.send(command).then((data: GetRoleCommandOutput) => data.Role); + } + + /** + * Creates a basic lambda iam role + * @param roleName The name of the iam role + */ + createBasicLambdaRole(roleName: string): Promise { + const policy = CONSTANTS.AWS.IAM.ROLE.LAMBDA_BASIC_ROLE.POLICY; + const command = new CreateRoleCommand({ + RoleName: roleName, + AssumeRolePolicyDocument: JSON.stringify(policy), + }); + return this.client.send(command).then((data: CreateRoleCommandOutput) => data.Role); + } + + /** + * Attaches the basic lambda managed role policy to an iam role + * @param roleArn The arn of the iam role to attach the role policy to + */ + attachBasicLambdaRolePolicy(roleArn: string): Promise { + const command = new AttachRolePolicyCommand({ + PolicyArn: CONSTANTS.AWS.IAM.ROLE.LAMBDA_BASIC_ROLE.POLICY_ARN, + RoleName: this._extractIAMRoleName(roleArn), + }); + return this.client.send(command); + } + + /** + * Extracts iam role name from an iam role arn + * @param roleArn The arn of the iam role to extract the role name from + */ + _extractIAMRoleName(roleArn: string): string | undefined { + return roleArn.split("role/").pop(); + } +} diff --git a/lib/clients/aws-client/lambda-client.js b/lib/clients/aws-client/lambda-client.js deleted file mode 100644 index 337d09cc..00000000 --- a/lib/clients/aws-client/lambda-client.js +++ /dev/null @@ -1,150 +0,0 @@ -const aws = require("aws-sdk"); - -const stringUtils = require("../../utils/string-utils"); -const AbstractAwsClient = require("./abstract-aws-client"); - -/** - * Class for Lambda Client - */ -module.exports = class LambdaClient extends AbstractAwsClient { - constructor(configuration) { - super(configuration); - this.client = new aws.Lambda(); - } - - /** - * Wrapper of aws sdk api - * Creates a Lambda function - * @param {string} functionName The name of the Lambda function. - * @param {object} config The configuration of the Lambda function. - * @param {string} role The Amazon Resource Name (ARN) of the function's execution role. - * @param {Buffer} zipFile The base64-encoded contents of the deployment package. - * @param {callback} callback { error, response } - */ - createLambdaFunction(functionName, config, role, zipFile, callback) { - const {runtime, handler, description, memorySize, timeout, environmentVariables} = config; - const params = { - Code: { - ZipFile: zipFile, - }, - FunctionName: functionName, - Handler: handler, - MemorySize: memorySize, - Role: role, - Runtime: runtime, - Timeout: timeout, - ...(description && {Description: description}), - ...(environmentVariables && {Environment: {Variables: environmentVariables}}), - }; - this.client.createFunction(params, (err, data) => { - callback(err, !err ? data : null); - }); - } - - /** - * Wrapper of aws sdk api - * Grants an AWS service or another account permission to use a function. - * @param {string} domain The type of skill. - * @param {string} skillId The skill ID is used as a token that must be supplied by the invoker. - * @param {string} functionArn The arn of the Lambda function. - * @param {callback} callback { error, response } - */ - addAlexaPermissionByDomain(domain, skillId, functionArn, callback) { - const params = this._getDomainPermission(domain); - if (!params) return callback(); - - params.FunctionName = functionArn; - params.EventSourceToken = skillId; - this.client.addPermission(params, (err, data) => { - callback(err, !err ? data : null); - }); - } - - /** - * Wrapper of aws sdk api - * Returns information about the function or function version - * @param {string} functionArn The name of the Lambda function - * @param {callback} callback { error, response } - */ - getFunction(functionArn, callback) { - const params = { - FunctionName: functionArn, - }; - this.client.getFunction(params, (err, data) => { - callback(err, !err ? data : null); - }); - } - - /** - * Wrapper of aws sdk api - * Updates a Lambda function's code. - * @param {Buffer} zipFile The base64-encoded contents of the deployment package. - * @param {string} functionArn The arn of the Lambda function. - * @param {string} revisionId Only update the function if the revision ID matches the ID that's specified. - * @param {callback} callback { error, response } - */ - updateFunctionCode(zipFile, functionArn, revisionId, callback) { - const codeUpdateParams = { - ZipFile: zipFile, - FunctionName: functionArn, - RevisionId: revisionId, - }; - this.client.updateFunctionCode(codeUpdateParams, (err, data) => { - callback(err, !err ? data : null); - }); - } - - /** - * Wrapper of aws sdk api - * Modifies the version-specific settings of a Lambda function. - * @param {string} functionArn The arn of the Lambda function. - * @param {object} config The configuration of the Lambda function. - * @param {string} revisionId Only update the function if the revision ID matches the ID that's specified. - * @param {callback} callback { error, response } - */ - updateFunctionConfiguration(functionArn, config, revisionId, callback) { - const {runtime, handler, description, memorySize, timeout, environmentVariables} = config; - const params = { - FunctionName: functionArn, - Handler: handler, - MemorySize: memorySize, - RevisionId: revisionId, - Runtime: runtime, - Timeout: timeout, - ...(description && {Description: description}), - ...(environmentVariables && {Environment: {Variables: environmentVariables}}), - }; - this.client.updateFunctionConfiguration(params, (err, data) => { - callback(err, !err ? data : null); - }); - } - - /** - * Gets a permission configuration by skill domain. - * @param {string} domain skill domain - */ - _getDomainPermission(domain) { - let permission; - switch (domain) { - case "smartHome": - case "video": - permission = { - Action: "lambda:InvokeFunction", - StatementId: Date.now().toString(), - Principal: "alexa-connectedhome.amazon.com", - }; - break; - case "custom": - case "houseHoldList": - case "music": - permission = { - Action: "lambda:InvokeFunction", - StatementId: Date.now().toString(), - Principal: "alexa-appkit.amazon.com", - }; - break; - default: - } - return permission; - } -}; diff --git a/lib/clients/aws-client/lambda-client.ts b/lib/clients/aws-client/lambda-client.ts new file mode 100644 index 00000000..1c37cb3f --- /dev/null +++ b/lib/clients/aws-client/lambda-client.ts @@ -0,0 +1,162 @@ +import { + LambdaClient as _LambdaClient, + AddPermissionCommand, + AddPermissionCommandOutput, + CreateFunctionCommand, + CreateFunctionCommandOutput, + GetFunctionCommand, + GetFunctionCommandOutput, + UpdateFunctionCodeCommand, + UpdateFunctionCodeCommandOutput, + UpdateFunctionConfigurationCommand, + UpdateFunctionConfigurationCommandOutput, +} from "@aws-sdk/client-lambda"; + +import AbstractAwsClient, {AwsClientConfiguration} from "./abstract-aws-client"; + +/** + * Class for Lambda Client + */ +export default class LambdaClient extends AbstractAwsClient { + client: _LambdaClient; + + /** + * Constructor + * @param configuration The AWS client config + */ + constructor(configuration: AwsClientConfiguration) { + super(configuration); + this.client = new _LambdaClient({ + credentials: this.credentials, + region: this.region, + }); + } + + /** + * Creates a lambda function + * @param functionName The name of the lambda function + * @param config The configuration of the lambda function + * @param role The arn of the iam role + * @param zipFile The base64-encoded contents of the deployment package + */ + createLambdaFunction( + functionName: string, + config: FunctionConfiguration, + role: string, + zipFile: Buffer, + ): Promise { + const {runtime, handler, description, memorySize, timeout, environmentVariables} = config; + const command = new CreateFunctionCommand({ + Code: { + ZipFile: zipFile, + }, + FunctionName: functionName, + Handler: handler, + MemorySize: memorySize, + Role: role, + Runtime: runtime, + Timeout: timeout, + ...(description && {Description: description}), + ...(environmentVariables && {Environment: {Variables: environmentVariables}}), + }); + return this.client.send(command); + } + + /** + * Adds Alexa service permission to a lambda function + * @param skillType The skill type + * @param skillId The skill id used as a event source token + * @param functionArn The arn of the lambda function + */ + addAlexaPermissionByDomain(skillType: string, skillId: string, functionArn: string): Promise { + const command = new AddPermissionCommand({ + FunctionName: functionArn, + StatementId: Date.now().toString(), + Action: "lambda:InvokeFunction", + Principal: this._getAlexaServicePrincipal(skillType), + EventSourceToken: skillId, + }); + return this.client.send(command); + } + + /** + * Returns information for a lambda function + * @param functionArn The name of the lambda function + */ + getFunction(functionArn: string): Promise { + const command = new GetFunctionCommand({ + FunctionName: functionArn, + }); + return this.client.send(command); + } + + /** + * Updates the code for a lambda function + * @param functionArn The arn of the lambda function + * @param zipFile The base64-encoded contents of the deployment package + * @param revisionId Only update the function if the revision ID matches the ID that's specified + */ + updateFunctionCode(functionArn: string, zipFile: Buffer, revisionId: string): Promise { + const command = new UpdateFunctionCodeCommand({ + FunctionName: functionArn, + ZipFile: zipFile, + RevisionId: revisionId, + }); + return this.client.send(command); + } + + /** + * Updates the configuration for a lambda function + * @param functionArn The arn of the lambda function + * @param config The configuration of the lambda function + * @param revisionId Only update the function if the revision ID matches the ID that's specified + */ + updateFunctionConfiguration( + functionArn: string, + config: FunctionConfiguration, + revisionId: string, + ): Promise { + const {runtime, handler, description, memorySize, timeout, environmentVariables} = config; + const command = new UpdateFunctionConfigurationCommand({ + FunctionName: functionArn, + Handler: handler, + MemorySize: memorySize, + RevisionId: revisionId, + Runtime: runtime, + Timeout: timeout, + ...(description && {Description: description}), + ...(environmentVariables && {Environment: {Variables: environmentVariables}}), + }); + return this.client.send(command); + } + + /** + * Returns the alexa service principal for a skill type + * @param skillType The skill type + */ + _getAlexaServicePrincipal(skillType: string): string | undefined { + switch (skillType) { + case "smartHome": + case "video": + return "alexa-connectedhome.amazon.com"; + case "custom": + case "houseHoldList": + case "music": + return "alexa-appkit.amazon.com"; + default: + return; + } + } +} + +/** + * Interface for Lambda Function Configuration + */ +export interface FunctionConfiguration { + runtime: string; + handler: string; + description?: string; + memorySize: number; + timeout: number; + environmentVariables?: Record; +} diff --git a/lib/clients/aws-client/s3-client.js b/lib/clients/aws-client/s3-client.js deleted file mode 100644 index 8e91d67d..00000000 --- a/lib/clients/aws-client/s3-client.js +++ /dev/null @@ -1,396 +0,0 @@ -const fs = require("fs"); -const path = require("path"); -const R = require("ramda"); -const requestLib = require("request"); -const prettyBytes = require("pretty-bytes"); -const aws = require("aws-sdk"); - -const SpinnerView = require("../../view/spinner-view"); -const {ParallelStream} = require("../../utils/stream-utility"); -const CONSTANTS = require("../../utils/constants"); -const AbstractAwsClient = require("./abstract-aws-client"); - -/** - * Class for S3 client - */ -module.exports = class S3Client extends AbstractAwsClient { - constructor(configuration) { - super(configuration); - - const httpClient = new aws.NodeHttpClient(); - const httpAgent = httpClient.getAgent(true, { - keepAlive: false, - }); - this.client = new aws.S3({ - httpOptions: { - agent: httpAgent, - }, - }); - } - - /** - * Upload to a pre-signed S3 url with custom options - * @param {string} url - * @param {object} options - * @param {function} callback - */ - static preSignedPutObject(url, options, callback) { - if (typeof url !== "string" || !url.trim()) { - process.nextTick(() => callback("[Error]: The url for the S3 presigned URL upload must not be blank.")); - } - requestLib.put(url, options, (err, response) => { - callback(err, response); - }); - } - - /** - * Function used to provision bucket and upload object to it - * @param {string} bucketName bucket name - * @param {string} key key name, key is the unique identifier for an object within a bucket. - * @param {string} lambdaRegion lambda region name - * @param {string} filePath file path to content want to upload - * @param {callback} callback { error, response } - */ - provisionBucketAndPutObject(bucketName, key, lambdaRegion, filePath, callback) { - this.createBucketIfNotExist(bucketName, lambdaRegion, (createErr) => { - if (createErr) { - return callback(createErr); - } - this.putBucketVersioningIfUninitialized(bucketName, (putVersionErr) => { - if (putVersionErr) { - return callback(putVersionErr); - } - this.putObject(bucketName, key, fs.readFileSync(filePath), (putObjectErr, putResponse) => { - if (putObjectErr) { - return callback(putObjectErr); - } - callback(null, putResponse); - }); - }); - }); - } - - /** - * Function used to create s3 bucket with input bucket name - * if no bucket with that name is found - * first check whether the bucket is exist already and user has permission to access it - If the bucket is exsit, reuse that bucket and skip creating new bucket - If the bucket is not exsit, use the input bucket name to create a new bucket - If other error happen, callback error message - * @param {string} bucket bucket name - * @param {string} region aws region name - * @param {callback} callback { error } - */ - createBucketIfNotExist(bucket, region, callback) { - this.headBucket(bucket, (headErr) => { - if (headErr) { - if (headErr.code !== "NotFound") { - return callback(headErr); - } - this.createBucket(bucket, region, (createErr) => { - if (createErr) { - return callback(createErr); - } - this.waitForBucketExists(bucket, (waitErr) => { - if (waitErr) { - return callback(waitErr); - } - callback(); - }); - }); - } else { - callback(); - } - }); - } - - /** - * Check if bucket versioning is initialized - * if not, put bucket versioning - * @param {string} bucketName bucket name - * @param {callback} callback { error } - */ - putBucketVersioningIfUninitialized(bucketName, callback) { - this.getBucketVersioning(bucketName, (getVersionErr, response) => { - if (getVersionErr) { - return callback(getVersionErr); - } - // if bucket versioning is not set, cli will set it with fixed config { MFADelete: Disabled, Status: Enabled } - // if bucket verisoning is already set, skip this step - if (typeof response === "object" && R.keys(response).length === 0) { - this.putBucketVersioning(bucketName, "Disabled", "Enabled", (putVersionErr) => { - if (putVersionErr) { - return callback(putVersionErr); - } - callback(); - }); - } else { - callback(); - } - }); - } - - /** - * Wrapper of aws sdk api - * Function used to update s3 bucket version - * @param {string} bucketName bucket name - * @param {enum} mfaDelete Valid Values: Disabled | Enabled. Specifies whether MFA Delete is enabled in the bucket versioning configuration. - * When enabled, the bucket owner must include the x-amz-mfa request header in requests - to change the versioning state of a bucket and to permanently delete a versioned object. - * @param {enum} status Valid Values: Suspended | Enabled. Sets the versioning state of the bucket. - * @param {callback} callback { error, response } - */ - putBucketVersioning(bucketName, mfaDelete, status, callback) { - const params = { - Bucket: bucketName, - VersioningConfiguration: { - MFADelete: mfaDelete, - Status: status, - }, - }; - const request = this.client.putBucketVersioning(params); - - request.on("retry", (response) => { - this.retryBucketVersionOperations(response); - }); - request.on("success", (response) => { - callback(null, response.data); - }); - request.on("error", (error) => { - callback(error, null); - }); - - request.send(); - } - - /** - * Wrapper of aws sdk api - * Function used to check whether the bucket versioning is set or not - * @param {string} bucketName bucket name - * @param {callback} callback { error, response } - */ - getBucketVersioning(bucketName, callback) { - const params = { - Bucket: bucketName, - }; - const request = this.client.getBucketVersioning(params); - - request.on("retry", (response) => { - this.retryBucketVersionOperations(response); - }); - request.on("success", (response) => { - callback(null, response.data); - }); - request.on("error", (error) => { - callback(error, null); - }); - - request.send(); - } - - /** - * Wrapper of aws sdk api - * Function used to create s3 bucket - * @param {string} bucketName the name of bucket want to create - * @param {string} region aws region code - * @param {callback} callback { error, response } - */ - createBucket(bucketName, region, callback) { - const params = { - Bucket: bucketName, - }; - // us-east-1 is not a supported value for LocationConstraint property at aws apis - // should leave LocationConstraint empty when region code is us-east-1 - if (region && region !== "us-east-1") { - params.CreateBucketConfiguration = { - LocationConstraint: region, - }; - } - this.client.createBucket(params, (err, response) => { - callback(err, !err ? response : null); - }); - } - - /** - * Wrapper of aws sdk api - * Function used to determine if a bucket exists and user has permission to access it - * @param {string} bucketName bucket name - * @param {callback} callback { error, response } - */ - headBucket(bucketName, callback) { - const params = { - Bucket: bucketName, - }; - this.client.headBucket(params, (err, response) => { - callback(err, !err ? response : null); - }); - } - - /** - * Wrapper of aws sdk api - * Function used to upload object to aws s3 bucket - * @param {string} bucket bucket name - * @param {string} key the name of uploaded content on s3 bucket - * @param {Object} body the content want to upload to s3 bucket - * @param {callback} callback { ETag, VersionId } - */ - putObject(bucket, key, body, callback) { - const params = { - Body: body, - Bucket: bucket, - Key: key, - }; - this.client.putObject(params, (err, response) => { - callback(err, !err ? response : null); - }); - } - - /** - * Wait for s3 bucket exists - * @param {string} bucketName bucket name - * @param {callback} callback - */ - waitForBucketExists(bucketName, callback) { - const params = { - Bucket: bucketName, - }; - this.client.waitFor("bucketExists", params, (err, response) => { - callback(err, !err ? response : null); - }); - } - - /** - * Function used to generate valid bucketName - * The bucket name should follow the pattern: ask-projectName-profileName-awsRegion-timeStamp - * a valid bucket name cannot longer than 63 characters, so cli fix the project name no longer than 22 characters - * and fix the profile name no longer than 9 characters - * @param {string} profile profile name - * @param {string} awsRegion aws region code, eg: us-east-1 - */ - static generateBucketName(profile, awsRegion) { - const projectName = path.basename(process.cwd()); - const validProjectName = projectName - .toLowerCase() - .replace(/[^a-z0-9-.]+/g, "") - .substring(0, 22); - const validProfile = profile - .toLowerCase() - .replace(/[^a-z0-9-.]+/g, "") - .substring(0, 9); - const shortRegionName = awsRegion.replace(/-/g, ""); - return `ask-${validProjectName}-${validProfile}-${shortRegionName}-${Date.now()}`; - } - - /** - * Implement the multipart upload to S3. Run upload in parallel for each part by using ParallelStream. - * - * @param {object} uploadPartsMap Mapping between partNumber and its eTag - * @param {string} filePath The file to upload - * @param {integer} totalSize Total size of the file - * @param {integer} partSize The size of each partition (the last part can be smaller then this) - * @param {integer} partsNumber The number of partitions of the file - * @param {callback} callback - */ - static multipartsUploadToPresignedUrls(uploadPartsMap, filePath, totalSize, partSize, partsNumber, callback) { - const progressSpinner = new SpinnerView(); - - // Declarations of the state signals for the unordered stream upload - const partETagsList = []; - let partBuffer = []; - let partBufferTotalLength = 0; - let loadedPartCount = 0; - let loadedSize = 0; - let uploadedPartCount = 0; - let uploadedSize = 0; - const uploadTask = (chunk, enc, done) => { - // 1. Clear the partBuffer and append the rest (by slicing a partSize buffer) to the partBuffer - const aggregatedBuffer = Buffer.concat(partBuffer); - const rest = aggregatedBuffer.slice(partSize); - partBuffer = []; - partBuffer.push(rest); - partBufferTotalLength = rest.length; - - // 2. Upload by S3 presigned URL - // Need to store the part number for current "thread" to avoid wrong mapping for eTag and partNumber - const threadPartNum = ++loadedPartCount; - progressSpinner.update( - ` ${loadedPartCount}/${partsNumber} uploads have been requested. ` + - `Currently ${uploadedPartCount}/${partsNumber} parts and ${prettyBytes(uploadedSize)}/${prettyBytes( - totalSize, - )} have been uploaded...`, - ); - S3Client.preSignedPutObject(uploadPartsMap.get(threadPartNum), {body: aggregatedBuffer}, (err, response) => { - if (err) { - return done(err); - } - - // 3. Update uploaded parts state. - uploadedPartCount++; - uploadedSize += aggregatedBuffer.byteLength; - partETagsList.push({ - eTag: response.headers.etag, - partNumber: threadPartNum, - }); - - progressSpinner.update( - ` ${loadedPartCount}/${partsNumber} uploads have been requested. ` + - `Currently ${uploadedPartCount}/${partsNumber} parts ` + - `and ${prettyBytes(uploadedSize)}/${prettyBytes(totalSize)} have been uploaded...`, - ); - done(); - }); - }; - - const processStreamBuffer = (chunk) => { - // Process data whenever stream buffer is readable. Accumulate part and total length for the partBuffer - partBuffer.push(chunk); - partBufferTotalLength += chunk.byteLength; - loadedSize += chunk.byteLength; - }; - - const verifyAndFinish = () => { - progressSpinner.terminate(); - if (partETagsList.length !== partsNumber) { - callback( - `[Error]: Multipart upload failed. There are ${partsNumber - partETagsList.length}` + - ` part(s) over ${partsNumber} parts not uploaded. Please try again!`, - ); - return; - } - for (const element of partETagsList) { - const tmpETag = element.eTag; - if (typeof tmpETag !== "string" || !tmpETag.trim()) { - callback(`[Error]: Failed to get the ETag for part number ${element.partNumber}. Please try again!`); - return; - } - } - callback(null, partETagsList); - }; - - const parallelStreamOptions = { - willTransform: () => partBufferTotalLength >= partSize || (loadedPartCount === partsNumber - 1 && loadedSize === totalSize), - concurrency: CONSTANTS.CONFIGURATION.S3.MULTIPART_UPLOAD.CONCURRENCY, - isObjectMode: false, - }; - - // Main stream processing - progressSpinner.start(); - fs.createReadStream(filePath) - .pipe(new ParallelStream(uploadTask, processStreamBuffer, verifyAndFinish, parallelStreamOptions)) - .on("error", (err) => { - callback(err); - }); - } - - /** - * Retry logic to apply to GetBucketVersioning and PutBucketVersioning operations - * to mitigate S3 eventual consistency issues following a bucket creation - * @param {*} S3 response - */ - retryBucketVersionOperations(response) { - if (response.httpResponse.statusCode === 404 && response.error) { - response.error.retryable = true; - response.error.retryDelay = CONSTANTS.CONFIGURATION.S3.VERSIONING.NOT_FOUND_RETRY_DELAY_MS; - } - } -}; diff --git a/lib/clients/aws-client/s3-client.ts b/lib/clients/aws-client/s3-client.ts new file mode 100644 index 00000000..d77b080d --- /dev/null +++ b/lib/clients/aws-client/s3-client.ts @@ -0,0 +1,129 @@ +import { + S3Client as _S3Client, + S3ServiceException, + CreateBucketCommand, + CreateBucketCommandOutput, + GetBucketVersioningCommand, + GetBucketVersioningCommandOutput, + HeadBucketCommand, + PutBucketVersioningCommand, + PutBucketVersioningCommandOutput, + PutObjectCommand, + PutObjectCommandOutput, + waitUntilBucketExists, +} from "@aws-sdk/client-s3"; +import {WaiterResult} from "@aws-sdk/util-waiter"; + +import CONSTANTS from "../../utils/constants"; +import AbstractAwsClient, {AwsClientConfiguration} from "./abstract-aws-client"; + +/** + * Class for S3 client + */ +export default class S3Client extends AbstractAwsClient { + client: _S3Client; + + /** + * Constructor + * @param configuration aws client config + */ + constructor(configuration: AwsClientConfiguration) { + super(configuration); + this.client = new _S3Client({ + credentials: this.credentials, + region: this.region, + }); + } + + /** + * Enables s3 bucket version + * @param bucketName bucket name + */ + enableBucketVersioning(bucketName: string): Promise { + const command = new PutBucketVersioningCommand({ + Bucket: bucketName, + VersioningConfiguration: { + MFADelete: "Disabled", + Status: "Enabled", + }, + }); + return this.client.send(command); + } + + /** + * Checks whether the bucket versioning is set or not + * @param bucketName bucket name + */ + getBucketVersioning(bucketName: string): Promise { + const command = new GetBucketVersioningCommand({ + Bucket: bucketName, + }); + return this.client.send(command); + } + + /** + * Creates s3 bucket + * @param bucketName bucket name + * @param region aws region code + */ + createBucket(bucketName: string, region: string): Promise { + const command = new CreateBucketCommand({ + Bucket: bucketName, + // add LocationConstraint bukcet config if provided region not default location (us-east-1) + ...(region && + region !== CONSTANTS.CONFIGURATION.S3.DEFAULT_LOCATION && { + CreateBucketConfiguration: { + LocationConstraint: region, + }, + }), + }); + return this.client.send(command); + } + + /** + * Checks if s3 bucket exists + * @param bucketName bucket name + */ + bucketExits(bucketName: string): Promise { + const command = new HeadBucketCommand({ + Bucket: bucketName, + }); + return this.client + .send(command) + .then(() => true) + .catch((err: S3ServiceException) => { + if (err.$metadata?.httpStatusCode === 404) return false; + throw err; + }); + } + + /** + * Uploads object to aws s3 bucket + * @param bucket bucket name + * @param key the name of uploaded content on s3 bucket + * @param body the content want to upload to s3 bucket + */ + putObject(bucket: string, key: string, body: Buffer): Promise { + const command = new PutObjectCommand({ + Bucket: bucket, + Key: key, + Body: body, + }); + return this.client.send(command); + } + + /** + * Waits for s3 bucket exists + * @param bucketName bucket name + */ + waitForBucketExists(bucketName: string): Promise { + const params = { + client: this.client, + maxWaitTime: CONSTANTS.CONFIGURATION.S3.MAX_WAIT_TIME, + }; + const input = { + Bucket: bucketName, + }; + return waitUntilBucketExists(params, input); + } +} diff --git a/lib/clients/http-client.js b/lib/clients/http-client.js index f9c51e0a..fd5adfe8 100644 --- a/lib/clients/http-client.js +++ b/lib/clients/http-client.js @@ -1,70 +1,93 @@ -const R = require("ramda"); -const requestLib = require("request"); +"use strict"; +import axios from "axios"; +import {Url, parse} from "url"; -const DynamicConfig = require("../utils/dynamic-config"); -const logger = require("../utils/logger-utility"); -const urlUtils = require("../utils/url-utils"); -const stringUtils = require("../utils/string-utils"); -const CONSTANTS = require("../utils/constants"); - -module.exports = { - request, - putByUrl, -}; +import {userAgent} from "../utils/dynamic-config"; +import {getInstance as loggerInstance} from "../utils/logger-utility"; +import {isValidUrl} from "../utils/url-utils"; +import {isNonBlankString} from "../utils/string-utils"; +import {HTTP_REQUEST} from "../utils/constants"; /** - * Core CLI request function with User-Agent setting. + * Core CLI request function with User-Agent setting and proxy support. * * @param {object} options request options object * @param {string} operation operation name for the request * @param {boolean} doDebug define if debug info is needed * @param {function} callback */ -function request(options, operation, doDebug, callback) { +export function request(options, operation, doDebug, callback) { // Validation of input parameters - const requestOptions = R.clone(options); if (typeof operation !== "string" || !operation.trim()) { process.nextTick(() => { callback("[Fatal]: CLI request must have a non-empty operation name."); }); return; } - if (!urlUtils.isValidUrl(requestOptions.url)) { + if (!isValidUrl(options.url)) { process.nextTick(() => { - callback(`[Fatal]: Invalid URL:${requestOptions.url}. CLI request must call with valid url.`); + callback(`[Fatal]: Invalid URL:${options.url}. CLI request must call with valid url.`); }); return; } - const proxyUrl = process.env.ASK_CLI_PROXY; - if (stringUtils.isNonBlankString(proxyUrl)) { - requestOptions.proxy = proxyUrl; + let proxyConfig = {}; + try { + proxyConfig = getProxyConfigurations(); + } catch (err) { + return callback(err.message); } + const requestOptions = { + method: options.method || "GET", + url: options.url, + headers: options.headers || {}, + data: options.body, + ...(options.responseType ? {responseType: options.responseType} : {}), + ...proxyConfig, + }; + // Set user-agent for each CLI request - if (!requestOptions.headers) { - requestOptions.headers = {}; - } - requestOptions.headers["User-Agent"] = DynamicConfig.userAgent; + requestOptions.headers["User-Agent"] = userAgent; // Make request - requestLib(requestOptions, (error, response) => { - if (doDebug) { - logger.getInstance().debug(debugContentForResponse(operation, error, response)); - } - if (error) { - return callback(`Failed to make request to ${operation}.\nError response: ${error}`); - } - if (!response) { - return callback(`Failed to make request to ${operation}.\nPlease make sure "${requestOptions.url}" is responding.`); - } - if (!response.statusCode) { - return callback(`Failed to access the statusCode from the request to ${operation}.`); - } - return callback(null, response); - }); -} + return axios.request(requestOptions) + .then((response) => { + if (doDebug) { + loggerInstance().debug(debugContentForResponse(operation, null, response)); + } + if (!response) { + return callback({ + errorMessage :`The request to ${operation}, failed.\nPlease make sure "${requestOptions.url}" is responding.`, + }); + } + if (!response.status) { + return callback({ + errorMessage :`Failed to access the statusCode from the request to ${operation}.`, + }); + } + return callback(null, { + statusCode: response.status, + ...(response.data ? {body: response.data} : {}), + ...(response.headers ? {headers: response.headers} : {}), + }); + }) + .catch((error) => { + const response = error ? error.response || {} : {}; + error.statusCode ||= response.status; + if (doDebug) { + loggerInstance().debug(debugContentForResponse(operation, error, response)); + } + + return callback({ + errorMessage : `The request to ${requestOptions.url} failed. Client Error: ${error}`, + statusCode: response.status, + ...(response.data ? {body: response.data} : {}), + ...(response.headers ? {headers: response.headers} : {}), + }, response); + }); +} /** * HTTP client's upload method * @param {String} url @@ -73,10 +96,10 @@ function request(options, operation, doDebug, callback) { * @param {Boolean} doDebug * @param {Function} callback */ -function putByUrl(url, payload, operation, doDebug, callback) { +export function putByUrl(url, payload, operation, doDebug, callback) { const options = { url, - method: CONSTANTS.HTTP_REQUEST.VERB.PUT, + method: HTTP_REQUEST.VERB.PUT, headers: {}, body: payload, }; @@ -92,21 +115,77 @@ function putByUrl(url, payload, operation, doDebug, callback) { * @param {object} response */ function debugContentForResponse(operation, error, response) { - return { + const debugContent = { activity: operation, error, - "request-id": response.headers["x-amzn-requestid"] || null, - request: { - method: response.request.method, - url: response.request.href, - headers: response.request.headers, - body: response.request.body, - }, - response: { - statusCode: response.statusCode, - statusMessage: response.statusMessage, - headers: response.headers, - }, - body: response.body, }; + if (response) { + debugContent["response"] = { + ...(response.status ? { statusCode: response.status } : {}), + ...(response.statusText ? { statusMessage: response.statusText } : {}), + ...(response.headers ? { headers: response.headers } : {}), + }; + debugContent["request-id"] = response.headers ? (debugContent["request-id"] = response.headers["x-amzn-requestid"] || null) : null; + const requestConfig = response.config || {}; + if (response.request) { + debugContent["request"] = { + method: requestConfig.method, + url: requestConfig.url, + headers: response.request._headers || requestConfig.headers, + body: requestConfig.data, + }; + } + if (response.data) { + debugContent["body"] = response.data; + } + } + return debugContent; +} + +/** + * If the env variable ASK_CLI_PROXY is set, returns the axios proxy object to append to the requestOptions + * as defined here https://www.npmjs.com/package/axios#request-config + * Otherwise returns an empty object {} + * @returns {Record} axios proxy configurations + * @throws {Error} if the ASK_CLI_PROXY is not a valid URL + */ +function getProxyConfigurations() { + const proxyEnv = process.env.ASK_CLI_PROXY; + const configuration = {}; + if (proxyEnv && isNonBlankString(proxyEnv)) { + if (!isValidUrl(proxyEnv)) { + throw new Error(`[Fatal]: Invalid Proxy setting URL: ${proxyEnv}. Reset ASK_CLI_PROXY env variable with a valid proxy url.`); + } + const proxyUrl = parse(proxyEnv); + configuration.proxy = { + protocol: proxyUrl.protocol.replace(":", ""), + host: proxyUrl.hostname, + ...(proxyUrl.port ? {port: proxyUrl.port} : {}), + ...getAuthFromUrlObject(proxyUrl), + }; + } + return configuration; +} + +/** + * Gets the auth part of the specified Url and returns an axios auth object to append to the proxy / request object + * as defined here https://www.npmjs.com/package/axios#request-config + * Otherwise returns an empty object {} + * @param {Url} url + * @returns {Record} axios proxy auth configurations + */ +function getAuthFromUrlObject(url) { + const auth = {}; + if (url.auth) { + const authSplit = url.auth.split(":"); + const authBody = {}; + if (authSplit.length > 0) { + authBody.username = authSplit[0]; + } + if (authSplit.length > 1) { + authBody.password = authSplit[1]; + } + auth.auth = authBody; + } + return auth; } diff --git a/lib/clients/lwa-auth-code-client/index.js b/lib/clients/lwa-auth-code-client/index.js index 6753f0cc..de8b19af 100644 --- a/lib/clients/lwa-auth-code-client/index.js +++ b/lib/clients/lwa-auth-code-client/index.js @@ -37,11 +37,11 @@ module.exports = class LWAAuthCodeClient { body, json: !!body, }; - httpClient.request(options, "GET_ACCESS_TOKEN", this.config.doDebug, (err, response) => { - if (err) { - return callback(err); + httpClient.request(options, "GET_ACCESS_TOKEN", this.config.doDebug, (requestError, requestResponse) => { + if (requestError) { + return callback(requestError.errorMessage || requestError); } - const tokenBody = R.clone(response.body); + const tokenBody = R.clone(requestResponse.body); if (tokenBody.error) { return callback(new CliError(tokenBody.error)); } @@ -57,32 +57,32 @@ module.exports = class LWAAuthCodeClient { */ refreshToken(token, callback) { const url = new URL(this.config.tokenPath, this.config.tokenHost); - const body = { - grant_type: "refresh_token", - refresh_token: token.refresh_token, - client_id: this.config.clientId, - client_secret: this.config.clientConfirmation, - }; const options = { url: `${url}`, + headers: {"content-type": "application/json"}, method: "POST", - body, - json: !!body, + body: { + grant_type: "refresh_token", + refresh_token: token.refresh_token, + client_id: this.config.clientId, + client_secret: this.config.clientConfirmation, + }, + json: true, }; - httpClient.request(options, "GET_ACCESS_TOKEN_USING_REFRESH_TOKEN", this.config.doDebug, (err, response) => { - if (err) { - return callback(err); + httpClient.request(options, "GET_ACCESS_TOKEN_USING_REFRESH_TOKEN", this.config.doDebug, (requestError, requestResponse) => { + if (requestError) { + return callback(requestError.message || requestError); } - const responseErr = R.view(R.lensPath(["body", "error"]), response); + const responseErr = R.view(R.lensPath(["body", "error"]), requestResponse); if (stringUtils.isNonBlankString(responseErr)) { return callback(`Refresh LWA tokens failed, please run "ask configure" to manually update your tokens. Error: ${responseErr}.`); } - const expiresIn = R.view(R.lensPath(["body", "expires_in"]), response); + const expiresIn = R.view(R.lensPath(["body", "expires_in"]), requestResponse); if (!expiresIn) { - return callback(`Received invalid response body from LWA without "expires_in":\n${jsonView.toString(response.body)}`); + return callback(`Received invalid response body from LWA without "expires_in":\n${jsonView.toString(requestResponse.body)}`); } - const tokenBody = R.clone(response.body); + const tokenBody = R.clone(requestResponse.body); if (tokenBody.error) { return callback(new CliError(tokenBody.error)); } diff --git a/lib/clients/smapi-client/index.ts b/lib/clients/smapi-client/index.ts index ed7f9578..85d1838a 100644 --- a/lib/clients/smapi-client/index.ts +++ b/lib/clients/smapi-client/index.ts @@ -1,7 +1,7 @@ import querystring from "querystring"; import AuthorizationController from "../../controllers/authorization-controller"; import DynamicConfig from "../../utils/dynamic-config"; -import httpClient from "../http-client"; +import * as httpClient from "../http-client"; import accountLinkingApi from "./resources/account-linking"; import catalogApi from "./resources/catalog"; @@ -162,12 +162,17 @@ export class SmapiClientLateBound { body: payload, json: !!payload, }; - httpClient.request(requestOptions, apiName, configuration.doDebug, (reqErr: any, reqResponse: SmapiResponse) => { - if (reqErr) { - return callback(reqErr); + httpClient.request(requestOptions, apiName, configuration.doDebug, (requestError: any, requestResponse: SmapiResponse) => { + if (requestError && requestError.statusCode ) { + return _normalizeSmapiResponse(requestError, (normalizeErr, smapiResponse) => { + return callback(normalizeErr || smapiResponse, smapiResponse || null); + }); } - _normalizeSmapiResponse(reqResponse, (normalizeErr, smapiResponse) => { - callback(normalizeErr, normalizeErr ? null : smapiResponse); + if (requestError) { + return callback(requestError.errorMessage || requestError); + } + return _normalizeSmapiResponse(requestResponse, (normalizeError, smapiResponse) => { + return callback(normalizeError, normalizeError ? null : smapiResponse); }); }); }); @@ -235,12 +240,14 @@ export interface SmapiResponseObject> { statusCode: number; body: T; headers: any[]; + message?: string; } export interface SmapiResponseError { statusCode: number; body: E & {message: string}; headers: any[]; + message?: string; } export function isSmapiError(response: SmapiResponse): response is SmapiResponseError { @@ -264,6 +271,7 @@ function _normalizeSmapiResponse(reqResponse: SmapiResponse, callback: (er statusCode: reqResponse.statusCode, body: parsedResponseBody, headers: reqResponse.headers, + ...(reqResponse.message? {message: reqResponse.message} : {}) }); } diff --git a/lib/clients/smapi-client/smapiApiClient.ts b/lib/clients/smapi-client/smapiApiClient.ts new file mode 100644 index 00000000..7591fc27 --- /dev/null +++ b/lib/clients/smapi-client/smapiApiClient.ts @@ -0,0 +1,83 @@ +import {ApiClient, ApiClientRequest, ApiClientResponse} from "ask-sdk-model-runtime"; + +import {SmapiResponse} from "."; +import * as httpClient from "../http-client"; + +/** + * Implementation of {@link ApiClient} that leverages the httpclient class which supports setting Proxies and publishing telemetry metrics. + * This is use while building a CustomSmapiClientBuilder instead of using the DefaultApiClient + */ +export class SmapiApiClient implements ApiClient { + doDebug: boolean; + profile: string; + fullResponse: boolean; + + /** + * Builds an instance of the SmapiApiClient class + * @param doDebug Set to true to tell the httpClient to print request information to the terminal + * @param profile The configured ask profile to use for authorization + * @param fullResponse Set to true to tell the httpClient to print the full response from the service + */ + constructor(doDebug: boolean, profile: string, fullResponse: boolean) { + this.doDebug = doDebug; + this.profile = profile; + this.fullResponse = fullResponse; + } + + /** + * Dispatches a request to an API endpoint described in the request. + * @param {ApiClientRequest} request request to dispatch to the ApiClient + * @returns {Promise} response from the ApiClient + */ + public invoke(request: ApiClientRequest): Promise { + return new Promise(async (resolve, reject) => { + const headers: {[key: string]: string} = {}; + let data: any = request.body; + request.headers?.forEach(header => { + if (header.key.toLowerCase() === "content-type" && + header.value.toLowerCase() === "application/x-www-form-urlencoded") { + data = this.convertUrlEncodedToJson(request.body); + headers[header.key] = "application/json"; + } else { + headers[header.key] = header.value; + } + }); + + const requestOptions = { + url: request.url, + method: request.method, + headers: headers, + body: data, + }; + + httpClient.request(requestOptions, "SMAPI_API_CLIENT", this.doDebug, (requestError: any, requestResponse: SmapiResponse) => { + if (requestError) { + return reject(new Error(requestError.errorMessage || requestError)); + } + const dataContent = requestResponse?.body || {}; + + resolve({ + statusCode: requestResponse?.statusCode!, + body: this.sanitizeDataContent(dataContent), + headers: requestResponse?.headers!, + }); + }); + }); + } + + private convertUrlEncodedToJson(urlEncoded: string | undefined): {[key: string]: string} { + var result: {[key: string]: string} = {}; + urlEncoded?.split('&').forEach((entry) => { + const keyValueSplit = entry.split('='); + if (keyValueSplit && keyValueSplit.length > 1) { + result[keyValueSplit[0]] = decodeURIComponent(keyValueSplit[1] || ''); + } + }); + return result; + } + + private sanitizeDataContent(dataContent: object): string { + return JSON.stringify(dataContent, (k, v) => { if (k !== "_links") return v; }); + } + +} diff --git a/lib/commands/abstract-command.ts b/lib/commands/abstract-command.ts index 375d571a..c05b5e6a 100644 --- a/lib/commands/abstract-command.ts +++ b/lib/commands/abstract-command.ts @@ -2,7 +2,7 @@ import {OptionModel, OptionModelEntry} from "./option-validator"; import semver from "semver"; -import httpClient from "../clients/http-client"; +import * as httpClient from "../clients/http-client"; import {validateRequiredOption, validateOptionString, validateOptionRules} from "./option-validator"; import AppConfig from "../model/app-config"; import CONSTANTS from "../utils/constants"; @@ -196,13 +196,13 @@ export abstract class AbstractCommand = Record { - if (err || response.statusCode > 300) { - const error = err || `Http Status Code: ${response.statusCode}.`; + if (err) { + const error = err.statusCode ? `Http Status Code: ${err.statusCode}.`: err; Messenger.getInstance().error( `Failed to get the latest version for ${CONSTANTS.APPLICATION_NAME} from NPM registry.\n${error}\n`, ); } else { - const latestVersion = JSON.parse(response.body).version; + const latestVersion = response.body?.version; if (packageJson.version !== latestVersion) { if (semver.major(packageJson.version) < semver.major(latestVersion)) { Messenger.getInstance().warn(`\ diff --git a/lib/commands/deploy/index.ts b/lib/commands/deploy/index.ts index 81b97861..c236f76c 100644 --- a/lib/commands/deploy/index.ts +++ b/lib/commands/deploy/index.ts @@ -38,6 +38,8 @@ export default class DeployCommand extends AbstractCommand { try { profile = profileHelper.runtimeProfile(cmd.profile); new ResourcesConfig(path.join(process.cwd(), CONSTANTS.FILE_PATH.ASK_RESOURCES_JSON_CONFIG)); + ResourcesConfig.getInstance().setDeploymentStatus(profile, "IN_PROGRESS"); + ResourcesConfig.getInstance().write(); Messenger.getInstance().info(`Deploy configuration loaded from ${CONSTANTS.FILE_PATH.ASK_RESOURCES_JSON_CONFIG}`); helper.confirmProfile(profile); this._filterAlexaHostedSkill(profile); @@ -80,7 +82,7 @@ export default class DeployCommand extends AbstractCommand { // Save the deployment type to ask states ResourcesConfig.getInstance().setSkillMetaLastDeployType(profile, deploymentType); - + ResourcesConfig.getInstance().setDeploymentStatus(profile, "COMPLETE"); // Write updates back to resources file ResourcesConfig.getInstance().write(); Manifest.getInstance().write(); @@ -105,6 +107,9 @@ export default class DeployCommand extends AbstractCommand { }); }) .catch((err) => { + ResourcesConfig.getInstance().setDeploymentStatus(profile, "COMPLETE"); + // Write updates back to resources file + ResourcesConfig.getInstance().write(); Messenger.getInstance().error(err); return reject(err); }); diff --git a/lib/commands/dialog/index.ts b/lib/commands/dialog/index.ts index f0ac9d6e..d1c027e0 100644 --- a/lib/commands/dialog/index.ts +++ b/lib/commands/dialog/index.ts @@ -81,7 +81,7 @@ export class DialogCommand extends AbstractCommand { const manifestResult = await smapiClient.skill.manifest.getManifest(skillId, stage); if (isSmapiError(manifestResult)) { - throw jsonView.toString(manifestResult.body); + throw new Error(jsonView.toString(manifestResult.body)); } const [firstLocaleFromManifest] = Object.keys(manifestResult.body.manifest?.publishingInformation?.locales || {}); if (!locale && !process.env.ASK_DEFAULT_DEVICE_LOCALE && firstLocaleFromManifest) { diff --git a/lib/commands/init/index.ts b/lib/commands/init/index.ts index d9bdd2c1..4585c4e0 100644 --- a/lib/commands/init/index.ts +++ b/lib/commands/init/index.ts @@ -75,7 +75,7 @@ async function initAlexaHostedSkill(rootPath: string, cmd: Record, return reject(hooksErr); } Messenger.getInstance().info(`\n${skillName} successfully initialized.\n`); - resolve(); + return resolve(); }); }); }); diff --git a/lib/commands/new/template-helper.ts b/lib/commands/new/template-helper.ts index 359d6000..ee856a6c 100644 --- a/lib/commands/new/template-helper.ts +++ b/lib/commands/new/template-helper.ts @@ -1,5 +1,4 @@ -import httpClient from "../../clients/http-client"; -import R from "ramda"; +import * as httpClient from "../../clients/http-client"; import {TEMPLATES, HTTP_REQUEST, DEPLOYER_TYPE} from "../../utils/constants"; import {SampleTemplate, SampleTemplateFilterValues} from "../../model/sample-template"; import {CODE_LANGUAGE_JAVA, CODE_LANGUAGE_NODEJS, CODE_LANGUAGE_PYTHON, MODELING_STACK_AC, MODELING_STACK_IM} from "."; @@ -10,14 +9,14 @@ export function getSampleTemplatesFromS3(doDebug: boolean): Promise { - if (error || !response.statusCode || response.statusCode !== 200) { + httpClient.request(params, "TEMPLATE_S3_SOURCE_URL", doDebug, (error: any | null, response: any) => { + if (error || (error?.statusCode && error?.statusCode !== 200)) { const msg = doDebug ? "Failed to retrieve the skill sample templates." : "Failed to retrieve the skill sample templates. Please run again with --debug to see the details."; return reject(new Error(msg)); } - resolve(R.view(R.lensPath(["templates"]), JSON.parse(response?.body))); + resolve(response?.body?.templates); }); }); } diff --git a/lib/commands/option-model.json b/lib/commands/option-model.json index a03a9ebf..82e6384e 100644 --- a/lib/commands/option-model.json +++ b/lib/commands/option-model.json @@ -46,10 +46,12 @@ "description": "run skill in the specified simulation mode (currently supports DEFAULT / NFI_ISOLATED_SIMULATION)", "alias": null, "stringInput": "REQUIRED", - "rule": [{ - "type": "ENUM", - "values": ["DEFAULT", "NFI_ISOLATED_SIMULATION"] - }] + "rule": [ + { + "type": "ENUM", + "values": ["DEFAULT", "NFI_ISOLATED_SIMULATION"] + } + ] }, "skill-id": { "name": "skill-id", @@ -59,7 +61,7 @@ "rule": [ { "type": "REGEX", - "regex": "^amzn\\d\\.ask\\.skill\\.\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12}$" + "regex": "^amzn\\d((\\.ask\\.skill)|(\\.echo-sdk-ams\\.app))\\.\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12}$" } ] }, diff --git a/lib/commands/run/helper.js b/lib/commands/run/helper.js deleted file mode 100644 index 7e6412f5..00000000 --- a/lib/commands/run/helper.js +++ /dev/null @@ -1,86 +0,0 @@ -const fs = require("fs"); -const ResourcesConfig = require("../../model/resources-config"); -const CONSTANTS = require("../../utils/constants"); -const stringUtils = require("../../utils/string-utils"); -const CliError = require("../../exceptions/cli-error"); -const NodejsRunFlow = require("./run-flow/nodejs-run"); -const PythonRunFlow = require("./run-flow/python-run"); -const JavaRunFlow = require("./run-flow/java-run"); - -const RUN_FLOWS = [JavaRunFlow, NodejsRunFlow, PythonRunFlow]; - -module.exports = { - getHostedSkillInvocationInfo, - getNonHostedSkillInvocationInfo, - getSkillCodeFolderName, - getNormalisedRuntime, - selectRunFlowClass, - getSkillFlowInstance, -}; - -function getHostedSkillInvocationInfo(runtime) { - return CONSTANTS.HOSTED_SKILL.RUN.INVOCATION_INFO[runtime]; -} - -function getNonHostedSkillInvocationInfo(runtime, handler, skillCodeFolderName) { - if (!stringUtils.isNonBlankString(runtime)) { - throw new CliError("Missing runtime info in " + `resource file ${CONSTANTS.FILE_PATH.ASK_RESOURCES_JSON_CONFIG}.`); - } - if (!stringUtils.isNonBlankString(handler)) { - throw new CliError("Missing handler info " + `in resource file ${CONSTANTS.FILE_PATH.ASK_RESOURCES_JSON_CONFIG}.`); - } - if (runtime === CONSTANTS.RUNTIME.JAVA) { - return {handlerName: handler, skillCodeFolderName}; - } - const handlerInfo = handler.split("."); - const handlerName = handlerInfo.pop(); - const skillFileName = handlerInfo.pop(); - return {handlerName, skillFileName, skillCodeFolderName}; -} - -function getSkillCodeFolderName(profile, skillCodeRegion) { - const userRegionSkillCodeFolderName = ResourcesConfig.getInstance().getCodeSrcByRegion(profile, skillCodeRegion); - const skillCodeFolderName = - !stringUtils.isNonBlankString(userRegionSkillCodeFolderName) && userRegionSkillCodeFolderName !== CONSTANTS.ALEXA.REGION.DEFAULT - ? ResourcesConfig.getInstance().getCodeSrcByRegion(profile, CONSTANTS.ALEXA.REGION.DEFAULT) - : userRegionSkillCodeFolderName; - if (!stringUtils.isNonBlankString(skillCodeFolderName)) { - throw new CliError( - `Invalid code setting in region ${skillCodeRegion}. "src" must be set if you want to run ` + "the skill code with skill package.", - ); - } - if (!fs.existsSync(skillCodeFolderName)) { - throw new CliError(`Invalid code setting in region ${skillCodeRegion}.` + ` File doesn't exist for code src: ${skillCodeFolderName}.`); - } - return skillCodeFolderName; -} - -function getNormalisedRuntime(runtime) { - if (runtime.includes(CONSTANTS.RUNTIME.NODE)) { - return CONSTANTS.RUNTIME.NODE; - } - if (runtime.includes(CONSTANTS.RUNTIME.PYTHON)) { - return CONSTANTS.RUNTIME.PYTHON; - } - if (runtime.includes(CONSTANTS.RUNTIME.JAVA)) { - return CONSTANTS.RUNTIME.JAVA; - } - throw new CliError(`Runtime - ${runtime} is not supported.`); -} - -function selectRunFlowClass(runtime) { - return RUN_FLOWS.find((flow) => flow.canHandle(runtime)); -} - -function getSkillFlowInstance(runtime, skillInvocationInfo, waitForAttach, debugPort, token, skillId, runRegion, watch) { - const RunFlow = this.selectRunFlowClass(runtime); - return new RunFlow({ - skillInvocationInfo, - waitForAttach, - debugPort, - token, - skillId, - runRegion, - watch, - }); -} diff --git a/lib/commands/run/helper.ts b/lib/commands/run/helper.ts new file mode 100644 index 00000000..d963a432 --- /dev/null +++ b/lib/commands/run/helper.ts @@ -0,0 +1,87 @@ +import {existsSync} from "fs"; +import {getInstance} from "../../model/resources-config"; +import {HOSTED_SKILL, FILE_PATH, RUNTIME, ALEXA} from "../../utils/constants"; +import {isNonBlankString} from "../../utils/string-utils"; +import CliError from "../../exceptions/cli-error"; +import {NodejsRunFlow} from "./run-flow/nodejs-run"; +import {PythonRunFlow} from "./run-flow/python-run"; +import {JavaRunFlow} from "./run-flow/java-run"; + +const RUN_FLOWS = [JavaRunFlow, NodejsRunFlow, PythonRunFlow]; + +export function getHostedSkillInvocationInfo(runtime: string) { + const invocationInfo: any = HOSTED_SKILL.RUN.INVOCATION_INFO; + return invocationInfo[runtime]; +} + +export function getNonHostedSkillInvocationInfo(runtime: string, handler: string, skillCodeFolderName: string): object { + if (!isNonBlankString(runtime)) { + throw new CliError(`Missing runtime info in resource file ${FILE_PATH.ASK_RESOURCES_JSON_CONFIG}.`); + } + if (!isNonBlankString(handler)) { + throw new CliError(`Missing handler info in resource file ${FILE_PATH.ASK_RESOURCES_JSON_CONFIG}.`); + } + if (runtime === RUNTIME.JAVA) { + return {handlerName: handler, skillCodeFolderName}; + } + const handlerInfo = handler.split("."); + const handlerName = handlerInfo.pop(); + const skillFileName = handlerInfo.pop(); + return {handlerName, skillFileName, skillCodeFolderName}; +} + +export function getSkillCodeFolderName(profile: string, skillCodeRegion: string) { + const userRegionSkillCodeFolderName = getInstance().getCodeSrcByRegion(profile, skillCodeRegion); + const skillCodeFolderName = + !isNonBlankString(userRegionSkillCodeFolderName) && userRegionSkillCodeFolderName !== ALEXA.REGION.DEFAULT + ? getInstance().getCodeSrcByRegion(profile, ALEXA.REGION.DEFAULT) + : userRegionSkillCodeFolderName; + if (!isNonBlankString(skillCodeFolderName)) { + throw new CliError( + `Invalid code setting in region ${skillCodeRegion}. "src" must be set if you want to run the skill code with skill package.`, + ); + } + if (!existsSync(skillCodeFolderName)) { + throw new CliError(`Invalid code setting in region ${skillCodeRegion}. File doesn't exist for code src: ${skillCodeFolderName}.`); + } + return skillCodeFolderName; +} + +export function getNormalisedRuntime(runtime: string) { + if (runtime.includes(RUNTIME.NODE)) { + return RUNTIME.NODE; + } + if (runtime.includes(RUNTIME.PYTHON)) { + return RUNTIME.PYTHON; + } + if (runtime.includes(RUNTIME.JAVA)) { + return RUNTIME.JAVA; + } + throw new CliError(`Runtime - ${runtime} is not supported.`); +} + +export function selectRunFlowClass(runtime: string): any { + return RUN_FLOWS.find((flow) => flow.canHandle(runtime)); +} + +export function getSkillFlowInstance( + runtime: string, + skillInvocationInfo: any, + waitForAttach: boolean, + debugPort: string, + token: string, + skillId: string, + runRegion: string, + watch: boolean, +) { + const RunFlow = selectRunFlowClass(runtime); + return new RunFlow({ + skillInvocationInfo, + waitForAttach, + debugPort, + token, + skillId, + runRegion, + watch, + }); +} diff --git a/lib/commands/run/index.ts b/lib/commands/run/index.ts index dbaccfe0..8974421c 100644 --- a/lib/commands/run/index.ts +++ b/lib/commands/run/index.ts @@ -10,7 +10,7 @@ import jsonView from "../../view/json-view"; import stringUtils from "../../utils/string-utils"; import Messenger from "../../view/messenger"; import CliError from "../../exceptions/cli-error"; -import helper from "./helper"; +import * as helper from "./helper"; import {OptionModel} from "../option-validator"; export default class RunCommand extends AbstractCommand { @@ -45,7 +45,7 @@ export default class RunCommand extends AbstractCommand { new ResourcesConfig(path.join(process.cwd(), CONSTANTS.FILE_PATH.ASK_RESOURCES_JSON_CONFIG)); skillId = ResourcesConfig.getInstance().getSkillId(profile); if (!stringUtils.isNonBlankString(skillId)) { - throw new CliError(`Failed to obtain skill-id for the given profile - ${profile}` + ". Please deploy you skill project first."); + throw new CliError(`Failed to obtain skill-id for the given profile - ${profile}` + ". Please deploy your skill project first."); } } catch (error) { Messenger.getInstance().error(error); @@ -72,7 +72,7 @@ export default class RunCommand extends AbstractCommand { if (cmd.waitForAttach) { Messenger.getInstance().info(`\n*****Debugging session will wait until inspector is attached at port - ${debugPort}*****\n`); } - runFlowInstance.execCommand(); + await runFlowInstance.execCommand(); } catch (tokenErr) { Messenger.getInstance().error(tokenErr); throw tokenErr; diff --git a/lib/commands/run/run-flow/abstract-run-flow.js b/lib/commands/run/run-flow/abstract-run-flow.js index e351611b..f2bebef6 100644 --- a/lib/commands/run/run-flow/abstract-run-flow.js +++ b/lib/commands/run/run-flow/abstract-run-flow.js @@ -1,17 +1,21 @@ -const nodemon = require("nodemon"); +import nodemon from "nodemon"; +import Messenger from "../../../view/messenger"; -class AbstractRunFlow { +export class AbstractRunFlow { constructor(execConfig) { this.execConfig = execConfig; } execCommand() { - nodemon(this.execConfig); + return new Promise(() => { + nodemon({verbose: true, ...this.execConfig}) + .on('error', (error) => { + reject(`Debugging session returned error code: ${(error) ? error.code : "undefined"}`); + }); + }); } getExecConfig() { return this.execConfig; } } - -module.exports = AbstractRunFlow; diff --git a/lib/commands/run/run-flow/java-run.js b/lib/commands/run/run-flow/java-run.js index 0da83d4f..7c6b63af 100644 --- a/lib/commands/run/run-flow/java-run.js +++ b/lib/commands/run/run-flow/java-run.js @@ -1,12 +1,12 @@ -const CONSTANTS = require("../../../utils/constants"); -const AbstractRunFlow = require("./abstract-run-flow"); +import { RUNTIME } from "../../../utils/constants"; +import { AbstractRunFlow } from "./abstract-run-flow"; -class JavaRunFlow extends AbstractRunFlow { +export class JavaRunFlow extends AbstractRunFlow { static canHandle(runtime) { - return runtime === CONSTANTS.RUNTIME.JAVA; + return runtime === RUNTIME.JAVA; } - constructor({skillInvocationInfo, waitForAttach, debugPort, token, skillId, runRegion, watch}) { + constructor({ skillInvocationInfo, waitForAttach, debugPort, token, skillId, runRegion, watch }) { let execCmd = `cd ${skillInvocationInfo.skillCodeFolderName}; mvn exec:exec -Dexec.executable=java -Dexec.args=` + '"-classpath %classpath com.amazon.ask.localdebug.LocalDebuggerInvoker ' + @@ -25,5 +25,3 @@ class JavaRunFlow extends AbstractRunFlow { }); } } - -module.exports = JavaRunFlow; diff --git a/lib/commands/run/run-flow/nodejs-run.js b/lib/commands/run/run-flow/nodejs-run.js index 3f310c2c..095a28fc 100644 --- a/lib/commands/run/run-flow/nodejs-run.js +++ b/lib/commands/run/run-flow/nodejs-run.js @@ -1,27 +1,27 @@ -const path = require("path"); -const fs = require("fs"); -const CONSTANTS = require("../../../utils/constants"); -const CliError = require("../../../exceptions/cli-error"); -const AbstractRunFlow = require("./abstract-run-flow"); +import { join } from "path"; +import { existsSync } from "fs"; +import { RUNTIME, RUN } from "../../../utils/constants"; +import CliError from "../../../exceptions/cli-error"; +import { AbstractRunFlow } from "./abstract-run-flow"; -class NodejsRunFlow extends AbstractRunFlow { +export class NodejsRunFlow extends AbstractRunFlow { static canHandle(runtime) { - return runtime === CONSTANTS.RUNTIME.NODE; + return runtime === RUNTIME.NODE; } - constructor({skillInvocationInfo, waitForAttach, debugPort, token, skillId, runRegion, watch}) { - const skillFolderPath = path.join(process.cwd(), skillInvocationInfo.skillCodeFolderName); - const script = path.join(skillFolderPath, CONSTANTS.RUN.NODE.SCRIPT_LOCATION); - if (!fs.existsSync(script)) { + constructor({ skillInvocationInfo, waitForAttach, debugPort, token, skillId, runRegion, watch }) { + const skillFolderPath = join(process.cwd(), skillInvocationInfo.skillCodeFolderName); + const script = join(skillFolderPath, RUN.NODE.SCRIPT_LOCATION); + if (!existsSync(script)) { throw new CliError( "ask-sdk-local-debug cannot be found. Please install ask-sdk-local-debug to your skill code project. " + - "Refer https://www.npmjs.com/package/ask-sdk-local-debug for more info.", + "Refer https://www.npmjs.com/package/ask-sdk-local-debug for more info.", ); } const execMap = waitForAttach ? { - js: `node --inspect-brk=${debugPort}`, - } + js: `node --inspect-brk=${debugPort}`, + } : undefined; super({ execMap, @@ -34,7 +34,7 @@ class NodejsRunFlow extends AbstractRunFlow { "--handlerName", skillInvocationInfo.handlerName, "--skillEntryFile", - path.join(skillFolderPath, `${skillInvocationInfo.skillFileName}.js`), + join(skillFolderPath, `${skillInvocationInfo.skillFileName}.js`), "--region", runRegion, ], @@ -42,5 +42,3 @@ class NodejsRunFlow extends AbstractRunFlow { }); } } - -module.exports = NodejsRunFlow; diff --git a/lib/commands/run/run-flow/python-run.js b/lib/commands/run/run-flow/python-run.js index 7483ec17..09fada10 100644 --- a/lib/commands/run/run-flow/python-run.js +++ b/lib/commands/run/run-flow/python-run.js @@ -1,39 +1,38 @@ -const childprocess = require("child_process"); -const path = require("path"); -const fs = require("fs"); -const CONSTANTS = require("../../../utils/constants"); -const CliError = require("../../../exceptions/cli-error"); -const AbstractRunFlow = require("./abstract-run-flow"); +import { execSync } from "child_process"; +import { join } from "path"; +import { existsSync } from "fs"; +import { RUNTIME, RUN } from "../../../utils/constants"; +import CliError from "../../../exceptions/cli-error"; +import { AbstractRunFlow } from "./abstract-run-flow"; -class PythonRunFlow extends AbstractRunFlow { +export class PythonRunFlow extends AbstractRunFlow { static canHandle(runtime) { - return runtime === CONSTANTS.RUNTIME.PYTHON; + return runtime === RUNTIME.PYTHON; } - constructor({skillInvocationInfo, waitForAttach, debugPort, token, skillId, runRegion, watch}) { - const sitePkgLocationsStr = childprocess - .execSync('python3 -c "import site; import json; print(json.dumps(site.getsitepackages()))"') + constructor({ skillInvocationInfo, waitForAttach, debugPort, token, skillId, runRegion, watch }) { + const sitePkgLocationsStr = execSync('python3 -c "import site; import json; print(json.dumps(site.getsitepackages()))"') .toString(); const sitePkgLocations = JSON.parse(sitePkgLocationsStr); const localDebuggerPath = sitePkgLocations - .map((location) => path.join(location, CONSTANTS.RUN.PYTHON.SCRIPT_LOCATION)) - .find((location) => fs.existsSync(location)); - if (!fs.existsSync(localDebuggerPath)) { + .map((location) => join(location, RUN.PYTHON.SCRIPT_LOCATION)) + .find((location) => existsSync(location)); + if (!existsSync(localDebuggerPath)) { throw new CliError( "ask-sdk-local-debug cannot be found. Please install ask-sdk-local-debug to your skill code project. " + - "Refer https://pypi.org/project/ask-sdk-local-debug, for more info.", + "Refer https://pypi.org/project/ask-sdk-local-debug, for more info.", ); } if (waitForAttach) { - childprocess.execSync("python3 -m pip install debugpy", {stdio: "inherit"}); + execSync("python3 -m pip install debugpy", { stdio: "inherit" }); } const execMap = waitForAttach ? { - py: `python3 -m debugpy --listen ${debugPort} --wait-for-client`, - } + py: `python3 -m debugpy --listen ${debugPort} --wait-for-client`, + } : { - py: "python3", - }; + py: "python3", + }; super({ execMap, script: localDebuggerPath, @@ -45,7 +44,7 @@ class PythonRunFlow extends AbstractRunFlow { "--skillHandler", skillInvocationInfo.handlerName, "--skillFilePath", - path.join(`${skillInvocationInfo.skillCodeFolderName}`, `${skillInvocationInfo.skillFileName}.py`), + join(`${skillInvocationInfo.skillCodeFolderName}`, `${skillInvocationInfo.skillFileName}.py`), "--region", runRegion, ], @@ -54,5 +53,3 @@ class PythonRunFlow extends AbstractRunFlow { }); } } - -module.exports = PythonRunFlow; diff --git a/lib/commands/skill/add-locales/helper.js b/lib/commands/skill/add-locales/helper.js index a1c598d8..f263bf41 100644 --- a/lib/commands/skill/add-locales/helper.js +++ b/lib/commands/skill/add-locales/helper.js @@ -110,13 +110,9 @@ function _getNewLocaleModelUri(selectedLocales, profile, doDebug, callback) { doDebug, (error, templateMapResponse) => { if (error) { - return callback(`Failed to retrieve the template list.\nError: ${error}`); + return callback(`Failed to retrieve the interaction model map template list.\nError: ${JSON.stringify(error.errorMessage || error, null, 2)}`); } - if (templateMapResponse.statusCode !== 200) { - return callback(`Failed to retrieve the template list, please see the details from the error response. -${JSON.stringify(templateMapResponse, null, 2)}`); - } - const templateIndexMap = JSON.parse(templateMapResponse.body); + const templateIndexMap = templateMapResponse.body; // assign for each locale for (const locale of selectedLocales) { if (R.keys(localIModelByLocale).includes(locale)) { @@ -161,12 +157,13 @@ function _retrieveTemplatesByLanguage(templateSet, doDebug, callback) { doDebug, (error, response) => { if (error) { - return loopCallback(`Failed to retrieve the template list.\n${error}`); - } - if (response.statusCode > 300) { - return loopCallback(`Failed to retrieve the template list, please see the details from the error response. -${JSON.stringify(response, null, 2)}`); + if (error.statusCode > 300) { + return loopCallback(`Failed to retrieve the template list, please see the details from the error response.\n${JSON.stringify(error.errorMessage || error, null, 2)}`); + } + + return loopCallback(`Failed to retrieve the template list.\n${error.errorMessage || error}`); } + result.set(templateUrl, response.body); loopCallback(); }, diff --git a/lib/commands/smapi/appended-commands/export-package/index.ts b/lib/commands/smapi/appended-commands/export-package/index.ts index 5725cae2..b44132d9 100644 --- a/lib/commands/smapi/appended-commands/export-package/index.ts +++ b/lib/commands/smapi/appended-commands/export-package/index.ts @@ -2,11 +2,11 @@ import fs from "fs"; import path from "path"; import {AbstractCommand} from "../../../abstract-command"; import CONSTANTS from "../../../../utils/constants"; -import jsonView from "../../../../view/json-view"; +import * as jsonView from "../../../../view/json-view"; import Messenger from "../../../../view/messenger"; import optionModel from "../../../option-model.json"; import profileHelper from "../../../../utils/profile-helper"; -import SmapiClient, {isSmapiError} from "../../../../clients/smapi-client"; +import SmapiClient from "../../../../clients/smapi-client"; import zipUtils from "../../../../utils/zip-utils"; import helper from "./helper.js"; import {OptionModel} from "../../../option-validator"; @@ -34,7 +34,7 @@ export default class ExportPackageCommand extends AbstractCommand { profile = profileHelper.runtimeProfile(cmd.profile); // 0.check if a skill-package file exists if (fs.existsSync(CONSTANTS.FILE_PATH.SKILL_PACKAGE.PACKAGE)) { - throw new Error(`A ${CONSTANTS.FILE_PATH.SKILL_PACKAGE.PACKAGE} fold already exists in the current working directory.`); + throw new Error(`A ${CONSTANTS.FILE_PATH.SKILL_PACKAGE.PACKAGE} folder already exists in the current working directory.`); } } catch (err) { Messenger.getInstance().error(err); @@ -49,14 +49,10 @@ export default class ExportPackageCommand extends AbstractCommand { return new Promise((resolve, reject) => { smapiClient.skillPackage.exportPackage(cmd.skillId, cmd.stage, (exportErr: any, exportResponse: any) => { if (exportErr) { - Messenger.getInstance().error(exportErr); - return reject(exportErr); - } - if (isSmapiError(exportResponse)) { - const error = jsonView.toString(exportResponse.body); - Messenger.getInstance().error(error); - return reject(error); + Messenger.getInstance().error(jsonView.toString(exportErr)); + return reject(new Error(jsonView.toString(exportErr))); } + const exportId = path.basename(exportResponse?.headers?.location); // 2.poll for the skill package export status diff --git a/lib/commands/smapi/appended-commands/upload-catalog/helper.js b/lib/commands/smapi/appended-commands/upload-catalog/helper.js index 201d7a5c..afb538ef 100644 --- a/lib/commands/smapi/appended-commands/upload-catalog/helper.js +++ b/lib/commands/smapi/appended-commands/upload-catalog/helper.js @@ -2,12 +2,16 @@ const fs = require("fs"); const inquirer = require("inquirer"); const prettyBytes = require("pretty-bytes"); +const httpClient = require("../../../../clients/http-client"); +const SpinnerView = require("../../../../view/spinner-view"); +const {ParallelStream} = require("../../../../utils/stream-utility"); const CONSTANTS = require("../../../../utils/constants"); module.exports = { _resolvePartSize, _confirmOrOverwritePartSize, _transformUploadArrayToMap, + _multipartsUploadToPresignedUrls, }; function _resolvePartSize(file) { @@ -76,3 +80,114 @@ function _transformUploadArrayToMap(uploadPartsArray) { }); return result; } + +/** + * Implement the multipart upload to S3. + * Run upload in parallel for each part by using ParallelStream. + * + * @param {object} uploadPartsMap Mapping between partNumber and its eTag + * @param {string} filePath The file to upload + * @param {integer} totalSize Total size of the file + * @param {integer} partSize The size of each partition (the last part can be smaller then this) + * @param {integer} partsNumber The number of partitions of the file + * @param {callback} callback + */ +function _multipartsUploadToPresignedUrls(uploadPartsMap, filePath, totalSize, partSize, partsNumber, callback) { + const progressSpinner = new SpinnerView(); + + // Declarations of the state signals for the unordered stream upload + const partETagsList = []; + let partBuffer = []; + let partBufferTotalLength = 0; + let loadedPartCount = 0; + let loadedSize = 0; + let uploadedPartCount = 0; + let uploadedSize = 0; + const uploadTask = (chunk, enc, done) => { + // 1. Clear the partBuffer and append the rest (by slicing a partSize buffer) to the partBuffer + const aggregatedBuffer = Buffer.concat(partBuffer); + const rest = aggregatedBuffer.slice(partSize); + partBuffer = []; + partBuffer.push(rest); + partBufferTotalLength = rest.length; + + // 2. Upload by S3 presigned URL + // Need to store the part number for current "thread" to avoid wrong mapping for eTag and partNumber + const threadPartNum = ++loadedPartCount; + progressSpinner.update( + ` ${loadedPartCount}/${partsNumber} uploads have been requested. ` + + `Currently ${uploadedPartCount}/${partsNumber} parts and ${prettyBytes(uploadedSize)}/${prettyBytes( + totalSize, + )} have been uploaded...`, + ); + + const url = uploadPartsMap.get(threadPartNum); + if (typeof url !== "string" || !url.trim()) { + process.nextTick(() => { + done("[Error]: The url for the S3 presigned URL upload must not be blank."); + }); + return; + } + + httpClient.putByUrl(url, aggregatedBuffer, "UPLOAD_S3_PRESIGNED_URL", false, (err, response) => { + if (err) { + return done(err); + } + + // 3. Update uploaded parts state. + uploadedPartCount++; + uploadedSize += aggregatedBuffer.byteLength; + partETagsList.push({ + eTag: response.headers.etag, + partNumber: threadPartNum, + }); + + progressSpinner.update( + ` ${loadedPartCount}/${partsNumber} uploads have been requested. ` + + `Currently ${uploadedPartCount}/${partsNumber} parts ` + + `and ${prettyBytes(uploadedSize)}/${prettyBytes(totalSize)} have been uploaded...`, + ); + done(); + }); + }; + + const processStreamBuffer = (chunk) => { + // Process data whenever stream buffer is readable. Accumulate part and total length for the partBuffer + partBuffer.push(chunk); + partBufferTotalLength += chunk.byteLength; + loadedSize += chunk.byteLength; + }; + + const verifyAndFinish = () => { + progressSpinner.terminate(); + if (partETagsList.length !== partsNumber) { + callback( + `[Error]: Multipart upload failed. There are ${partsNumber - partETagsList.length}` + + ` part(s) over ${partsNumber} parts not uploaded. Please try again!`, + ); + return; + } + for (const element of partETagsList) { + const tmpETag = element.eTag; + if (typeof tmpETag !== "string" || !tmpETag.trim()) { + callback(`[Error]: Failed to get the ETag for part number ${element.partNumber}. Please try again!`); + return; + } + } + callback(null, partETagsList); + }; + + const parallelStreamOptions = { + willTransform: () => partBufferTotalLength >= partSize || (loadedPartCount === partsNumber - 1 && loadedSize === totalSize), + concurrency: CONSTANTS.CONFIGURATION.S3.MULTIPART_UPLOAD.CONCURRENCY, + isObjectMode: false, + }; + + // Main stream processing + progressSpinner.start(); + fs.createReadStream(filePath) + .pipe(new ParallelStream(uploadTask, processStreamBuffer, verifyAndFinish, parallelStreamOptions)) + .on("error", (err) => { + callback(err); + }); +} diff --git a/lib/commands/smapi/appended-commands/upload-catalog/index.ts b/lib/commands/smapi/appended-commands/upload-catalog/index.ts index 30293ebf..8cf8c302 100644 --- a/lib/commands/smapi/appended-commands/upload-catalog/index.ts +++ b/lib/commands/smapi/appended-commands/upload-catalog/index.ts @@ -1,7 +1,6 @@ import {AbstractCommand} from "../../../abstract-command"; import Messenger from "../../../../view/messenger"; import SmapiClient, {ISmapiClient} from "../../../../clients/smapi-client"; -import S3Client from "../../../../clients/aws-client/s3-client"; import optionModel from "../../../option-model.json"; import profileHelper from "../../../../utils/profile-helper"; import helper from "./helper"; @@ -73,7 +72,7 @@ async function _multiPartUploadCatalog(catalogId: string, filePath: string, smap } Messenger.getInstance().info(`Upload (upload-id: ${uploadId}) created successfully. Upload starts...`); - S3Client.multipartsUploadToPresignedUrls( + helper._multipartsUploadToPresignedUrls( uploadPartsMap, filePath, totalSize, diff --git a/lib/commands/smapi/smapi-command-handler.js b/lib/commands/smapi/smapi-command-handler.js index 3fdd328a..41adf9f1 100644 --- a/lib/commands/smapi/smapi-command-handler.js +++ b/lib/commands/smapi/smapi-command-handler.js @@ -11,12 +11,14 @@ const DynamicConfig = require("../../utils/dynamic-config"); const jsonView = require("../../view/json-view"); const Messenger = require("../../view/messenger"); const profileHelper = require("../../utils/profile-helper"); +const { SmapiApiClient } = require("../../clients/smapi-client/smapiApiClient"); const unflatten = require("../../utils/unflatten"); const {getParamNames, standardize, canParseAsJson, kebabCase} = require("../../utils/string-utils"); const BeforeSendProcessor = require("./before-send-processor"); const {BODY_PATH_DELIMITER, ARRAY_SPLIT_DELIMITER, CliCustomizationProcessor} = require("./cli-customization-processor"); + const _mapToArgs = (params, paramsObject) => { const res = []; params.forEach((param) => { @@ -101,8 +103,7 @@ const _matchSwaggerPattern = (url, swaggerPatternUrl) => { }; const _showCheckStatusHint = (locationHeader, profile) => { - const {value} = locationHeader; - const [baseUrl, queryStringPart] = value.split("?"); + const [baseUrl, queryStringPart] = locationHeader.split("?"); const modelIntrospector = new ModelIntrospector(); const paths = Object.keys(modelIntrospector.modelJson.paths); let swaggerMatch; @@ -134,7 +135,7 @@ const _showCheckStatusHint = (locationHeader, profile) => { `This is an asynchronous operation. Check the progress using the following command: ${statusCheckHintCommand}`, ); } else { - Messenger.getInstance().warn(`This is an asynchronous operation. Check the progress using the following url: ${value}`); + Messenger.getInstance().warn(`This is an asynchronous operation. Check the progress using the following url: ${locationHeader}`); } }; @@ -145,10 +146,10 @@ const _showCheckStatusHint = (locationHeader, profile) => { const parseSmapiResponse = (response, profile) => { let result = ""; const {body, headers, statusCode} = response; - const contentType = headers.find((h) => h.key === "content-type"); - const locationHeader = headers.find((h) => h.key === "location"); + const contentType = headers["content-type"]; + const locationHeader = headers["location"]; // json if no content type or content type is application/json - const isJson = !contentType || contentType.value.includes("application/json"); + const isJson = !contentType || contentType.includes("application/json"); if (statusCode === CONSTANTS.HTTP_REQUEST.STATUS_CODE.ACCEPTED && locationHeader) { _showCheckStatusHint(locationHeader, profile); } @@ -170,7 +171,7 @@ const parseSmapiResponse = (response, profile) => { * @param {Boolean} doDebug * @param {Object} cmdObj Commander object with passed values. */ -const smapiCommandHandler = (swaggerApiOperationName, flatParamsMap, commanderToApiCustomizationMap, inputCmdObj, modelIntrospector) => { +const smapiCommandHandler = async (swaggerApiOperationName, flatParamsMap, commanderToApiCustomizationMap, inputCmdObj, modelIntrospector) => { new AppConfig(); const inputOpts = inputCmdObj.opts(); const authorizationController = new AuthorizationController({ @@ -185,11 +186,18 @@ const smapiCommandHandler = (swaggerApiOperationName, flatParamsMap, commanderTo }; const authEndpoint = DynamicConfig.lwaTokenHost; const smapiEndpoint = DynamicConfig.smapiBaseUrl; + const smapiApiClient = new SmapiApiClient(inputOpts.debug, profile); + const accessTokenConfig = { + clientId: authorizationController.oauthClient.config.clientId, + clientSecret: authorizationController.oauthClient.config.clientConfirmation, + accessToken: await getAuthToken(authorizationController, profile), + } const client = new CustomSmapiClientBuilder() - .withAuthEndpoint(authEndpoint) - .withApiEndpoint(smapiEndpoint) + .withAccessTokenConfig(accessTokenConfig) .withRefreshTokenConfig(refreshTokenConfig) + .withApiEndpoint(smapiEndpoint) + .withApiClient(smapiApiClient) .withCustomUserAgent(DynamicConfig.userAgent) .client(); @@ -227,4 +235,12 @@ const smapiCommandHandler = (swaggerApiOperationName, flatParamsMap, commanderTo }); }; +const getAuthToken = async (authorizationController, profile) => { + return new Promise((resolve, reject) => { + authorizationController.tokenRefreshAndRead(profile, (tokenErr, authToken) => { + (tokenErr)? reject(tokenErr) : resolve(authToken); + }); + }); +}; + module.exports = {smapiCommandHandler, parseSmapiResponse}; diff --git a/lib/commands/smapi/smapi-commander.ts b/lib/commands/smapi/smapi-commander.ts index 7d46eed1..6f378c38 100644 --- a/lib/commands/smapi/smapi-commander.ts +++ b/lib/commands/smapi/smapi-commander.ts @@ -190,7 +190,7 @@ export const makeSmapiCommander = () => { ); program.on("command:*", () => { - console.error(`Command not recognized. Please run "${program.name}" to check the user instructions.`); + console.error(`Command not recognized. Please run "ask smapi" to check the user instructions.`); process.exit(1); }); diff --git a/lib/controllers/authorization-controller/index.js b/lib/controllers/authorization-controller/index.js index 1f4aad65..b2518aed 100644 --- a/lib/controllers/authorization-controller/index.js +++ b/lib/controllers/authorization-controller/index.js @@ -11,6 +11,7 @@ const Messenger = require("../../view/messenger"); const SpinnerView = require("../../view/spinner-view"); const messages = require("./messages"); +const ui = require("./ui"); module.exports = class AuthorizationController { /** @@ -147,16 +148,38 @@ module.exports = class AuthorizationController { listenSpinner.terminate(); const requestUrl = request.url; const requestQuery = url.parse(requestUrl, true).query; - server.destroy(); + + // Response from the browser with authentication code if (requestUrl.startsWith("/cb?code")) { response.end(messages.ASK_SIGN_IN_SUCCESS_MESSAGE); - callback(null, requestQuery.code); + ui.confirmAllowSignIn((error, confirmSignInChoice) => { + // Closing the socket port with server.destroy() only after confirmation question. + // See https://github.com/alexa/ask-cli/issues/476 + server.destroy(); + + if (error) { + return callback(error); + } + + if (!confirmSignInChoice) { + return callback(messages.STOP_UNCONFIRMED_BROWSER_SIGNIN); + } + + callback(null, requestQuery.code); + }); + return; } + if (requestUrl.startsWith("/cb?error")) { - response.statusCode = 403; - const errorMessage = `Error: ${requestQuery.error}\nReason: ${requestQuery.error_description}`; + const errorMessage = `Error: ${requestQuery.error}\nReason: ${requestQuery.error_description}`.split("\n").join(". "); response.end(messages.ASK_SIGN_IN_FAILURE_MESSAGE(errorMessage)); - callback(errorMessage); + ui.informReceivedError((error, _) => { + // Closing the socket port with server.destroy() only after informing of error. + // See https://github.com/alexa/ask-cli/issues/476 + server.destroy(); + response.statusCode = 403; + callback(errorMessage); + }, errorMessage); } } } diff --git a/lib/controllers/authorization-controller/messages.js b/lib/controllers/authorization-controller/messages.js index a9ce9185..c3380a23 100644 --- a/lib/controllers/authorization-controller/messages.js +++ b/lib/controllers/authorization-controller/messages.js @@ -56,3 +56,5 @@ module.exports.ASK_SIGN_IN_FAILURE_MESSAGE = (error) => ` `; module.exports.ASK_ENV_VARIABLES_ERROR_MESSAGE = "Could not find either of the environment variables: ASK_ACCESS_TOKEN, ASK_REFRESH_TOKEN"; + +module.exports.STOP_UNCONFIRMED_BROWSER_SIGNIN = "Stopping configuration due to unconfirmed browser sign in."; diff --git a/lib/controllers/authorization-controller/questions.js b/lib/controllers/authorization-controller/questions.js new file mode 100644 index 00000000..70f14e3a --- /dev/null +++ b/lib/controllers/authorization-controller/questions.js @@ -0,0 +1,17 @@ +module.exports = { + CONFIRM_ALLOW_BROWSER_SIGN_IN: [ + { + message: "Do you confirm that you used the browser to sign in to Alexa Skills Kit Tools?", + type: "confirm", + name: "choice", + default: true, + }, + ], + INFORM_ERROR: { + // message is filled out in code + type: "list", + choices: ["Ok"], + name: "choice", + default: "Ok", + }, +}; diff --git a/lib/controllers/authorization-controller/ui.js b/lib/controllers/authorization-controller/ui.js new file mode 100644 index 00000000..4edeb39f --- /dev/null +++ b/lib/controllers/authorization-controller/ui.js @@ -0,0 +1,28 @@ +const inquirer = require("inquirer"); +const questions = require("./questions"); + +module.exports = { + confirmAllowSignIn, + informReceivedError +}; +export function confirmAllowSignIn(callback) { + inquirer + .prompt(questions.CONFIRM_ALLOW_BROWSER_SIGN_IN) + .then((answer) => { + callback(null, answer.choice); + }) + .catch((error) => { + callback(error); + }); +} + +export function informReceivedError(callback, error) { + inquirer + .prompt([{...questions.INFORM_ERROR, message: `Sign in error: ${error}.`}]) + .then((answer) => { + callback(null, answer.choice); + }) + .catch((error) => { + callback(error); + }); +} \ No newline at end of file diff --git a/lib/controllers/hosted-skill-controller/helper.js b/lib/controllers/hosted-skill-controller/helper.js index 49d0c747..bec595db 100644 --- a/lib/controllers/hosted-skill-controller/helper.js +++ b/lib/controllers/hosted-skill-controller/helper.js @@ -67,15 +67,18 @@ function pollingSkillStatus(smapiClient, skillId, callback) { response, ); } + + const empty = (data) => !data || R.isEmpty(data); + return ( - !statusTracker.manifest || - !statusTracker.interactionModel || - !statusTracker.hostedSkillProvisioning || - !( - statusTracker.manifest === CONSTANTS.HOSTED_SKILL.MANIFEST_STATUS.SUCCESS && - statusTracker.interactionModel === CONSTANTS.HOSTED_SKILL.INTERACTION_MODEL_STATUS.SUCCESS && - statusTracker.hostedSkillProvisioning === CONSTANTS.HOSTED_SKILL.PROVISIONING_STATUS.SUCCESS - ) + // retry if one of manifest, interaction model, provisioning don't exist + empty(statusTracker.manifest) || + empty(statusTracker.interactionModel) || + empty(statusTracker.hostedSkillProvisioning) || + // retry if one of manifest, interaction model, provisioning are in progress + statusTracker.manifest === CONSTANTS.HOSTED_SKILL.MANIFEST_STATUS.IN_PROGRESS || + statusTracker.interactionModel === CONSTANTS.HOSTED_SKILL.INTERACTION_MODEL_STATUS.IN_PROGRESS || + statusTracker.hostedSkillProvisioning === CONSTANTS.HOSTED_SKILL.PROVISIONING_STATUS.IN_PROGRESS ); }; retryUtils.retry(retryConfig, retryCall, shouldRetryCondition, (err) => callback(err, err ? null : statusTracker)); diff --git a/lib/controllers/skill-infrastructure-controller/index.js b/lib/controllers/skill-infrastructure-controller/index.js index 4870eb75..cf7574df 100644 --- a/lib/controllers/skill-infrastructure-controller/index.js +++ b/lib/controllers/skill-infrastructure-controller/index.js @@ -8,6 +8,7 @@ const MultiTasksView = require("../../view/multi-tasks-view"); const Messenger = require("../../view/messenger"); const hashUtils = require("../../utils/hash-utils"); const stringUtils = require("../../utils/string-utils"); +const profileHelper = require("../../utils/profile-helper"); const CONSTANTS = require("../../utils/constants"); const {isAcSkill, syncManifest} = require("../../utils/ac-util"); const acdl = require("@alexa/acdl"); @@ -147,7 +148,7 @@ module.exports = class SkillInfrastructureController { if (error) { // update partial successful deploy results to resources config if (result && !R.isEmpty(R.keys(result))) { - this._updateResourcesConfig(regionsList, result); + this._updateResourcesConfig(regionsList, result, error); } return callback(error); } @@ -295,7 +296,7 @@ module.exports = class SkillInfrastructureController { * * @param {Object} rawDeployResult deploy result from invoke: { $region: deploy-delegate's response } */ - _updateResourcesConfig(regionsList, rawDeployResult) { + _updateResourcesConfig(regionsList, rawDeployResult, error) { const curDeployState = ResourcesConfig.getInstance().getSkillInfraDeployState(this.profile) || {}; const newDeployState = {}; regionsList.forEach((alexaRegion) => { @@ -306,6 +307,9 @@ module.exports = class SkillInfrastructureController { } }); ResourcesConfig.getInstance().setSkillInfraDeployState(this.profile, newDeployState); + if (!error) { + ResourcesConfig.getInstance().setCodeLastDeployTimestamp(this.profile, `${(new Date()).toISOString()}`); + } ResourcesConfig.getInstance().write(); } @@ -314,46 +318,24 @@ module.exports = class SkillInfrastructureController { * @param {Function} callback */ _ensureSkillManifestGotUpdated(callback) { - let skillMetaController; + let vendorId; try { - skillMetaController = new SkillMetadataController({profile: this.profile, doDebug: this.doDebug}); + vendorId = profileHelper.resolveVendorId(this.profile); } catch (err) { return callback(err); } - skillMetaController.updateSkillManifest((err) => { - callback(err); - }); - } - - /** - * Poll skill's manifest status until the status is not IN_PROGRESS. - * - * @param {Object} smapiClient - * @param {String} skillId - * @param {Function} callback - */ - _pollSkillStatus(smapiClient, skillId, callback) { - const retryConfig = { - base: 2000, - factor: 1.12, - maxRetry: 50, - }; - const retryCall = (loopCallback) => { - smapiClient.skill.getSkillStatus(skillId, [CONSTANTS.SKILL.RESOURCES.MANIFEST], (statusErr, statusResponse) => { - if (statusErr) { - return loopCallback(statusErr); - } - if (statusResponse.statusCode >= 300) { - return loopCallback(jsonView.toString(statusResponse.body)); - } - loopCallback(null, statusResponse); + // deploy skill package if the skill manifest has icon file uri, otherwise update the skill manifest + if (Manifest.getInstance().hasIconFileUri()) { + this.skillMetaController.deploySkillPackage(vendorId, this.ignoreHash, (err) => { + callback(err); }); - }; - const shouldRetryCondition = (retryResponse) => - R.view(R.lensPath(["body", "manifest", "lastUpdateRequest", "status"]), retryResponse) === CONSTANTS.SKILL.SKILL_STATUS.IN_PROGRESS; - retryUtils.retry(retryConfig, retryCall, shouldRetryCondition, (err, res) => callback(err, err ? null : res)); + } else { + this.skillMetaController.updateSkillManifest((err) => { + callback(err); + }); + } } /** diff --git a/lib/controllers/skill-metadata-controller/index.js b/lib/controllers/skill-metadata-controller/index.js index 065c0a61..e3d50d4c 100644 --- a/lib/controllers/skill-metadata-controller/index.js +++ b/lib/controllers/skill-metadata-controller/index.js @@ -111,6 +111,11 @@ module.exports = class SkillMetadataController { * Validates domain info */ validateDomain() { + if (process.env.ASK_FORCE_ENABLE) { + Messenger.getInstance().warn("The ASK_FORCE_ENABLE environment variable is set. Skipping domain validation.\n"); + return; + } + const domainInfo = Manifest.getInstance().getApis(); if (!domainInfo || R.isEmpty(domainInfo)) { throw new CLiError('Skill information is not valid. Please make sure "apis" field in the skill.json is not empty.'); @@ -138,27 +143,30 @@ module.exports = class SkillMetadataController { } this.smapiClient.skill.getSkillEnablement(skillId, CONSTANTS.SKILL.STAGE.DEVELOPMENT, (err, response) => { - if (err) { - return callback(err); - } - if (response.statusCode === CONSTANTS.HTTP_REQUEST.STATUS_CODE.NOT_FOUND) { + if (err && err.statusCode === CONSTANTS.HTTP_REQUEST.STATUS_CODE.NOT_FOUND) { + // When the skill is not yet enabled, the SMAPI getSkillEnablement status API returns a 404 not found. + // therefore we need to call SMAPI enableSkill API to enable it. this.smapiClient.skill.enableSkill(skillId, CONSTANTS.SKILL.STAGE.DEVELOPMENT, (enableErr, enableResponse) => { + if (enableErr && enableErr.statusCode >= 300) { + return callback(jsonView.toString(enableErr.body || {})); + } if (enableErr) { return callback(enableErr); } - if (enableResponse.statusCode >= 300) { - return callback(jsonView.toString(enableResponse.body)); - } - Messenger.getInstance().info("Skill is enabled successfully.\n"); - - callback(); + Messenger.getInstance().info("The skill has been enabled.\n"); + return callback(); }); - } else if (response.statusCode >= 300) { - callback(jsonView.toString(response.body)); - } else { - Messenger.getInstance().info("Skill is already enabled, skipping the enable process.\n"); - callback(); + return; } + if (err && err.statusCode >= 300) { + return callback(jsonView.toString(err.body)); + } + if (err) { + return callback(err); + } + + Messenger.getInstance().info("The skill is already enabled, skipping skill enablement.\n"); + return callback(); }); } @@ -185,6 +193,9 @@ module.exports = class SkillMetadataController { const importId = path.basename(importResponse.headers.location); if (importId) { this.getImportStatusPollView().displayImportId(importId); + ResourcesConfig.getInstance().setLastImportId(this.profile, importId); + ResourcesConfig.getInstance().setLastImportTimestamp(this.profile, `${(new Date()).toISOString()}`); + ResourcesConfig.getInstance().write(); } // 3.poll for the skill package import status this._pollImportStatus(importId, (pollErr, pollResponse) => { @@ -281,12 +292,11 @@ module.exports = class SkillMetadataController { * @param {error} callback */ updateSkillManifest(callback) { - const smapiClient = new SmapiClient({profile: this.profile, doDebug: this.doDebug}); const skillId = ResourcesConfig.getInstance().getSkillId(this.profile); const content = Manifest.getInstance().content; const stage = CONSTANTS.SKILL.STAGE.DEVELOPMENT; - smapiClient.skill.manifest.updateManifest(skillId, stage, content, null, (updateErr, updateResponse) => { + this.smapiClient.skill.manifest.updateManifest(skillId, stage, content, null, (updateErr, updateResponse) => { if (updateErr) { return callback(updateErr); } @@ -295,7 +305,7 @@ module.exports = class SkillMetadataController { } // poll manifest status until finish - this._pollSkillManifestStatus(smapiClient, skillId, (pollErr, pollResponse) => { + this._pollSkillManifestStatus(skillId, (pollErr, pollResponse) => { if (pollErr) { return callback(pollErr); } @@ -314,11 +324,10 @@ module.exports = class SkillMetadataController { /** * Poll skill's manifest status until the status is not IN_PROGRESS. * - * @param {Object} smapiClient * @param {String} skillId * @param {Function} callback */ - _pollSkillManifestStatus(smapiClient, skillId, callback) { + _pollSkillManifestStatus(skillId, callback) { const retryConfig = { base: 2000, factor: 1.12, @@ -326,7 +335,7 @@ module.exports = class SkillMetadataController { }; const retryCall = (loopCallback) => { - smapiClient.skill.getSkillStatus(skillId, [CONSTANTS.SKILL.RESOURCES.MANIFEST], (statusErr, statusResponse) => { + this.smapiClient.skill.getSkillStatus(skillId, [CONSTANTS.SKILL.RESOURCES.MANIFEST], (statusErr, statusResponse) => { if (statusErr) { return loopCallback(statusErr); } @@ -462,7 +471,7 @@ module.exports = class SkillMetadataController { if (shouldPrintWarning && importStatusResponse.warnings.length > 0) { importStatusResponse.warnings.forEach((warning) => { - Messenger.getInstance().warn(warning); + Messenger.getInstance().warn(warning.message); }); shouldPrintWarning = false; } diff --git a/lib/model/manifest.js b/lib/model/manifest.js index 8a2f28eb..99e65f6a 100644 --- a/lib/model/manifest.js +++ b/lib/model/manifest.js @@ -128,4 +128,14 @@ module.exports = class Manifest extends ConfigFile { setEventsSubscriptions(subscriptions) { this.setProperty(["manifest", Manifest.endpointTypes.EVENTS, "subscriptions"], subscriptions); } + + /** + * Returns if skill manifest has icon file uri + * @return {Boolean} + */ + hasIconFileUri() { + return Object.values(this.getPublishingLocales()) + .flatMap((locale) => Object.entries(locale)) + .some(([key, value]) => (key === "smallIconUri" || key === "largeIconUri") && value.startsWith("file://")); + } }; diff --git a/lib/model/resources-config/ask-states.js b/lib/model/resources-config/ask-states.js index aa0d99ed..ee49aaa6 100644 --- a/lib/model/resources-config/ask-states.js +++ b/lib/model/resources-config/ask-states.js @@ -52,6 +52,30 @@ module.exports = class AskStates extends ConfigFile { this.setProperty(["profiles", profile, "skillId"], skillId); } + getDeploymentStatus(profile) { + return this.getProperty(["profiles", profile, "deploymentStatus"]); + } + + setDeploymentStatus(profile, status) { + this.setProperty(["profiles", profile, "deploymentStatus"], status); + } + + getLastImportId(profile) { + return this.getProperty(["profiles", profile, "skillMetadata", "lastImportId"]); + } + + setLastImportId(profile, lastImportId) { + this.setProperty(["profiles", profile, "skillMetadata", "lastImportId"], lastImportId); + } + + getLastImportTimestamp(profile) { + return this.getProperty(["profiles", profile, "skillMetadata", "lastImportTimestamp"]); + } + + setLastImportTimestamp(profile, dateTimeStamp) { + this.setProperty(["profiles", profile, "skillMetadata", "lastImportTimestamp"], dateTimeStamp); + } + // Group for the "skillMetadata" getSkillMetaLastDeployHash(profile) { return this.getProperty(["profiles", profile, "skillMetadata", "lastDeployHash"]); @@ -92,6 +116,14 @@ module.exports = class AskStates extends ConfigFile { this.setProperty(["profiles", profile, "code", region, "lastDeployHash"], hash); } + getCodeLastDeployTimestamp(profile) { + return this.getProperty(["profiles", profile, "code", "lastDeployTimestamp"]); + } + + setCodeLastDeployTimestamp(profile, dateTimestamp) { + this.setProperty(["profiles", profile, "code", "lastDeployTimestamp"], dateTimestamp); + } + getCodeBuildByRegion(projRoot, codeSrc) { if (!codeSrc) { return null; diff --git a/lib/model/resources-config/index.js b/lib/model/resources-config/index.js index 9849c630..eaa1a3d4 100644 --- a/lib/model/resources-config/index.js +++ b/lib/model/resources-config/index.js @@ -68,6 +68,30 @@ module.exports = class ResourcesConfig { AskStates.getInstance().setSkillId(profile, skillId); } + getDeploymentStatus(profile) { + return AskStates.getInstance().getDeploymentStatus(profile); + } + + setDeploymentStatus(profile, status) { + AskStates.getInstance().setDeploymentStatus(profile, status); + } + + getLastImportId(profile) { + return AskStates.getInstance().getLastImportId(profile); + } + + setLastImportId(profile, importId) { + AskStates.getInstance().setLastImportId(profile, importId); + } + + getLastImportTimestamp(profile) { + return AskStates.getInstance().getLastImportTimestamp(profile); + } + + setLastImportTimestamp(profile, dateTimestamp) { + AskStates.getInstance().setLastImportTimestamp(profile, dateTimestamp); + } + // Group for the "skillMetadata" getSkillMetaSrc(profile) { return AskResources.getInstance().getSkillMetaSrc(profile); @@ -123,6 +147,14 @@ module.exports = class ResourcesConfig { AskStates.getInstance().setCodeLastDeployHashByRegion(profile, region, hash); } + getCodeLastDeployTimestamp(profile) { + return AskStates.getInstance().getCodeLastDeployTimestamp(profile); + } + + setCodeLastDeployTimestamp(profile, dateTimestamp) { + AskStates.getInstance().setCodeLastDeployTimestamp(profile, dateTimestamp); + } + getCodeRegions(profile) { return AskResources.getInstance().getCodeRegions(profile); } diff --git a/lib/model/sample-template.ts b/lib/model/sample-template.ts index b5b85348..d6fb4f4f 100644 --- a/lib/model/sample-template.ts +++ b/lib/model/sample-template.ts @@ -18,7 +18,7 @@ export type SampleTemplateFilterValues = IM | AC | ALEXA_HOSTED | CLOUDFORMATION * "stack": "ac", * "deploy": "lambda", * "lang": "node", - * "name": "Hello world", + * "name": "hello world", * "url": "https://github.com/alexa/skill-sample-nodejs-hello-world.git", * "desc": "Alexa's hello world skill to send the greetings to the world!" * } diff --git a/lib/utils/constants.js b/lib/utils/constants.js index aaf7d7ed..88096a8f 100644 --- a/lib/utils/constants.js +++ b/lib/utils/constants.js @@ -1,7 +1,7 @@ const path = require("path"); module.exports.APPLICATION_NAME = "ask-cli"; -module.exports.NPM_REGISTRY_URL_BASE = "http://registry.npmjs.org"; +module.exports.NPM_REGISTRY_URL_BASE = "https://registry.npmjs.org"; module.exports.METRICS = { ENDPOINT: "https://client-telemetry.amazonalexa.com", @@ -37,7 +37,7 @@ module.exports.DEPLOY_TARGET = { }; module.exports.HOSTED_SKILL = { - DEFAULT_SKILL_NAME: "Hello World Skill", + DEFAULT_SKILL_NAME: "hosted hello world", DEFAULT_LOCALE: "en-US", LOCALES: [ "de-DE", @@ -63,7 +63,7 @@ module.exports.HOSTED_SKILL = { }, DEFAULT_RUNTIME: { NodeJS: "NODE_16_X", - Python: "PYTHON_3_7", + Python: "PYTHON_3_8", }, SIGNIN_PATH: "/ap/signin", PERMISSION_ENUM: { @@ -113,7 +113,11 @@ module.exports.HOSTED_SKILL = { }, RUN: { INVOCATION_INFO: { - node: {skillCodeFolderName: "lambda", handlerName: "handler", skillFileName: "index"}, + node: { + skillCodeFolderName: "lambda", + handlerName: "handler", + skillFileName: "index", + }, python: { skillCodeFolderName: "lambda", handlerName: "lambda_handler", @@ -203,6 +207,8 @@ module.exports.CONFIGURATION = { MAX_RETRY_INTERVAL: 300000, }, S3: { + DEFAULT_LOCATION: "us-east-1", + MAX_WAIT_TIME: 60, MULTIPART_UPLOAD: { DEFAULT_PART_SIZE: 8 * 1024 * 1024, MAX_PART_COUNT: 1000, @@ -210,9 +216,6 @@ module.exports.CONFIGURATION = { MIN_PART_SIZE_DISPLAY: "5MB", CONCURRENCY: 10, }, - VERSIONING: { - NOT_FOUND_RETRY_DELAY_MS: 1000, - }, }, }; @@ -323,6 +326,9 @@ module.exports.LAMBDA = { MEMORY_SIZE: 512, TIMEOUT: 15, }, + ERROR_MESSAGE: { + ROLE_NOT_ASSUMED: "The role defined for the function cannot be assumed by Lambda.", + }, FUNCTION_STATE: { ACTIVE: "Active", INACTIVE: "Inactive", diff --git a/lib/utils/logger-utility.js b/lib/utils/logger-utility.js index f521475a..0746acd1 100644 --- a/lib/utils/logger-utility.js +++ b/lib/utils/logger-utility.js @@ -27,26 +27,32 @@ module.exports = (function () { for (let item of logBuffer) { // display separators for each item before-hand except the first time if (item !== logBuffer[0]) { + console.warn(); console.warn("----------------------------------------"); } item = JSON.parse(item); - - console.warn("[" + item.time + "] - " + LEVEL_MAPPING[item.level] + " - " + item.activity.toUpperCase()); - if (item["request-id"]) { - console.warn("request-id: " + item["request-id"]); - } - console.warn(item.request.method + " " + item.request.url); - console.warn("status code: " + item.response.statusCode + " " + item.response.statusMessage); + const requestId = (item["request-id"])? item["request-id"] : ""; + const requestMethodUrl = (item.request)? item.request.method + " " + item.request.url : ""; + const statusCode = (item.response)? item.response.statusCode + " " + item.response.statusMessage : ""; + const requestHeaders = (item.request)? JSON.stringify(item.request.headers) : "{}"; + const requestbody = (item.request && item.request.body)? item.request.body : "{}"; + const responseHeaders = (item.response)? JSON.stringify(item.response.headers): "{}"; + const responseBody = (item.body)? JSON.stringify(item.body): "{}"; + console.warn("[%s] - %s - %s", item.time, LEVEL_MAPPING[item.level], item.activity.toUpperCase()); + console.warn("%s", requestMethodUrl); + console.warn("request-id: %s", requestId); + console.warn("status code: %s", statusCode); + console.warn(); + console.warn("Request headers: %s", requestHeaders); + console.warn(); + console.warn("Request body: %s", requestbody); + console.warn(); + console.warn("Response headers: %s", responseHeaders); + console.warn(); + console.warn("Response body: %s", responseBody); if (item.error) { - console.warn("error: " + item.error); - } - console.warn("\nRequest headers: " + JSON.stringify(item.request.headers)); - if (item.request.body) { - console.warn("\nRequest body: " + item.request.body); - } - console.warn("\nResponse headers: " + JSON.stringify(item.response.headers)); - if (item.body) { - console.warn("\nResponse body: " + JSON.stringify(item.body)); + console.warn(); + console.warn("error: %s", JSON.stringify(item.error)); } } console.warn(); diff --git a/lib/utils/zip-utils.js b/lib/utils/zip-utils.js index 0d039087..7b90f60d 100644 --- a/lib/utils/zip-utils.js +++ b/lib/utils/zip-utils.js @@ -71,14 +71,15 @@ function unzipRemoteZipFile(url, targetPath, doDebug, callback) { url, method: CONSTANTS.HTTP_REQUEST.VERB.GET, encoding: null, + responseType : "arraybuffer", }, "get-zip-file", doDebug, - (err, response) => { - if (err) { - return callback(err); + (requestError, requestResponse) => { + if (requestError) { + return callback(requestError.errorMessage || requestError); } - const zip = new AdmZip(response.body); + const zip = new AdmZip(requestResponse.body); try { zip.extractAllTo(targetPath, false); } catch (unzipErr) { diff --git a/lib/view/json-view.js b/lib/view/json-view.js index ee4def1d..31ec163f 100644 --- a/lib/view/json-view.js +++ b/lib/view/json-view.js @@ -11,6 +11,9 @@ module.exports = { */ function toString(jsonObject) { try { + if (typeof jsonObject === 'string') { + return jsonObject; + } // handle issue when Error object serialized to {} if (jsonObject instanceof Error) { jsonObject = {message: jsonObject.message, stack: jsonObject.stack, detail: jsonObject}; diff --git a/lib/view/messenger.js b/lib/view/messenger.js index 51be0a15..0247ca27 100644 --- a/lib/view/messenger.js +++ b/lib/view/messenger.js @@ -1,6 +1,7 @@ const chalk = require("chalk"); const path = require("path"); const fs = require("fs"); +const jsonViewer = require("./json-view"); // A map used to define message levels // and set their display styles @@ -151,14 +152,15 @@ class Messenger { * @param {*} data the message to display */ warn(data) { + const msg = data instanceof Error ? data.message : jsonViewer.toString(data); const operation = "WARN"; this.buffer({ time: Messenger.getTime(), operation, level: MESSAGE_CATEGORY_MAPPING[operation].level, - msg: data, + msg, }); - this.displayMessage(operation, data); + this.displayMessage(operation, msg); } /** @@ -167,8 +169,7 @@ class Messenger { * @param {*} data the message to display */ error(data) { - const msg = data.constructor.name === "Error" ? data.message : data; - + const msg = data instanceof Error ? data.message : jsonViewer.toString(data); const operation = "ERROR"; this.buffer({ time: Messenger.getTime(), @@ -185,8 +186,7 @@ class Messenger { * @param {*} data the message to display */ fatal(data) { - const msg = data.constructor.name === "Error" ? data.stack.substring(7) : data; - + const msg = data instanceof Error ? data.stack.substring(7) : data; const operation = "FATAL"; this.buffer({ time: Messenger.getTime(), diff --git a/package-lock.json b/package-lock.json index 44461cf3..dfdaf4ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,110 @@ { "name": "ask-cli", - "version": "2.29.1", - "lockfileVersion": 1, + "version": "2.30.7", + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@alexa/acdl": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@alexa/acdl/-/acdl-0.3.0.tgz", - "integrity": "sha512-sd4+HMCHEas1swyXctr0JlzyYS7nBy2kPEUsWHqQ5IpizJQeuDIEaIQ0SRYz8tvl3peCuvxNgFuOExhwtdu4zg==", - "requires": { + "packages": { + "": { + "name": "ask-cli", + "version": "2.30.7", + "hasInstallScript": true, + "license": "Apache 2.0", + "dependencies": { + "@alexa/acdl": "^0.3.1", + "@aws-sdk/client-cloudformation": "^3.306.0", + "@aws-sdk/client-iam": "^3.306.0", + "@aws-sdk/client-lambda": "^3.306.0", + "@aws-sdk/client-s3": "^3.306.0", + "@aws-sdk/credential-providers": "^3.306.0", + "@aws-sdk/types": "^3.306.0", + "@smithy/shared-ini-file-loader": "^2.0.4", + "adm-zip": "^0.5.9", + "archiver": "^5.3.0", + "ask-smapi-model": "^1.23.0", + "ask-smapi-sdk": "^1.3.0", + "async": "^2.6.1", + "aws-profile-handler": "2.0.3", + "axios": "^1.4.0", + "bunyan": "^1.8.15", + "chalk": "4.0.0", + "commander": "^4.1.1", + "date-fns": "^2.28.0", + "folder-hash": "^4.0.2", + "fs-extra": "^10.0.1", + "inquirer": "^8.2.2", + "js-yaml": "^4.1.0", + "jsonfile": "^6.1.0", + "lint-staged": "^12.3.7", + "listr": "^0.14.3", + "mustache": "^4.2.0", + "nodemon": "^2.0.15", + "open": "^8.4.0", + "ora": "^3.4.0", + "portscanner": "^2.2.0", + "pretty-bytes": "^5.6.0", + "ramda": "^0.28.0", + "rxjs": "^7.5.5", + "semver": "^7.3.6", + "tmp": "^0.2.1", + "uuid": "^8.3.2", + "valid-url": "^1.0.9" + }, + "bin": { + "ask": "dist/bin/ask.js" + }, + "devDependencies": { + "@commitlint/cli": "^16.2.3", + "@commitlint/config-conventional": "^16.2.1", + "@istanbuljs/nyc-config-typescript": "^1.0.2", + "@stoplight/prism-cli": "4.14.1", + "@types/chai": "^4.3.0", + "@types/chai-as-promised": "^7.1.5", + "@types/chai-json-schema": "^1.4.6", + "@types/chai-uuid": "^1.0.2", + "@types/fs-extra": "^9.0.13", + "@types/inquirer": "^8.2.1", + "@types/jsonfile": "^6.1.0", + "@types/listr": "0.14.4", + "@types/mocha": "^9.1.1", + "@types/portscanner": "^2.1.1", + "@types/proxyquire": "^1.3.28", + "@types/ramda": "^0.28.7", + "@types/semver": "^7.3.9", + "@types/sinon": "^10.0.11", + "@types/sinon-chai": "^3.2.8", + "@types/uuid": "^8.3.4", + "@types/vscode": "^1.34.0", + "@vscode/test-electron": "^1.6.1", + "chai": "^4.3.6", + "chai-as-promised": "^7.1.1", + "chai-json-schema": "^1.5.1", + "chai-uuid": "^1.0.6", + "copyfiles": "^2.4.1", + "husky": "^7.0.4", + "mocha": "^10.2.0", + "mocha-chai-jest-snapshot": "^1.1.3", + "mocha.parallel": "^0.15.6", + "npm-bundle": "3.0.3", + "npm-check-updates": "^16.10.8", + "nyc": "^15.1.0", + "postman-collection": "4.1.3", + "prettier": "^2.6.2", + "proxyquire": "^2.1.3", + "sinon": "^13.0.1", + "sinon-chai": "^3.7.0", + "standard-version": "^9.3.2", + "ts-node": "^10.7.0", + "typescript": "^4.6.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@alexa/acdl": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@alexa/acdl/-/acdl-0.3.1.tgz", + "integrity": "sha512-9oCb11qZO5F1h4sVbeIqj7W2Ds2cYGAS+oc5TufvM4yZz2Sio9r8eo6ZmilG3T9GyhtDsYvJv7WNB0tQGkohdg==", + "dependencies": { "@alexa/ask-expressions-spec": "^0.0.2", "@types/fs-extra": "^9.0.13", "ajv": "^8.6.3", @@ -19,490 +115,2127 @@ "ask-smapi-model": "^1.20.1", "ask-smapi-sdk": "^1.3.0", "aws-sdk": "^2.1010.0", + "axios": "^0.26.1", "fs-extra": "^10.0.0", "immutable": "4.0.0", "resolve": "^1.20.0", + "semver": "^7.3.8", "source-map-support": "^0.5.20", + "uuid": "^8.3.2", "yargs": "^17.1.1" }, + "bin": { + "acc": "dist/cjs/acc.js" + } + }, + "node_modules/@alexa/acdl/node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", "dependencies": { - "ask-smapi-model": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/ask-smapi-model/-/ask-smapi-model-1.23.0.tgz", - "integrity": "sha512-wGpHSvd1qIwqDw5YJPpga0HUFQItoT13LZAm1s4hpCcxY18vwPu5IK6w19syGztWAc2qn4k6fDDhz1UrgPm07A==", - "requires": { - "ask-sdk-model-runtime": "^1.1.0" - } - } + "follow-redirects": "^1.14.8" } }, - "@alexa/ask-expressions-spec": { + "node_modules/@alexa/ask-expressions-spec": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/@alexa/ask-expressions-spec/-/ask-expressions-spec-0.0.2.tgz", "integrity": "sha512-/yk3yp6HCCtAlzujRByxY9JqHt/h1LVQE0KUKM16TlVD318gWHBH50zuSpAse5K+doCDWQYLrgxHc5etE0AKAw==" }, - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" } }, - "@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", - "dev": true + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, + "node_modules/@aws-crypto/crc32c": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", + "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" } }, - "@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", - "dev": true, - "requires": { - "@babel/types": "^7.21.4", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, + "node_modules/@aws-crypto/crc32c/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - } + "tslib": "^1.11.1" } }, - "@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", + "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" } }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true + "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" } }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", - "dev": true, - "requires": { - "@babel/types": "^7.21.4" + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" } }, - "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" } }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" } }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/abort-controller": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.310.0.tgz", + "integrity": "sha512-v1zrRQxDLA1MdPim159Vx/CPHqsB4uybSxRi1CnfHO5ZjHryx3a5htW2gdGAykVCul40+yJXvfpufMrELVxH+g==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true + "node_modules/@aws-sdk/chunked-blob-reader": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.310.0.tgz", + "integrity": "sha512-CrJS3exo4mWaLnWxfCH+w88Ou0IcAZSIkk4QbmxiHl/5Dq705OLoxf4385MVyExpqpeVJYOYQ2WaD8i/pQZ2fg==", + "dependencies": { + "tslib": "^2.5.0" + } }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true + "node_modules/@aws-sdk/client-cloudformation": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.321.1.tgz", + "integrity": "sha512-B81WA9X1gGKtny3d+pS9Pe1faxSWQsMDq0CoBRmrz4/cF8kYVuxVn814PtGEKe11BL9tgFrnDzOR9pB4PYliMg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.321.1", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.321.1", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.319.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.321.1", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.319.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "@aws-sdk/util-waiter": "3.310.0", + "fast-xml-parser": "4.1.2", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } }, - "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "dev": true + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.321.1.tgz", + "integrity": "sha512-6XuGHbGjKmwmBP9fxVtHtgYsSUZEDJZAdBa9jD3+//6OG9Qh4/mxRUZJFImMT8DOrmNLHU2q2W/4HjsbDql6VA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.321.1", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.321.1", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.319.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.321.1", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.319.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "node_modules/@aws-sdk/client-iam": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.321.1.tgz", + "integrity": "sha512-XUoXLyVcMJu8qgRhzegNvZCSDgRGoqMdAAz9+NIzwgrH9k4U+e+Uws36wfRmCHoR4Nv1vBeTiLRnM/XkKpvavg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.321.1", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.321.1", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.319.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.321.1", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.319.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "@aws-sdk/util-waiter": "3.310.0", + "fast-xml-parser": "4.1.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "node_modules/@aws-sdk/client-lambda": { + "version": "3.322.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.322.0.tgz", + "integrity": "sha512-nNyARMIxYDCWQIi/Az+/ZPEyxoECPafM8//GmcYDBBBl5CYcAetKN5vM1e3p9efr2njgP5vBTGU9EBaO45fYRQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.321.1", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.321.1", + "@aws-sdk/eventstream-serde-browser": "3.310.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.310.0", + "@aws-sdk/eventstream-serde-node": "3.310.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.319.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.321.1", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.319.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "@aws-sdk/util-waiter": "3.310.0", + "tslib": "^2.5.0" }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.321.1.tgz", + "integrity": "sha512-SndPRdeofP2j1kPDLoPbJL8DzzjSciFb1S+Tda3UljOy9gQl68OAruwKloXHJE8GRkLJnYowlwLu36H1MvADJg==", "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@aws-crypto/sha1-browser": "3.0.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.321.1", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.321.1", + "@aws-sdk/eventstream-serde-browser": "3.310.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.310.0", + "@aws-sdk/eventstream-serde-node": "3.310.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-blob-browser": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/hash-stream-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/md5-js": "3.310.0", + "@aws-sdk/middleware-bucket-endpoint": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-expect-continue": "3.310.0", + "@aws-sdk/middleware-flexible-checksums": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-location-constraint": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-sdk-s3": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-ssec": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.319.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.321.1", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/signature-v4-multi-region": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.319.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-stream-browser": "3.310.0", + "@aws-sdk/util-stream-node": "3.321.1", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "@aws-sdk/util-waiter": "3.310.0", + "@aws-sdk/xml-builder": "3.310.0", + "fast-xml-parser": "4.1.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", - "dev": true + "node_modules/@aws-sdk/client-sso": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.321.1.tgz", + "integrity": "sha512-ecoT4tBGtRJR5G7oLBTMXZmgZZlff1amhSdKPEtkWxv6kWc8VPb5rRuRgVPsDR9HuesI6ZVlODptvGtnfkIJwA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.319.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.321.1", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.319.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.321.1.tgz", + "integrity": "sha512-PBVfHQbyrsfzbnO6u9d9Sik8JlXGLhHj3zLd87iBkYXBdHwD5NuvwWu7OtjUtrHjP4SfzodVwfjmTbDAFqbtzw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.319.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.321.1", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.319.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@aws-sdk/client-sts": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.321.1.tgz", + "integrity": "sha512-AB+N4a1TVEKl9Sd5O2TxTprEZp7Va6zPZLMraFAYMdmJVBmCmmwyBs7ygju685DpQ1dos5PRsKCRcossyY5pDQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-node": "3.321.1", + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/hash-node": "3.310.0", + "@aws-sdk/invalid-dependency": "3.310.0", + "@aws-sdk/middleware-content-length": "3.310.0", + "@aws-sdk/middleware-endpoint": "3.310.0", + "@aws-sdk/middleware-host-header": "3.310.0", + "@aws-sdk/middleware-logger": "3.310.0", + "@aws-sdk/middleware-recursion-detection": "3.310.0", + "@aws-sdk/middleware-retry": "3.310.0", + "@aws-sdk/middleware-sdk-sts": "3.310.0", + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/middleware-user-agent": "3.319.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/node-http-handler": "3.321.1", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/smithy-client": "3.316.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.316.0", + "@aws-sdk/util-defaults-mode-node": "3.316.0", + "@aws-sdk/util-endpoints": "3.319.0", + "@aws-sdk/util-retry": "3.310.0", + "@aws-sdk/util-user-agent-browser": "3.310.0", + "@aws-sdk/util-user-agent-node": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "fast-xml-parser": "4.1.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "node_modules/@aws-sdk/config-resolver": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.310.0.tgz", + "integrity": "sha512-8vsT+/50lOqfDxka9m/rRt6oxv1WuGZoP8oPMk0Dt+TxXMbAzf4+rejBgiB96wshI1k3gLokYRjSQZn+dDtT8g==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-config-provider": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.321.1.tgz", + "integrity": "sha512-g+3MQcwhpw1WqQ27BJLCCS90aUExH8kT9o2WM2tYjGATfTQ8+tpAqao2JxChtfzQbq6m69M175bZ3o09EaKobQ==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.321.1", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.310.0.tgz", + "integrity": "sha512-vvIPQpI16fj95xwS7M3D48F7QhZJBnnCgB5lR+b7So+vsG9ibm1mZRVGzVpdxCvgyOhHFbvrby9aalNJmmIP1A==", + "dependencies": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "node_modules/@aws-sdk/credential-provider-imds": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.310.0.tgz", + "integrity": "sha512-baxK7Zp6dai5AGW01FIW27xS2KAaPUmKLIXv5SvFYsUgXXvNW55im4uG3b+2gA0F7V+hXvVBH08OEqmwW6we5w==", + "dependencies": { + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.321.1.tgz", + "integrity": "sha512-prndSVQhiikNaI40bYnM2Q8PkC35FCwhbQnBk6KXNvdtfo9RqatMC639F+6oryb3BuMy++Ij4Yoi8WnPBs5Sww==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/credential-provider-process": "3.310.0", + "@aws-sdk/credential-provider-sso": "3.321.1", + "@aws-sdk/credential-provider-web-identity": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.321.1.tgz", + "integrity": "sha512-5B1waOwSvY2JMLGRebo7IUqnTaGoCnby9cRbG/dhi7Ke97M3V8380S9THDJ/bktjL8zHEVfBVZy7HhXHzhSjEg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/credential-provider-ini": "3.321.1", + "@aws-sdk/credential-provider-process": "3.310.0", + "@aws-sdk/credential-provider-sso": "3.321.1", + "@aws-sdk/credential-provider-web-identity": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.310.0.tgz", + "integrity": "sha512-h73sg6GPMUWC+3zMCbA1nZ2O03nNJt7G96JdmnantiXBwHpRKWW8nBTLzx5uhXn6hTuTaoQRP/P+oxQJKYdMmA==", + "dependencies": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.321.1.tgz", + "integrity": "sha512-kg0rc1OacJFgAvmZj0TOu+BSc+yRdnC5dO/RAag3XU6+hlQI5/C080RQp9Qj6V7ga0HtAJMRwJcUlCPA3RJPug==", + "dependencies": { + "@aws-sdk/client-sso": "3.321.1", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/token-providers": "3.321.1", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.310.0.tgz", + "integrity": "sha512-H4SzuZXILNhK6/IR1uVvsUDZvzc051hem7GLyYghBCu8mU+tq28YhKE8MfSroi6eL2e5Vujloij1OM2EQQkPkw==", + "dependencies": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "node_modules/@aws-sdk/credential-providers": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.321.1.tgz", + "integrity": "sha512-z7uPo5B/pW8k2IHT2Nu2SFAWEzBnR/NnjUVOTwf93bxNbc7IxRODiCMggmK2wpjiRSBAc8zKKbZ4dHCcb4MyZg==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.321.1", + "@aws-sdk/client-sso": "3.321.1", + "@aws-sdk/client-sts": "3.321.1", + "@aws-sdk/credential-provider-cognito-identity": "3.321.1", + "@aws-sdk/credential-provider-env": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/credential-provider-ini": "3.321.1", + "@aws-sdk/credential-provider-node": "3.321.1", + "@aws-sdk/credential-provider-process": "3.310.0", + "@aws-sdk/credential-provider-sso": "3.321.1", + "@aws-sdk/credential-provider-web-identity": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "node_modules/@aws-sdk/eventstream-codec": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.310.0.tgz", + "integrity": "sha512-clIeSgWbZbxwtsxZ/yoedNM0/kJFSIjjHPikuDGhxhqc+vP6TN3oYyVMFrYwFaTFhk2+S5wZcWYMw8Op1pWo+A==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "tslib": "^2.5.0" } }, - "@babel/template": { - "version": "7.20.7", + "node_modules/@aws-sdk/eventstream-serde-browser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.310.0.tgz", + "integrity": "sha512-3S6ziuQVALgEyz0TANGtYDVeG8ArK4Y05mcgrs8qUTmsvlDIXX37cR/DvmVbNB76M4IrsZeSAIajL9644CywkA==", + "dependencies": { + "@aws-sdk/eventstream-serde-universal": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-config-resolver": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.310.0.tgz", + "integrity": "sha512-8s1Qdn9STj+sV75nUp9yt0W6fHS4BZ2jTm4Z/1Pcbvh2Gqs0WjH5n2StS+pDW5Y9J/HSGBl0ogmUr5lC5bXFHg==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.310.0.tgz", + "integrity": "sha512-kSnRomCgW43K9TmQYuwN9+AoYPnhyOKroanUMyZEzJk7rpCPMj4OzaUpXfDYOvznFNYn7NLaH6nHLJAr0VPlJA==", + "dependencies": { + "@aws-sdk/eventstream-serde-universal": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-serde-universal": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.310.0.tgz", + "integrity": "sha512-Qyjt5k/waV5cDukpgT824ISZAz5U0pwzLz5ztR409u85AGNkF/9n7MS+LSyBUBSb0WJ5pUeSD47WBk+nLq9Nhw==", + "dependencies": { + "@aws-sdk/eventstream-codec": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.310.0.tgz", + "integrity": "sha512-Bi9vIwzdkw1zMcvi/zGzlWS9KfIEnAq4NNhsnCxbQ4OoIRU9wvU+WGZdBBhxg0ZxZmpp1j1aZhU53lLjA07MHw==", + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/querystring-builder": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/hash-blob-browser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.310.0.tgz", + "integrity": "sha512-OoR8p0cbypToysLT0v3o2oyjy6+DKrY7GNCAzHOHJK9xmqXCt+DsjKoPeiY7o1sWX2aN6Plmvubj/zWxMKEn/A==", + "dependencies": { + "@aws-sdk/chunked-blob-reader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/hash-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.310.0.tgz", + "integrity": "sha512-NvE2fhRc8GRwCXBfDehxVAWCmVwVMILliAKVPAEr4yz2CkYs0tqU51S48x23dtna07H4qHtgpeNqVTthcIQOEQ==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-buffer-from": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/hash-stream-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.310.0.tgz", + "integrity": "sha512-ZoXdybNgvMz1Hl6k/e32xVL3jmG5p2IEk5mTtLfFEuskTJ74Z+VMYKkkF1whyy7KQfH83H+TQGnsGtlRCchQKw==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/invalid-dependency": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.310.0.tgz", + "integrity": "sha512-1s5RG5rSPXoa/aZ/Kqr5U/7lqpx+Ry81GprQ2bxWqJvWQIJ0IRUwo5pk8XFxbKVr/2a+4lZT/c3OGoBOM1yRRA==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/is-array-buffer": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz", + "integrity": "sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/md5-js": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.310.0.tgz", + "integrity": "sha512-x5sRBUrEfLWAS1EhwbbDQ7cXq6uvBxh3qR2XAsnGvFFceTeAadk7cVogWxlk3PC+OCeeym7c3/6Bv2HQ2f1YyQ==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.310.0.tgz", + "integrity": "sha512-uJJfHI7v4AgbJZRLtyI8ap2QRWkBokGc3iyUoQ+dVNT3/CE2ZCu694A6W+H0dRqg79dIE+f9CRNdtLGa/Ehhvg==", + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@aws-sdk/util-config-provider": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-content-length": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.310.0.tgz", + "integrity": "sha512-P8tQZxgDt6CAh1wd/W6WPzjc+uWPJwQkm+F7rAwRlM+k9q17HrhnksGDKcpuuLyIhPQYdmOMIkpKVgXGa4avhQ==", + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.310.0.tgz", + "integrity": "sha512-Z+N2vOL8K354/lstkClxLLsr6hCpVRh+0tCMXrVj66/NtKysCEZ/0b9LmqOwD9pWHNiI2mJqXwY0gxNlKAroUg==", + "dependencies": { + "@aws-sdk/middleware-serde": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/url-parser": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.310.0.tgz", + "integrity": "sha512-l3d1z2gt+gINJDnPSyu84IxfzjzPfCQrqC1sunw2cZGo/sXtEiq698Q3SiTcO2PGP4LBQAy2RHb5wVBJP708CQ==", + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.310.0.tgz", + "integrity": "sha512-5ndnLgzgGVpWkmHBAiYkagHqiSuow8q62J4J6E2PzaQ77+fm8W3nfdy7hK5trHokEyouCZdxT/XK/IRhgj/4PA==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@aws-crypto/crc32c": "3.0.0", + "@aws-sdk/is-array-buffer": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.310.0.tgz", + "integrity": "sha512-QWSA+46/hXorXyWa61ic2K7qZzwHTiwfk2e9mRRjeIRepUgI3qxFjsYqrWtrOGBjmFmq0pYIY8Bb/DCJuQqcoA==", + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.310.0.tgz", + "integrity": "sha512-LFm0JTQWwTPWL/tZU2wsQTl8J5PpDEkXjEhaXVKamtyH0xhysRqd+0n92n65dc8oztAuQkb9xUbErGn5b6gsew==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.310.0.tgz", + "integrity": "sha512-Lurm8XofrASBRnAVtiSNuDSRsRqPNg27RIFLLsLp/pqog9nFJ0vz0kgdb9S5Z+zw83Mm+UlqOe6D8NTUNp4fVg==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.310.0.tgz", + "integrity": "sha512-SuB75/xk/gyue24gkriTwO2jFd7YcUGZDClQYuRejgbXSa3CO0lWyawQtfLcSSEBp9izrEVXuFH24K1eAft5nQ==", + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.310.0.tgz", + "integrity": "sha512-oTPsRy2W4s+dfxbJPW7Km+hHtv/OMsNsVfThAq8DDYKC13qlr1aAyOqGLD+dpBy2aKe7ss517Sy2HcHtHqm7/g==", + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/service-error-classification": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "@aws-sdk/util-retry": "3.310.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.310.0.tgz", + "integrity": "sha512-QK9x9g2ksg0hOjjYgqddeFcn5ctUEGdxJVu4OumPXceulefMcSO2jyH2qTybYSA93nqNQFdFmg5wQfvIRUWFCQ==", + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.310.0.tgz", + "integrity": "sha512-+5PFwlYNLvLLIfw0ASAoWV/iIF8Zv6R6QGtyP0CclhRSvNjgbQDVnV0g95MC5qvh+GB/Yjlkt8qAjLSPjHfsrQ==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-serde": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.310.0.tgz", + "integrity": "sha512-RNeeTVWSLTaentUeCgQKZhAl+C6hxtwD78cQWS10UymWpQFwbaxztzKUu4UQS5xA2j6PxwPRRUjqa4jcFjfLsg==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.310.0.tgz", + "integrity": "sha512-f9mKq+XMdW207Af3hKjdTnpNhdtwqWuvFs/ZyXoOkp/g1MY1O6L23Jy6i52m29LxbT4AuNRG1oKODfXM0vYVjQ==", + "dependencies": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/signature-v4": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.310.0.tgz", + "integrity": "sha512-CnEwNKVpd5bXnrCKPaePF8mWTA9ET21OMBb54y9b0fd8K02zoOcdBz4DWfh1SjFD4HkgCdja4egd8l2ivyvqmw==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-stack": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.310.0.tgz", + "integrity": "sha512-010O1PD+UAcZVKRvqEusE1KJqN96wwrf6QsqbRM0ywsKQ21NDweaHvEDlds2VHpgmofxkRLRu/IDrlPkKRQrRg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.319.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.319.0.tgz", + "integrity": "sha512-ytaLx2dlR5AdMSne6FuDCISVg8hjyKj+cHU20b2CRA/E/z+XXrLrssp4JrCgizRKPPUep0psMIa22Zd6osTT5Q==", + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-endpoints": "3.319.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-config-provider": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.310.0.tgz", + "integrity": "sha512-T/Pp6htc6hq/Cq+MLNDSyiwWCMVF6GqbBbXKVlO5L8rdHx4sq9xPdoPveZhGWrxvkanjA6eCwUp6E0riBOSVng==", + "dependencies": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-http-handler": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.321.1.tgz", + "integrity": "sha512-DdQBrtFFDNtzphJIN3s93Vf+qd9LHSzH6WTQRrWoXhTDMHDzSI2Cn+c5KWfk89Nggp/n3+OTwUPQeCiBT5EBuw==", + "dependencies": { + "@aws-sdk/abort-controller": "3.310.0", + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/querystring-builder": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/property-provider": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.310.0.tgz", + "integrity": "sha512-3lxDb0akV6BBzmFe4nLPaoliQbAifyWJhuvuDOu7e8NzouvpQXs0275w9LePhhcgjKAEVXUIse05ZW2DLbxo/g==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.310.0.tgz", + "integrity": "sha512-fgZ1aw/irQtnrsR58pS8ThKOWo57Py3xX6giRvwSgZDEcxHfVzuQjy9yPuV++v04fdmdtgpbGf8WfvAAJ11yXQ==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-builder": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.310.0.tgz", + "integrity": "sha512-ZHH8GV/80+pWGo7DzsvwvXR5xVxUHXUvPJPFAkhr6nCf78igdoF8gR10ScFoEKbtEapoNTaZlKHPXxpD8aPG7A==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-uri-escape": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-parser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.310.0.tgz", + "integrity": "sha512-YkIznoP6lsiIUHinx++/lbb3tlMURGGqMpo0Pnn32zYzGrJXA6eC3D0as2EcMjo55onTfuLcIiX4qzXes2MYOA==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/service-error-classification": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.310.0.tgz", + "integrity": "sha512-PuyC7k3qfIKeH2LCnDwbttMOKq3qAx4buvg0yfnJtQOz6t1AR8gsnAq0CjKXXyfkXwNKWTqCpE6lVNUIkXgsMw==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.310.0.tgz", + "integrity": "sha512-N0q9pG0xSjQwc690YQND5bofm+4nfUviQ/Ppgan2kU6aU0WUq8KwgHJBto/YEEI+VlrME30jZJnxtOvcZJc2XA==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.310.0.tgz", + "integrity": "sha512-1M60P1ZBNAjCFv9sYW29OF6okktaeibWyW3lMXqzoHF70lHBZh+838iUchznXUA5FLabfn4jBFWMRxlAXJUY2Q==", + "dependencies": { + "@aws-sdk/is-array-buffer": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "@aws-sdk/util-middleware": "3.310.0", + "@aws-sdk/util-uri-escape": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.310.0.tgz", + "integrity": "sha512-q8W+RIomTS/q85Ntgks/CoDElwqkC9+4OCicee5YznNHjQ4gtNWhUkYIyIRWRmXa/qx/AUreW9DM8FAecCOdng==", + "dependencies": { + "@aws-sdk/protocol-http": "3.310.0", + "@aws-sdk/signature-v4": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/signature-v4-crt": "^3.118.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/signature-v4-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/smithy-client": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.316.0.tgz", + "integrity": "sha512-6YXOKbRnXeS8r8RWzuL6JMBolDYM5Wa4fD/VY6x/wK78i2xErHOvqzHgyyeLI1MMw4uqyd4wRNJNWC9TMPduXw==", + "dependencies": { + "@aws-sdk/middleware-stack": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.321.1.tgz", + "integrity": "sha512-I1sXS4qXirSvgvrOIPf+e1D7GvC83DdeyMxHZvuhHgeMCqDAzToS8OLxOX0enN9xZRHWAQYja8xyeGbDL2I0Zw==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.321.1", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/shared-ini-file-loader": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.310.0.tgz", + "integrity": "sha512-j8eamQJ7YcIhw7fneUfs8LYl3t01k4uHi4ZDmNRgtbmbmTTG3FZc2MotStZnp3nZB6vLiPF1o5aoJxWVvkzS6A==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/url-parser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.310.0.tgz", + "integrity": "sha512-mCLnCaSB9rQvAgx33u0DujLvr4d5yEm/W5r789GblwwQnlNXedVu50QRizMLTpltYWyAUoXjJgQnJHmJMaKXhw==", + "dependencies": { + "@aws-sdk/querystring-parser": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz", + "integrity": "sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-base64": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.310.0.tgz", + "integrity": "sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==", + "dependencies": { + "@aws-sdk/util-buffer-from": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-body-length-browser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.310.0.tgz", + "integrity": "sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-body-length-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.310.0.tgz", + "integrity": "sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-buffer-from": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz", + "integrity": "sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==", + "dependencies": { + "@aws-sdk/is-array-buffer": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-config-provider": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.310.0.tgz", + "integrity": "sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-browser": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.316.0.tgz", + "integrity": "sha512-6FSqLhYmaihtH2n1s4b2rlLW0ABU8N6VZIfzLfe2ING4PF0MzfaMMhnTFUHVXfKCVGoR8yP6iyFTRCyHGVEL1w==", + "dependencies": { + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-node": { + "version": "3.316.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.316.0.tgz", + "integrity": "sha512-dkYy10hdjPSScXXvnjGpZpnJxllkb6ICHgLMwZ4JczLHhPM12T/4PQ758YN8HS+muiYDGX1Bl2z1jd/bMcewBQ==", + "dependencies": { + "@aws-sdk/config-resolver": "3.310.0", + "@aws-sdk/credential-provider-imds": "3.310.0", + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/property-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.319.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.319.0.tgz", + "integrity": "sha512-3I64UMoYA2e2++oOUJXRcFtYLpLylnZFRltWfPo1B3dLlf+MIWat9djT+mMus+hW1ntLsvAIVu1hLVePJC0gvw==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-hex-encoding": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz", + "integrity": "sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-middleware": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.310.0.tgz", + "integrity": "sha512-FTSUKL/eRb9X6uEZClrTe27QFXUNNp7fxYrPndZwk1hlaOP5ix+MIHBcI7pIiiY/JPfOUmPyZOu+HetlFXjWog==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-retry": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.310.0.tgz", + "integrity": "sha512-FwWGhCBLfoivTMUHu1LIn4NjrN9JLJ/aX5aZmbcPIOhZVFJj638j0qDgZXyfvVqBuBZh7M8kGq0Oahy3dp69OA==", + "dependencies": { + "@aws-sdk/service-error-classification": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@aws-sdk/util-stream-browser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.310.0.tgz", + "integrity": "sha512-bysXZHwFwvbqOTCScCdCnoLk1K3GCo0HRIYEZuL7O7MHrQmfaYRXcaft/p22+GUv9VeFXS/eJJZ5r4u32az94w==", + "dependencies": { + "@aws-sdk/fetch-http-handler": "3.310.0", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-stream-node": { + "version": "3.321.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.321.1.tgz", + "integrity": "sha512-jvfff1zeA8q16hQWSC0BGwcHJPCwoh+bwiuAjihfl9q1tFLYuqaTzJzzkL1bntUsbW+y/ac5DO7fWcYPq0jWkw==", + "dependencies": { + "@aws-sdk/node-http-handler": "3.321.1", + "@aws-sdk/types": "3.310.0", + "@aws-sdk/util-buffer-from": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-uri-escape": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz", + "integrity": "sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.310.0.tgz", + "integrity": "sha512-yU/4QnHHuQ5z3vsUqMQVfYLbZGYwpYblPiuZx4Zo9+x0PBkNjYMqctdDcrpoH9Z2xZiDN16AmQGK1tix117ZKw==", + "dependencies": { + "@aws-sdk/types": "3.310.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.310.0.tgz", + "integrity": "sha512-Ra3pEl+Gn2BpeE7KiDGpi4zj7WJXZA5GXnGo3mjbi9+Y3zrbuhJAbdZO3mO/o7xDgMC6ph4xCTbaSGzU6b6EDg==", + "dependencies": { + "@aws-sdk/node-config-provider": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz", + "integrity": "sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==", + "dependencies": { + "@aws-sdk/util-buffer-from": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-waiter": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.310.0.tgz", + "integrity": "sha512-AV5j3guH/Y4REu+Qh3eXQU9igljHuU4XjX2sADAgf54C0kkhcCCkkiuzk3IsX089nyJCqIcj5idbjdvpnH88Vw==", + "dependencies": { + "@aws-sdk/abort-controller": "3.310.0", + "@aws-sdk/types": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz", + "integrity": "sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.5.tgz", + "integrity": "sha512-9M398B/QH5DlfCOTKDZT1ozXr0x8uBEeFd+dJraGUZGiaNpGCDVGCc14hZexsMblw3XxltJ+6kSvogp9J+5a9g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.5", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "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 + }, + "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, + "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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.5.tgz", + "integrity": "sha512-J+IxH2IsxV4HbnTrSWgMAQj0UEo61hDA4Ny8h8PCX0MLXiibqHbqIOVneqdocemSBc22VpBKxt4J6FQzy9HarQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "node_modules/@babel/traverse": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", "debug": "^4.1.0", "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "node_modules/@babel/types": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", + "dependencies": { + "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" } }, - "@commitlint/cli": { + "node_modules/@commitlint/cli": { "version": "16.3.0", "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-16.3.0.tgz", "integrity": "sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA==", "dev": true, - "requires": { + "dependencies": { "@commitlint/format": "^16.2.1", "@commitlint/lint": "^16.2.4", "@commitlint/load": "^16.3.0", @@ -512,112 +2245,163 @@ "resolve-from": "5.0.0", "resolve-global": "1.0.0", "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v12" } }, - "@commitlint/config-conventional": { + "node_modules/@commitlint/config-conventional": { "version": "16.2.4", "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-16.2.4.tgz", "integrity": "sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA==", "dev": true, - "requires": { + "dependencies": { "conventional-changelog-conventionalcommits": "^4.3.1" + }, + "engines": { + "node": ">=v12" } }, - "@commitlint/config-validator": { + "node_modules/@commitlint/config-validator": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-16.2.1.tgz", "integrity": "sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==", "dev": true, - "requires": { + "dependencies": { "@commitlint/types": "^16.2.1", "ajv": "^6.12.6" }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/config-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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 - } + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "@commitlint/ensure": { + "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@commitlint/ensure": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-16.2.1.tgz", "integrity": "sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==", "dev": true, - "requires": { + "dependencies": { "@commitlint/types": "^16.2.1", "lodash": "^4.17.19" + }, + "engines": { + "node": ">=v12" } }, - "@commitlint/execute-rule": { + "node_modules/@commitlint/execute-rule": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-16.2.1.tgz", "integrity": "sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==", - "dev": true + "dev": true, + "engines": { + "node": ">=v12" + } }, - "@commitlint/format": { + "node_modules/@commitlint/format": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-16.2.1.tgz", "integrity": "sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==", "dev": true, - "requires": { + "dependencies": { "@commitlint/types": "^16.2.1", "chalk": "^4.0.0" + }, + "engines": { + "node": ">=v12" } }, - "@commitlint/is-ignored": { + "node_modules/@commitlint/is-ignored": { "version": "16.2.4", "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-16.2.4.tgz", "integrity": "sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==", "dev": true, - "requires": { + "dependencies": { "@commitlint/types": "^16.2.1", "semver": "7.3.7" }, + "engines": { + "node": ">=v12" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "@commitlint/lint": { + "node_modules/@commitlint/is-ignored/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@commitlint/lint": { "version": "16.2.4", "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-16.2.4.tgz", "integrity": "sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==", "dev": true, - "requires": { + "dependencies": { "@commitlint/is-ignored": "^16.2.4", "@commitlint/parse": "^16.2.1", "@commitlint/rules": "^16.2.4", "@commitlint/types": "^16.2.1" + }, + "engines": { + "node": ">=v12" } }, - "@commitlint/load": { + "node_modules/@commitlint/load": { "version": "16.3.0", "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-16.3.0.tgz", "integrity": "sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A==", "dev": true, - "requires": { + "dependencies": { "@commitlint/config-validator": "^16.2.1", "@commitlint/execute-rule": "^16.2.1", "@commitlint/resolve-extends": "^16.2.1", @@ -629,253 +2413,338 @@ "lodash": "^4.17.19", "resolve-from": "^5.0.0", "typescript": "^4.4.3" + }, + "engines": { + "node": ">=v12" } }, - "@commitlint/message": { + "node_modules/@commitlint/message": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-16.2.1.tgz", "integrity": "sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==", - "dev": true + "dev": true, + "engines": { + "node": ">=v12" + } }, - "@commitlint/parse": { + "node_modules/@commitlint/parse": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-16.2.1.tgz", "integrity": "sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==", "dev": true, - "requires": { + "dependencies": { "@commitlint/types": "^16.2.1", "conventional-changelog-angular": "^5.0.11", "conventional-commits-parser": "^3.2.2" + }, + "engines": { + "node": ">=v12" } }, - "@commitlint/read": { + "node_modules/@commitlint/read": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-16.2.1.tgz", "integrity": "sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==", "dev": true, - "requires": { + "dependencies": { "@commitlint/top-level": "^16.2.1", "@commitlint/types": "^16.2.1", "fs-extra": "^10.0.0", "git-raw-commits": "^2.0.0" + }, + "engines": { + "node": ">=v12" } }, - "@commitlint/resolve-extends": { + "node_modules/@commitlint/resolve-extends": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-16.2.1.tgz", "integrity": "sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==", "dev": true, - "requires": { + "dependencies": { "@commitlint/config-validator": "^16.2.1", "@commitlint/types": "^16.2.1", "import-fresh": "^3.0.0", "lodash": "^4.17.19", "resolve-from": "^5.0.0", "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v12" } }, - "@commitlint/rules": { + "node_modules/@commitlint/rules": { "version": "16.2.4", "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-16.2.4.tgz", "integrity": "sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==", "dev": true, - "requires": { + "dependencies": { "@commitlint/ensure": "^16.2.1", "@commitlint/message": "^16.2.1", "@commitlint/to-lines": "^16.2.1", "@commitlint/types": "^16.2.1", "execa": "^5.0.0" + }, + "engines": { + "node": ">=v12" } }, - "@commitlint/to-lines": { + "node_modules/@commitlint/to-lines": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-16.2.1.tgz", "integrity": "sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=v12" + } }, - "@commitlint/top-level": { + "node_modules/@commitlint/top-level": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-16.2.1.tgz", "integrity": "sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==", "dev": true, - "requires": { + "dependencies": { "find-up": "^5.0.0" }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - } + "engines": { + "node": ">=v12" } }, - "@commitlint/types": { + "node_modules/@commitlint/types": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-16.2.1.tgz", "integrity": "sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.0.0" + }, + "engines": { + "node": ">=v12" } }, - "@cspotcode/source-map-support": { + "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, - "requires": { + "dependencies": { "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "@faker-js/faker": { + "node_modules/@faker-js/faker": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-6.3.1.tgz", "integrity": "sha512-8YXBE2ZcU/pImVOHX7MWrSR/X5up7t6rPWZlk34RwZEcdr3ua6X+32pSd6XuOQRN+vbuvYNfA6iey8NbrjuMFQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } }, - "@gar/promisify": { + "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, - "@hutson/parse-repository-url": { + "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "@istanbuljs/load-nyc-config": { + "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "@istanbuljs/nyc-config-typescript": { + "node_modules/@istanbuljs/nyc-config-typescript": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", "dev": true, - "requires": { + "dependencies": { "@istanbuljs/schema": "^0.1.2" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "nyc": ">=15" } }, - "@istanbuljs/schema": { + "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "@jest/console": { + "node_modules/@jest/console": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^28.1.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^28.1.3", "jest-util": "^28.1.3", "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "@jest/expect-utils": { + "node_modules/@jest/expect-utils": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", "dev": true, - "requires": { + "dependencies": { "jest-get-type": "^28.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "@jest/schemas": { + "node_modules/@jest/schemas": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", "dev": true, - "requires": { + "dependencies": { "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "@jest/test-result": { + "node_modules/@jest/test-result": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", "dev": true, - "requires": { + "dependencies": { "@jest/console": "^28.1.3", "@jest/types": "^28.1.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "@jest/transform": { + "node_modules/@jest/transform": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^28.1.3", "@jridgewell/trace-mapping": "^0.3.13", @@ -892,281 +2761,450 @@ "slash": "^3.0.0", "write-file-atomic": "^4.0.1" }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - } + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "@jest/types": { + "node_modules/@jest/types": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", "dev": true, - "requires": { + "dependencies": { "@jest/schemas": "^28.1.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "@jridgewell/resolve-uri": { + "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.0.0" + } }, - "@jridgewell/set-array": { + "node_modules/@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, - "@jridgewell/sourcemap-codec": { + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jsdevtools/ono": { + "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", "dev": true }, - "@nodelib/fs.scandir": { + "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==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "@nodelib/fs.stat": { + "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==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "@nodelib/fs.walk": { + "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==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "dev": true, - "requires": { - "@gar/promisify": "^1.1.3", + "dependencies": { "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "@npmcli/git": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", - "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", + "node_modules/@npmcli/git": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz", + "integrity": "sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==", "dev": true, - "requires": { - "@npmcli/promise-spawn": "^3.0.0", + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^2.0.2" + "which": "^3.0.0" }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, "dependencies": { - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - } + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "@npmcli/move-file": { + "node_modules/@npmcli/move-file": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, - "requires": { + "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "@npmcli/node-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", - "dev": true + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } }, - "@npmcli/promise-spawn": { + "node_modules/@npmcli/node-gyp": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "dev": true, - "requires": { - "infer-owner": "^1.0.4" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "@npmcli/run-script": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", - "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.1.tgz", + "integrity": "sha512-Yi04ZSold8jcbBJD/ahKMJSQCQifH8DAbMwkBvoLaTpGFxzHC3B/5ZyoVR69q/4xedz84tvi9DJOJjNe17h+LA==", "dev": true, - "requires": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.1.1.tgz", + "integrity": "sha512-yfRcuupmxxeDOSxvw4g+wFCrGiPD0L32f5WMzqMXp7Rl93EOCdFiDcaSNnZ10Up9GdNqkj70UTa8hfhPFphaZA==", + "dev": true, + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" } }, - "@samverschueren/stream-to-observable": { + "node_modules/@samverschueren/stream-to-observable": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", - "requires": { + "dependencies": { "any-observable": "^0.3.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "rxjs": { + "optional": true + }, + "zen-observable": { + "optional": true + } + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", + "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "@sinclair/typebox": { + "node_modules/@sinclair/typebox": { "version": "0.24.51", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", "dev": true }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true + "node_modules/@sindresorhus/is": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } }, - "@sinonjs/commons": { + "node_modules/@sinonjs/commons": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, - "requires": { + "dependencies": { "type-detect": "4.0.8" } }, - "@sinonjs/fake-timers": { + "node_modules/@sinonjs/fake-timers": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^1.7.0" } }, - "@sinonjs/samsam": { + "node_modules/@sinonjs/samsam": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^1.6.0", "lodash.get": "^4.4.2", "type-detect": "^4.0.8" } }, - "@sinonjs/text-encoding": { + "node_modules/@sinonjs/text-encoding": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, - "@stoplight/http-spec": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@stoplight/http-spec/-/http-spec-5.6.2.tgz", - "integrity": "sha512-r071B/7u2qbJhHoJF0vnlZ4oghDvuW8OKuSrubSRP9pAoqiOD89HUNNUhlB1j6aO27lAHoz/qwxSUM7KS54HMw==", + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.4.tgz", + "integrity": "sha512-091yneupXnSqvAU+vLG7h0g4QRRO6TjulpECXYVU6yW/LiNp7QE533DBpaphmbtI6tTC4EfGrhn35gTa0w+GQg==", + "dependencies": { + "@smithy/types": "^2.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.2.1.tgz", + "integrity": "sha512-6nyDOf027ZeJiQVm6PXmLm7dR+hR2YJUkr4VwUniXA8xZUGAu5Mk0zfx2BPFrt+e5YauvlIqQoH0CsrM4tLkfg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@stoplight/http-spec": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/@stoplight/http-spec/-/http-spec-5.9.3.tgz", + "integrity": "sha512-+17tNJZGjI3j+aplqovs1pMCcFQLh5T72nA/CMlx7djHlnHKDil6R8RlvLzQhAOMXTBXFrM/WczYJvq7CXftkA==", "dev": true, - "requires": { + "dependencies": { "@stoplight/json": "^3.18.1", "@stoplight/json-schema-generator": "1.0.2", - "@stoplight/types": "^13.6.0", + "@stoplight/types": "^13.15.0", "@types/json-schema": "7.0.11", "@types/swagger-schema-official": "~2.0.22", "@types/type-is": "^1.6.3", @@ -1178,104 +3216,111 @@ "postman-collection": "^4.1.2", "tslib": "^2.3.1", "type-is": "^1.6.18" + }, + "engines": { + "node": ">=14.13" } }, - "@stoplight/json": { + "node_modules/@stoplight/json": { "version": "3.20.2", "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.20.2.tgz", "integrity": "sha512-e3Eb/DdLSpJVAsxAG1jKSnl4TVZLl2pH8KsJBWKf5GPCeI58Eo0ZpRTX3HcZ0gBaHWH6CnEHJkCRCONhoFbDIA==", "dev": true, - "requires": { + "dependencies": { "@stoplight/ordered-object-literal": "^1.0.3", "@stoplight/path": "^1.3.2", "@stoplight/types": "^13.6.0", "jsonc-parser": "~2.2.1", "lodash": "^4.17.21", "safe-stable-stringify": "^1.1" + }, + "engines": { + "node": ">=8.3.0" } }, - "@stoplight/json-schema-generator": { + "node_modules/@stoplight/json-schema-generator": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@stoplight/json-schema-generator/-/json-schema-generator-1.0.2.tgz", "integrity": "sha512-FzSLFoIZc6Lmw3oRE7kU6YUrl5gBmUs//rY59jdFipBoSyTPv5NyqeyTg5mvT6rY1F3qTLU3xgzRi/9Pb9eZpA==", "dev": true, - "requires": { + "dependencies": { "cross-fetch": "^3.1.5", "json-promise": "1.1.x", "minimist": "1.2.6", "mkdirp": "0.5.x", "pretty-data": "0.40.x" }, - "dependencies": { - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - } + "bin": { + "json-schema-generator": "bin/cli.js" } }, - "@stoplight/json-schema-merge-allof": { + "node_modules/@stoplight/json-schema-merge-allof": { "version": "0.7.8", "resolved": "https://registry.npmjs.org/@stoplight/json-schema-merge-allof/-/json-schema-merge-allof-0.7.8.tgz", "integrity": "sha512-JTDt6GYpCWQSb7+UW1P91IAp/pcLWis0mmEzWVFcLsrNgtUYK7JLtYYz0ZPSR4QVL0fJ0YQejM+MPq5iNDFO4g==", "dev": true, - "requires": { + "dependencies": { "compute-lcm": "^1.1.0", "json-schema-compare": "^0.2.2", "lodash": "^4.17.4" } }, - "@stoplight/json-schema-ref-parser": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@stoplight/json-schema-ref-parser/-/json-schema-ref-parser-9.2.1.tgz", - "integrity": "sha512-iKWeomA0HHDcbG0G8yVzQFs9y5vtF/GtjEDSuhofdHcPxXMhnTUh8d9NdbhXPCVhwIRmdvzP3jMv2A3747hyWg==", + "node_modules/@stoplight/json-schema-ref-parser": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@stoplight/json-schema-ref-parser/-/json-schema-ref-parser-9.2.4.tgz", + "integrity": "sha512-alWys5FhpfBtCJpZmWq47fZ4BBGcOGUqEI8b7AkJRZ+OaEoUIQtm8BReWY+JbU4D7+tBozX8Y+LF9Oxa9mYDSg==", "dev": true, - "requires": { + "dependencies": { "@jsdevtools/ono": "^7.1.3", "@stoplight/path": "^1.3.2", "@stoplight/yaml": "^4.0.2", - "abort-controller": "^3.0.0", "call-me-maybe": "^1.0.1", "fastestsmallesttextencoderdecoder": "^1.0.22", - "isomorphic-fetch": "^3.0.0" + "isomorphic-fetch": "^3.0.0", + "node-abort-controller": "^3.0.1" } }, - "@stoplight/json-schema-sampler": { + "node_modules/@stoplight/json-schema-sampler": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@stoplight/json-schema-sampler/-/json-schema-sampler-0.2.2.tgz", "integrity": "sha512-QP4ZwXh3dEn5wHZs2361kdf4BmaKiiP+pxIImAuVTLmulv9sBTB+ETG7Y5z9u4DOUQu2GNxfUY10iSwuBQMXrg==", "dev": true, - "requires": { + "dependencies": { "@types/json-schema": "^7.0.7", "json-pointer": "^0.6.1" } }, - "@stoplight/ordered-object-literal": { + "node_modules/@stoplight/ordered-object-literal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.4.tgz", "integrity": "sha512-OF8uib1jjDs5/cCU+iOVy+GJjU3X7vk/qJIkIJFqwmlJKrrtijFmqwbu8XToXrwTYLQTP+Hebws5gtZEmk9jag==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "@stoplight/path": { + "node_modules/@stoplight/path": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@stoplight/path/-/path-1.3.2.tgz", "integrity": "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "@stoplight/prism-cli": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@stoplight/prism-cli/-/prism-cli-4.11.1.tgz", - "integrity": "sha512-GtRvBSOXD0XjN2ZUZ7H4Q7wmL7gF5eI8kesOv2MQl/WPbQr0skrArLjfe81g4XUv2Nic50mJGelz/w8scKbZ7w==", + "node_modules/@stoplight/prism-cli": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@stoplight/prism-cli/-/prism-cli-4.14.1.tgz", + "integrity": "sha512-2rZ0pJSD0ZNtiklyAc/jwMI31B6ONWIP7fVlIUcm4D0mbkPNV5Y+dlmhiyBxk9QIWA6o83ZnfBkj/z02+LpMMQ==", "dev": true, - "requires": { - "@stoplight/http-spec": "^5.5.2", + "dependencies": { + "@stoplight/http-spec": "^5.9.2", "@stoplight/json": "^3.18.1", - "@stoplight/json-schema-ref-parser": "9.2.1", - "@stoplight/prism-core": "^4.11.1", - "@stoplight/prism-http": "^4.11.1", - "@stoplight/prism-http-server": "^4.11.1", - "@stoplight/types": "^13.6.0", + "@stoplight/json-schema-ref-parser": "9.2.4", + "@stoplight/prism-core": "^4.14.1", + "@stoplight/prism-http": "^4.14.1", + "@stoplight/prism-http-server": "^4.14.1", + "@stoplight/types": "^13.15.0", "chalk": "^4.1.2", "chokidar": "^3.5.2", "fp-ts": "^2.11.5", @@ -1290,81 +3335,92 @@ "urijs": "^1.19.11", "yargs": "^16.2.0" }, + "bin": { + "prism": "dist/index.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@stoplight/prism-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "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 - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@stoplight/prism-cli/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, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/@stoplight/prism-cli/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, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "@stoplight/prism-core": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@stoplight/prism-core/-/prism-core-4.11.1.tgz", - "integrity": "sha512-iqWQk0g9qLsNNBnWXOuQ4CxRHYRiPGRxE3cR2As3SpxGjJWsX1BSEwsld2wjSGRpLG7V6VsKt4dWTkaC9aJicA==", + "node_modules/@stoplight/prism-core": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@stoplight/prism-core/-/prism-core-4.14.1.tgz", + "integrity": "sha512-BBbZVPlrshU9izUZOnUaluLDcgrHAsPqXuouPr0WXyd229IQst0hGUMb3nlAIM1W/jdYbKr5hcDp/y3uqKE5CA==", "dev": true, - "requires": { + "dependencies": { "fp-ts": "^2.11.5", "lodash": "^4.17.21", "pino": "^6.13.3", "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16" } }, - "@stoplight/prism-http": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@stoplight/prism-http/-/prism-http-4.11.1.tgz", - "integrity": "sha512-IwPzPGQX/bF7u+mMtWyALI9ulucCTBQCma7hvWLrg4YMOij8ieB+6KR+PqQ5p/0kBnj/g9JhPBAouL1L10LUSQ==", + "node_modules/@stoplight/prism-http": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@stoplight/prism-http/-/prism-http-4.14.1.tgz", + "integrity": "sha512-F6Mr2P78lLnsgG0Qz9bYi4Q1MGfnlZ/nYMV9R4c0V1MGv7IEqxPLHZhlIRm3DjTYs34aPC1BiujvBSpP19iKWQ==", "dev": true, - "requires": { + "dependencies": { "@faker-js/faker": "^6.0.0", "@stoplight/json": "^3.18.1", "@stoplight/json-schema-merge-allof": "0.7.8", "@stoplight/json-schema-sampler": "0.2.2", - "@stoplight/prism-core": "^4.11.1", - "@stoplight/types": "^13.0.0", + "@stoplight/prism-core": "^4.14.1", + "@stoplight/types": "^13.15.0", "@stoplight/yaml": "^4.2.3", "abstract-logging": "^2.0.1", "accepts": "^1.3.7", "ajv": "^8.4.0", "ajv-formats": "^2.1.1", "caseless": "^0.12.0", + "chalk": "^4.1.2", "content-type": "^1.0.4", "fp-ts": "^2.11.5", "http-proxy-agent": "^5.0.0", @@ -1376,18 +3432,21 @@ "tslib": "^2.3.1", "type-is": "^1.6.18", "uri-template-lite": "^22.9.0" + }, + "engines": { + "node": ">=16" } }, - "@stoplight/prism-http-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@stoplight/prism-http-server/-/prism-http-server-4.11.1.tgz", - "integrity": "sha512-IjWkEB/kPwEy/uBsKHu4uihcK9l4cARE44WYgZ/CMXAdwqHeK5ZT/W0wIAKGxguWQOTuAOye05CzkNTKK0Eokg==", + "node_modules/@stoplight/prism-http-server": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@stoplight/prism-http-server/-/prism-http-server-4.14.1.tgz", + "integrity": "sha512-PwEcJm3+lRywTeVD0VaHpQ9yNLJiKZE5AjxkQoYAposNcWZzB9fSL2pSNe3K/Dofq+FwG+4w3gH4eSongebFHQ==", "dev": true, - "requires": { - "@stoplight/prism-core": "^4.11.1", - "@stoplight/prism-http": "^4.11.1", - "@stoplight/types": "^13.0.0", - "fast-xml-parser": "^3.20.3", + "dependencies": { + "@stoplight/prism-core": "^4.14.1", + "@stoplight/prism-http": "^4.14.1", + "@stoplight/types": "^13.15.0", + "fast-xml-parser": "^4.2.0", "fp-ts": "^2.11.5", "io-ts": "^2.2.16", "lodash": "^4.17.21", @@ -1396,593 +3455,743 @@ "parse-prefer-header": "1.0.0", "tslib": "^2.3.1", "type-is": "^1.6.18" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@stoplight/prism-http-server/node_modules/fast-xml-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.2.tgz", + "integrity": "sha512-DLzIPtQqmvmdq3VUKR7T6omPK/VCRNqgFlGtbESfyhcH2R4I8EzK1/K6E8PkRCK2EabWrUHK32NjYRbEFnnz0Q==", + "dev": true, + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@stoplight/prism-http/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@stoplight/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.10.0.tgz", - "integrity": "sha512-clCXabaqDZQxtTnmeH2ZHdUeZsQtQkebLo+tPywqr8tgcrNbkKUBiBQRFW/CfU3DGN3OM+jCquN0O6u/4a0qbQ==", + "node_modules/@stoplight/types": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/@stoplight/types/-/types-13.15.0.tgz", + "integrity": "sha512-pBLjVRrWGVd+KzTbL3qrmufSKIEp0UfziDBdt/nrTHPKrlrtVwaHdrrQMcpM23yJDU1Wcg4cHvhIuGtKCT5OmA==", "dev": true, - "requires": { + "dependencies": { "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" } }, - "@stoplight/yaml": { + "node_modules/@stoplight/yaml": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/@stoplight/yaml/-/yaml-4.2.3.tgz", "integrity": "sha512-Mx01wjRAR9C7yLMUyYFTfbUf5DimEpHMkRDQ1PKLe9dfNILbgdxyrncsOXM3vCpsQ1Hfj4bPiGl+u4u6e9Akqw==", "dev": true, - "requires": { + "dependencies": { "@stoplight/ordered-object-literal": "^1.0.1", "@stoplight/types": "^13.0.0", "@stoplight/yaml-ast-parser": "0.0.48", "tslib": "^2.2.0" + }, + "engines": { + "node": ">=10.8" } }, - "@stoplight/yaml-ast-parser": { + "node_modules/@stoplight/yaml-ast-parser": { "version": "0.0.48", "resolved": "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.48.tgz", "integrity": "sha512-sV+51I7WYnLJnKPn2EMWgS4EUfoP4iWEbrWwbXsj0MZCB/xOK8j6+C9fntIdOM50kpx45ZLC3s6kwKivWuqvyg==", "dev": true }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "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, - "requires": { - "defer-to-connect": "^1.0.1" + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" } }, - "@tootallnate/once": { + "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true + "dev": true, + "engines": { + "node": ">= 10" + } }, - "@tsconfig/node10": { + "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", "dev": true }, - "@tsconfig/node12": { + "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 }, - "@tsconfig/node14": { + "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 }, - "@tsconfig/node16": { + "node_modules/@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", "dev": true }, - "@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.3.tgz", + "integrity": "sha512-mkFEqqRisi13DmR5pX4x+Zk97EiU8djTtpNW1GeuX410y/raAsq/T3ZCjwoRIZ8/cIBfW0olK/sywlAiWevDVw==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^7.4.6" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", + "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.3.0" } }, - "@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", "dev": true }, - "@types/chai-as-promised": { + "node_modules/@types/chai-as-promised": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", "dev": true, - "requires": { + "dependencies": { "@types/chai": "*" } }, - "@types/chai-json-schema": { + "node_modules/@types/chai-json-schema": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/@types/chai-json-schema/-/chai-json-schema-1.4.6.tgz", "integrity": "sha512-Z+zM4XwNkno4nWkKkbeLvf6IZTnA7ffGpX0QAcql0wQdKniGc849Leblx4ojRsv7IjS4Ct16MGr1SLNrJQZsRg==", "dev": true, - "requires": { + "dependencies": { "@types/tv4": "*" } }, - "@types/chai-uuid": { + "node_modules/@types/chai-uuid": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/chai-uuid/-/chai-uuid-1.0.2.tgz", "integrity": "sha512-bT/Y19gztsbE5ZvKBCMHf6Ziiw3e3l2v962ycLIksjJEd85YSW+L3jrj6wO4yA53d6CRKifZ09QDa73OA2VUDw==", "dev": true, - "requires": { + "dependencies": { "@types/chai": "*", "@types/node": "*" } }, - "@types/fs-extra": { + "node_modules/@types/fs-extra": { "version": "9.0.13", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/graceful-fs": { + "node_modules/@types/graceful-fs": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/inquirer": { + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "node_modules/@types/inquirer": { "version": "8.2.6", "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.6.tgz", "integrity": "sha512-3uT88kxg8lNzY8ay2ZjP44DKcRaTGztqeIvN2zHvhzIBH/uAPaL75aBtdNRKbA7xXoMbBt5kX0M00VKAnfOYlA==", "dev": true, - "requires": { + "dependencies": { "@types/through": "*", "rxjs": "^7.2.0" } }, - "@types/istanbul-lib-coverage": { + "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, - "@types/istanbul-lib-report": { + "node_modules/@types/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-coverage": "*" } }, - "@types/istanbul-reports": { + "node_modules/@types/istanbul-reports": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-report": "*" } }, - "@types/json-schema": { + "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, - "@types/jsonfile": { + "node_modules/@types/jsonfile": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/listr": { + "node_modules/@types/listr": { "version": "0.14.4", "resolved": "https://registry.npmjs.org/@types/listr/-/listr-0.14.4.tgz", "integrity": "sha512-+MWvidNujBUgJsi4yMVwEQQwaHe6oHedPSy+dwk3akGEeuIbvhWkK+TGsXSwbFup7Y0cCBb+wzzdD+yGKp7sOg==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*", "rxjs": "^6.5.1" - }, + } + }, + "node_modules/@types/listr/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" } }, - "@types/minimist": { + "node_modules/@types/listr/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 + }, + "node_modules/@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, - "@types/mocha": { + "node_modules/@types/mocha": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", "dev": true }, - "@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" + "node_modules/@types/node": { + "version": "18.16.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", + "integrity": "sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==" }, - "@types/normalize-package-data": { + "node_modules/@types/normalize-package-data": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, - "@types/parse-json": { + "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "@types/portscanner": { + "node_modules/@types/portscanner": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@types/portscanner/-/portscanner-2.1.1.tgz", "integrity": "sha512-1NsVIbgBKvrqxwtMN0V6CLji1ERwKSI/RWz0J3y++CzSwYNGBStCfpIFgxV3ZwxsDR5PoZqoUWhwraDm+Ztn0Q==", "dev": true }, - "@types/prettier": { + "node_modules/@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", "dev": true }, - "@types/proxyquire": { + "node_modules/@types/proxyquire": { "version": "1.3.28", "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.28.tgz", "integrity": "sha512-SQaNzWQ2YZSr7FqAyPPiA3FYpux2Lqh3HWMZQk47x3xbMCqgC/w0dY3dw9rGqlweDDkrySQBcaScXWeR+Yb11Q==", "dev": true }, - "@types/ramda": { - "version": "0.28.23", - "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.28.23.tgz", - "integrity": "sha512-9TYWiwkew+mCMsL7jZ+kkzy6QXn8PL5/SKmBPmjgUlTpkokZWTBr+OhiIUDztpAEbslWyt24NNfEmZUBFmnXig==", + "node_modules/@types/ramda": { + "version": "0.28.25", + "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.28.25.tgz", + "integrity": "sha512-HrQNqQAGcITpn9HAJFamDxm7iZeeXiP/95pN5OMbNniDjzCCeOHbBKNGmUy8NRi0fhYS+/cXeo91MFC+06gbow==", "dev": true, - "requires": { + "dependencies": { "ts-toolbelt": "^6.15.1" } }, - "@types/semver": { + "node_modules/@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, - "@types/sinon": { - "version": "10.0.13", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz", - "integrity": "sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==", + "node_modules/@types/sinon": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.14.tgz", + "integrity": "sha512-mn72up6cjaMyMuaPaa/AwKf6WtsSRysQC7wxFkCm1XcOKXPM1z+5Y4H5wjIVBz4gdAkjvZxVVfjA6ba1nHr5WQ==", "dev": true, - "requires": { + "dependencies": { "@types/sinonjs__fake-timers": "*" } }, - "@types/sinon-chai": { + "node_modules/@types/sinon-chai": { "version": "3.2.9", "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.9.tgz", "integrity": "sha512-/19t63pFYU0ikrdbXKBWj9PCdnKyTd0Qkz0X91Ta081cYsq90OxYdcWwK/dwEoDa6dtXgj2HJfmzgq+QZTHdmQ==", "dev": true, - "requires": { + "dependencies": { "@types/chai": "*", "@types/sinon": "*" } }, - "@types/sinonjs__fake-timers": { + "node_modules/@types/sinonjs__fake-timers": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", "dev": true }, - "@types/stack-utils": { + "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, - "@types/swagger-schema-official": { + "node_modules/@types/swagger-schema-official": { "version": "2.0.22", "resolved": "https://registry.npmjs.org/@types/swagger-schema-official/-/swagger-schema-official-2.0.22.tgz", "integrity": "sha512-7yQiX6MWSFSvc/1wW5smJMZTZ4fHOd+hqLr3qr/HONDxHEa2bnYAsOcGBOEqFIjd4yetwMOdEDdeW+udRAQnHA==", "dev": true }, - "@types/through": { + "node_modules/@types/through": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/tv4": { + "node_modules/@types/tv4": { "version": "1.2.31", "resolved": "https://registry.npmjs.org/@types/tv4/-/tv4-1.2.31.tgz", "integrity": "sha512-P97XU07fcpauSw3/fE2Q7eF6bHl4oHhwkikjnM7zlQLENrdC2rZuHSdNlMBhnW82NyBEsVJHII1Jk3d/MtQsQQ==", "dev": true }, - "@types/type-is": { + "node_modules/@types/type-is": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/@types/type-is/-/type-is-1.6.3.tgz", "integrity": "sha512-PNs5wHaNcBgCQG5nAeeZ7OvosrEsI9O4W2jAOO9BCCg4ux9ZZvH2+0iSCOIDBiKuQsiNS8CBlmfX9f5YBQ22cA==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/uuid": { + "node_modules/@types/uuid": { "version": "8.3.4", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, - "@types/vscode": { + "node_modules/@types/vscode": { "version": "1.77.0", "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.77.0.tgz", "integrity": "sha512-MWFN5R7a33n8eJZJmdVlifjig3LWUNRrPeO1xemIcZ0ae0TEQuRc7G2xV0LUX78RZFECY1plYBn+dP/Acc3L0Q==", "dev": true }, - "@types/yargs": { + "node_modules/@types/yargs": { "version": "17.0.24", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, - "requires": { + "dependencies": { "@types/yargs-parser": "*" } }, - "@types/yargs-parser": { + "node_modules/@types/yargs-parser": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "@vscode/test-electron": { + "node_modules/@vscode/test-electron": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-1.6.2.tgz", "integrity": "sha512-W01ajJEMx6223Y7J5yaajGjVs1QfW3YGkkOJHVKfAMEqNB1ZHN9wCcViehv5ZwVSSJnjhu6lYEYgwBdHtCxqhQ==", "dev": true, - "requires": { + "dependencies": { "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "rimraf": "^3.0.2", "unzipper": "^0.10.11" }, - "dependencies": { - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "engines": { + "node": ">=8.9.3" } }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "node_modules/@vscode/test-electron/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "engines": { + "node": ">= 6" + } + }, + "node_modules/@vscode/test-electron/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, - "abbrev": { + "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "abstract-logging": { + "node_modules/abstract-logging": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", "dev": true }, - "accepts": { + "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "requires": { + "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" } }, - "acorn": { + "node_modules/acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "acorn-walk": { + "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, - "add-stream": { + "node_modules/add-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", "dev": true }, - "adm-zip": { + "node_modules/adm-zip": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", - "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==" + "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", + "engines": { + "node": ">=6.0" + } }, - "agent-base": { + "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, - "requires": { + "dependencies": { "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" } }, - "agentkeepalive": { + "node_modules/agentkeepalive": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.1.0", "depd": "^2.0.0", "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" } }, - "aggregate-error": { + "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { + "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aggregate-error/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==", + "engines": { + "node": ">=8" } }, - "ajv": { + "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { + "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "ajv-formats": { + "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==", - "requires": { + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "ansi-align": { + "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, - "requires": { + "dependencies": { "string-width": "^4.1.0" } }, - "ansi-colors": { + "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "ansi-escapes": { + "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==", - "requires": { + "dependencies": { "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "ansi-regex": { + "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==" + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } }, - "ansi-styles": { + "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==", - "requires": { + "dependencies": { "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "antlr4ts": { + "node_modules/antlr4ts": { "version": "0.5.0-alpha.4", "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==" }, - "any-observable": { + "node_modules/any-observable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==" + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "engines": { + "node": ">=6" + } }, - "anymatch": { + "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==", - "requires": { + "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "append-transform": { + "node_modules/append-transform": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, - "requires": { + "dependencies": { "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "aproba": { + "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, - "archiver": { + "node_modules/archiver": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", - "requires": { + "dependencies": { "archiver-utils": "^2.1.0", "async": "^3.2.3", "buffer-crc32": "^0.2.1", @@ -1991,19 +4200,15 @@ "tar-stream": "^2.2.0", "zip-stream": "^4.1.0" }, - "dependencies": { - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - } + "engines": { + "node": ">= 10" } }, - "archiver-utils": { + "node_modules/archiver-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "requires": { + "dependencies": { "glob": "^7.1.4", "graceful-fs": "^4.2.0", "lazystream": "^1.0.0", @@ -2015,147 +4220,177 @@ "normalize-path": "^3.0.0", "readable-stream": "^2.0.0" }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "archy": { + "node_modules/archiver/node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true }, - "are-we-there-yet": { + "node_modules/are-we-there-yet": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "dev": true, - "requires": { + "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "arg": { + "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, - "argparse": { + "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==" }, - "array-ify": { + "node_modules/array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, - "array-union": { + "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==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "arrify": { + "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "ask-sdk-model-runtime": { + "node_modules/ask-sdk-model-runtime": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ask-sdk-model-runtime/-/ask-sdk-model-runtime-1.4.0.tgz", "integrity": "sha512-JSu9zGklm8jtaQMk344BTJqVSX/tenFNB7b+jgnoHDp4aRwmzCAlDnBiiNAVMXlbrBeIi+ms79yK1s2oq0PjFg==" }, - "ask-smapi-model": { - "version": "1.19.12", - "resolved": "https://registry.npmjs.org/ask-smapi-model/-/ask-smapi-model-1.19.12.tgz", - "integrity": "sha512-sQaf624rnP/avcIm2Rpt1FOI/ysJzeAHsWudu6JdJbVLl3jc8M8ItRIS9iICyfslkF7CspA+N+4HI8cNTfXcRg==", - "requires": { + "node_modules/ask-smapi-model": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/ask-smapi-model/-/ask-smapi-model-1.23.0.tgz", + "integrity": "sha512-wGpHSvd1qIwqDw5YJPpga0HUFQItoT13LZAm1s4hpCcxY18vwPu5IK6w19syGztWAc2qn4k6fDDhz1UrgPm07A==", + "dependencies": { "ask-sdk-model-runtime": "^1.1.0" } }, - "ask-smapi-sdk": { + "node_modules/ask-smapi-sdk": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ask-smapi-sdk/-/ask-smapi-sdk-1.3.0.tgz", "integrity": "sha512-1mTYkHp9ZzB3l4C9ZVFMKmEw+Ynm0vgQcLunCl6yOc3cxWmiI8QkbjJAs93F28Bg6EPBOTo8UOUtyjFz9vu9LA==", - "requires": { + "dependencies": { "ask-smapi-model": "^1.4.0" } }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - }, - "assertion-error": { + "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 + "dev": true, + "engines": { + "node": "*" + } }, - "astral-regex": { + "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==" + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } }, - "async": { + "node_modules/async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "requires": { + "dependencies": { "lodash": "^4.17.14" } }, - "asynckit": { + "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "atomic-sleep": { + "node_modules/atomic-sleep": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.0.0" + } }, - "available-typed-arrays": { + "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "aws-profile-handler": { + "node_modules/aws-profile-handler": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/aws-profile-handler/-/aws-profile-handler-2.0.3.tgz", "integrity": "sha512-CDArk54zuHtbB13OKXgiwaCGyyH8TJlh+24lI3vw8dD3DpRQtg7uJDjIDZplqIOQqQ6/qdynHf0EjkXdrV1GuA==" }, - "aws-sdk": { - "version": "2.1348.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1348.0.tgz", - "integrity": "sha512-nyqAuSsrvXdDcumC8/a3XGn7Zd7u2ucroz9ZwvNkMC+V6L7pRxnNKzSZDgKw+vCfjrpHFyCsXyribqfNUpolDA==", - "requires": { + "node_modules/aws-sdk": { + "version": "2.1369.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1369.0.tgz", + "integrity": "sha512-DdCQjlhQDi9w8J4moqECrrp9ARWCay0UI38adPSS0GG43gh3bl3OoMlgKJ8aZxi4jUvzE48K9yhFHz4y/mazZw==", + "dependencies": { "buffer": "4.9.2", "events": "1.1.1", "ieee754": "1.1.13", @@ -2165,68 +4400,52 @@ "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", - "xml2js": "0.4.19" - }, - "dependencies": { - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "uuid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==" - } + "xml2js": "0.5.0" + }, + "engines": { + "node": ">= 10.0.0" } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" - }, - "aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + "node_modules/aws-sdk/node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "bin": { + "uuid": "dist/bin/uuid" + } }, - "axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", - "requires": { - "follow-redirects": "^1.14.8" + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "babel-plugin-istanbul": { + "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "babel-preset-current-node-syntax": { + "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, - "requires": { + "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.8.3", @@ -2239,426 +4458,645 @@ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "balanced-match": { + "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==" }, - "base64-js": { + "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==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "requires": { - "tweetnacl": "^0.14.3" - } + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "big-integer": { + "node_modules/big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.6" + } }, - "binary": { + "node_modules/binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", "dev": true, - "requires": { + "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" } }, - "binary-extensions": { + "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } }, - "bl": { + "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { + "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, - "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "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==" + }, + "node_modules/boxen": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.2.tgz", + "integrity": "sha512-1Z4UJabXUP1/R9rLpoU3O2lEMnG3pPLAs/ZD2lF3t2q7qD5lM8rqbtnvtvm4N0wEyNlE+9yZVTVAGmd1V5jabg==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.0", + "chalk": "^5.0.1", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/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 }, - "boxen": { + "node_modules/boxen/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/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==", + "dev": true, + "engines": { + "node": ">=12.20" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/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, "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - } + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "brace-expansion": { + "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==", - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { + "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { + "dependencies": { "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "browser-stdout": { + "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 }, - "browserslist": { + "node_modules/browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, - "requires": { + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { "caniuse-lite": "^1.0.30001449", "electron-to-chromium": "^1.4.284", "node-releases": "^2.0.8", "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "bser": { + "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "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==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, - "buffer-crc32": { + "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } }, - "buffer-from": { + "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==" }, - "buffer-indexof-polyfill": { + "node_modules/buffer-indexof-polyfill": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10" + } }, - "buffers": { + "node_modules/buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.2.0" + } }, - "builtins": { + "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, - "requires": { + "dependencies": { "semver": "^7.0.0" } }, - "bunyan": { + "node_modules/bunyan": { "version": "1.8.15", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", - "requires": { + "engines": [ + "node >=0.10.0" + ], + "bin": { + "bunyan": "bin/bunyan" + }, + "optionalDependencies": { "dtrace-provider": "~0.8", "moment": "^2.19.3", "mv": "~2", "safe-json-stringify": "~1" } }, - "cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "node_modules/cacache": { + "version": "17.0.7", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.7.tgz", + "integrity": "sha512-2GdqQs7hl20V50cB+JEuGeR6YtcNsf1Y9+SP8YXjmGlZz4hM5Ds9s6mKo7e27r6sfF/6MhN4DKRrGldidJJWow==", "dev": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", + "minipass": "^5.0.0", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "ssri": "^10.0.0", "tar": "^6.1.11", - "unique-filename": "^2.0.0" + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.2.tgz", + "integrity": "sha512-Xsa0BcxIC6th9UwNjZkhrMtNo/MnyRL8jGCP+uEwhA5oFOCY1f2s1/oNKY47xQ0Bg5nkjsfAEIej1VeH62bDDQ==", + "dev": true, "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - } + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.0", + "minipass": "^5.0.0", + "path-scurry": "^1.7.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "caching-transform": { + "node_modules/cacache/node_modules/signal-exit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", + "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.10", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.10.tgz", + "integrity": "sha512-v6WB+Epm/qO4Hdlio/sfUn69r5Shgh39SsE9DSd4bIezP0mblOlObI+I0kUEM7J0JFc+I7pSeMeYaOYtX1N/VQ==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, - "requires": { + "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", "package-hash": "^4.0.0", "write-file-atomic": "^3.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/caching-transform/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, "dependencies": { - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "call-bind": { + "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { + "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "call-me-maybe": { + "node_modules/call-me-maybe": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", "dev": true }, - "callsites": { + "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 + "dev": true, + "engines": { + "node": ">=6" + } }, - "camelcase": { + "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "camelcase-keys": { + "node_modules/camelcase-keys": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "caniuse-lite": { - "version": "1.0.30001473", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001473.tgz", - "integrity": "sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==", - "dev": true + "node_modules/caniuse-lite": { + "version": "1.0.30001482", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001482.tgz", + "integrity": "sha512-F1ZInsg53cegyjroxLNW9DmrEQ1SuGRTO1QlpA0o2/6OpQ0gFeDRoq1yFmnr8Sakn9qwwt9DmbxHB6w167OSuQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "caseless": { + "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true }, - "chai": { + "node_modules/chai": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, - "requires": { + "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", "deep-eql": "^4.1.2", @@ -2666,369 +5104,511 @@ "loupe": "^2.3.1", "pathval": "^1.1.1", "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" } }, - "chai-as-promised": { + "node_modules/chai-as-promised": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", "dev": true, - "requires": { + "dependencies": { "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" } }, - "chai-json-schema": { + "node_modules/chai-json-schema": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/chai-json-schema/-/chai-json-schema-1.5.1.tgz", "integrity": "sha512-TR/xPDxRhqwFFCWg1HgL8nNWbpNfUwaib6pBN++QKpnd0t+o3+MBvAn5CM1mpdUMaM76oJAtUjGKdjGad01lIA==", "dev": true, - "requires": { + "dependencies": { "jsonpointer.js": "0.4.0", "tv4": "^1.3.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "chai": ">= 1.6.1 < 5" } }, - "chai-uuid": { + "node_modules/chai-uuid": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/chai-uuid/-/chai-uuid-1.0.6.tgz", "integrity": "sha512-CG0kRk6TqI16ifkoNGLvyb6/Dz8ChE7nsrKCEUXa98ES3nnF3lYDCqXystFXTkH+2233favzkqmCbQT5uW+8iQ==", "dev": true }, - "chainsaw": { + "node_modules/chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", "dev": true, - "requires": { + "dependencies": { "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" } }, - "chalk": { + "node_modules/chalk": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", - "requires": { + "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "chardet": { + "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, - "charset": { + "node_modules/charset": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", - "dev": true + "dev": true, + "engines": { + "node": ">=4.0.0" + } }, - "check-error": { + "node_modules/check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "chokidar": { + "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "chownr": { + "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "ci-info": { + "node_modules/ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true - }, - "cint": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/cint/-/cint-8.2.1.tgz", - "integrity": "sha512-gyWqJHXgDFPNx7PEyFJotutav+al92TTC3dWlMFyTETlOyKBQMZb7Cetqmj3GlrnSILHwSJRwf4mIGzc7C5lXw==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, - "clean-stack": { + "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "cli-cursor": { + "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { + "dependencies": { "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" } }, - "cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==" + "node_modules/cli-spinners": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.8.0.tgz", + "integrity": "sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "cli-table": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", - "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, - "requires": { - "colors": "1.0.3" + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "cli-truncate": { + "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==", - "requires": { + "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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==" + }, + "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==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - } + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "cli-width": { + "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } }, - "cliui": { + "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==", - "requires": { + "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "clone": { + "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" } }, - "code-point-at": { + "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "engines": { + "node": ">=0.10.0" + } }, - "collect-v8-coverage": { + "node_modules/collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, - "color-convert": { + "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==", - "requires": { + "dependencies": { "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "color-name": { + "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==" }, - "color-support": { + "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + "dev": true, + "bin": { + "color-support": "bin.js" + } }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", - "dev": true + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, - "combined-stream": { + "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { + "dependencies": { "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "commander": { + "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } }, - "commondir": { + "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, - "compare-func": { + "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, - "requires": { + "dependencies": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" } }, - "compress-commons": { + "node_modules/compress-commons": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", - "requires": { + "dependencies": { "buffer-crc32": "^0.2.13", "crc32-stream": "^4.0.2", "normalize-path": "^3.0.0", "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" } }, - "compute-gcd": { + "node_modules/compute-gcd": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", "dev": true, - "requires": { + "dependencies": { "validate.io-array": "^1.0.3", "validate.io-function": "^1.0.2", "validate.io-integer-array": "^1.0.0" } }, - "compute-lcm": { + "node_modules/compute-lcm": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", "dev": true, - "requires": { + "dependencies": { "compute-gcd": "^1.2.1", "validate.io-array": "^1.0.3", "validate.io-function": "^1.0.2", "validate.io-integer-array": "^1.0.0" } }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "concat-stream": { + "node_modules/concat-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, - "requires": { + "engines": [ + "node >= 6.0" + ], + "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "dev": true, + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/configstore/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==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "console-control-strings": { + "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, - "content-type": { + "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 + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "conventional-changelog": { + "node_modules/conventional-changelog": { "version": "3.1.25", "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", "dev": true, - "requires": { + "dependencies": { "conventional-changelog-angular": "^5.0.12", "conventional-changelog-atom": "^2.0.8", "conventional-changelog-codemirror": "^2.0.8", @@ -3040,59 +5620,74 @@ "conventional-changelog-jquery": "^3.0.11", "conventional-changelog-jshint": "^2.0.9", "conventional-changelog-preset-loader": "^2.3.4" + }, + "engines": { + "node": ">=10" } }, - "conventional-changelog-angular": { + "node_modules/conventional-changelog-angular": { "version": "5.0.13", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", "dev": true, - "requires": { + "dependencies": { "compare-func": "^2.0.0", "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, - "conventional-changelog-atom": { + "node_modules/conventional-changelog-atom": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", "dev": true, - "requires": { + "dependencies": { "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, - "conventional-changelog-codemirror": { + "node_modules/conventional-changelog-codemirror": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", "dev": true, - "requires": { + "dependencies": { "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, - "conventional-changelog-config-spec": { + "node_modules/conventional-changelog-config-spec": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", "dev": true }, - "conventional-changelog-conventionalcommits": { + "node_modules/conventional-changelog-conventionalcommits": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", "dev": true, - "requires": { + "dependencies": { "compare-func": "^2.0.0", "lodash": "^4.17.15", "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, - "conventional-changelog-core": { + "node_modules/conventional-changelog-core": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", "dev": true, - "requires": { + "dependencies": { "add-stream": "^1.0.0", "conventional-changelog-writer": "^5.0.0", "conventional-commits-parser": "^3.2.0", @@ -3108,172 +5703,219 @@ "read-pkg-up": "^3.0.0", "through2": "^4.0.0" }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "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 - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - } - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/conventional-changelog-core/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "conventional-changelog-ember": { + "node_modules/conventional-changelog-core/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/conventional-changelog-ember": { "version": "2.0.9", "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", "dev": true, - "requires": { + "dependencies": { "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, - "conventional-changelog-eslint": { + "node_modules/conventional-changelog-eslint": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", "dev": true, - "requires": { + "dependencies": { "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, - "conventional-changelog-express": { + "node_modules/conventional-changelog-express": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", "dev": true, - "requires": { + "dependencies": { "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, - "conventional-changelog-jquery": { + "node_modules/conventional-changelog-jquery": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", "dev": true, - "requires": { + "dependencies": { "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, - "conventional-changelog-jshint": { + "node_modules/conventional-changelog-jshint": { "version": "2.0.9", "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", "dev": true, - "requires": { + "dependencies": { "compare-func": "^2.0.0", "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, - "conventional-changelog-preset-loader": { + "node_modules/conventional-changelog-preset-loader": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "conventional-changelog-writer": { + "node_modules/conventional-changelog-writer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", "dev": true, - "requires": { + "dependencies": { "conventional-commits-filter": "^2.0.7", "dateformat": "^3.0.0", "handlebars": "^4.7.7", @@ -3284,45 +5926,61 @@ "split": "^1.0.0", "through2": "^4.0.0" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "conventional-commits-filter": { + "node_modules/conventional-commits-filter": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", "dev": true, - "requires": { + "dependencies": { "lodash.ismatch": "^4.4.0", "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" } }, - "conventional-commits-parser": { + "node_modules/conventional-commits-parser": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", "dev": true, - "requires": { - "JSONStream": "^1.0.4", + "dependencies": { "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", "lodash": "^4.17.15", "meow": "^8.0.0", "split2": "^3.0.0", "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" } }, - "conventional-recommended-bump": { + "node_modules/conventional-recommended-bump": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", "dev": true, - "requires": { + "dependencies": { "concat-stream": "^2.0.0", "conventional-changelog-preset-loader": "^2.3.4", "conventional-commits-filter": "^2.0.7", @@ -3331,20 +5989,26 @@ "git-semver-tags": "^4.1.1", "meow": "^8.0.0", "q": "^1.5.1" + }, + "bin": { + "conventional-recommended-bump": "cli.js" + }, + "engines": { + "node": ">=10" } }, - "convert-source-map": { + "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, - "copyfiles": { + "node_modules/copyfiles": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", "dev": true, - "requires": { + "dependencies": { "glob": "^7.0.5", "minimatch": "^3.0.3", "mkdirp": "^1.0.4", @@ -3353,544 +6017,732 @@ "untildify": "^4.0.0", "yargs": "^16.1.0" }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/copyfiles/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, "dependencies": { - "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, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "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 - } + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/copyfiles/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/copyfiles/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/copyfiles/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/copyfiles/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/copyfiles/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/copyfiles/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, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "core-util-is": { + "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "cosmiconfig": { + "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, - "requires": { + "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" } }, - "cosmiconfig-typescript-loader": { + "node_modules/cosmiconfig-typescript-loader": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-2.0.2.tgz", "integrity": "sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==", "dev": true, - "requires": { + "dependencies": { "cosmiconfig": "^7", "ts-node": "^10.8.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "typescript": ">=3" } }, - "crc-32": { + "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } }, - "crc32-stream": { + "node_modules/crc32-stream": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "requires": { + "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" } }, - "create-require": { + "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 }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "node_modules/cross-fetch": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", + "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", "dev": true, - "requires": { - "node-fetch": "2.6.7" - }, "dependencies": { - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - } + "node-fetch": "^2.6.11" } }, - "cross-spawn": { + "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==", - "requires": { + "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true + "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==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "dargs": { + "node_modules/dargs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "requires": { - "assert-plus": "^1.0.0" + "dev": true, + "engines": { + "node": ">=8" } }, - "date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } }, - "dateformat": { + "node_modules/dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "debug": { + "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { + "dependencies": { "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "decamelize": { + "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "decamelize-keys": { + "node_modules/decamelize-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, - "requires": { + "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "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, - "requires": { - "mimic-response": "^1.0.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "deep-eql": { + "node_modules/deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, - "requires": { + "dependencies": { "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" } }, - "deep-extend": { + "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4.0.0" + } }, - "default-require-extensions": { + "node_modules/default-require-extensions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, - "requires": { + "dependencies": { "strip-bom": "^4.0.0" }, - "dependencies": { - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - } + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "defaults": { + "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "requires": { + "dependencies": { "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } }, - "define-lazy-prop": { + "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } }, - "delayed-stream": { + "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } }, - "delegates": { + "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, - "depd": { + "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "detect-indent": { + "node_modules/detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "detect-newline": { + "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } }, - "diff-sequences": { + "node_modules/diff-sequences": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } }, - "dir-glob": { + "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==", "dev": true, - "requires": { + "dependencies": { "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "dot-prop": { + "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, - "requires": { + "dependencies": { "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "dotgitignore": { + "node_modules/dotgitignore": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", "dev": true, - "requires": { + "dependencies": { "find-up": "^3.0.0", "minimatch": "^3.0.4" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "dtrace-provider": { + "node_modules/dotgitignore/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/dtrace-provider": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", + "hasInstallScript": true, "optional": true, - "requires": { + "dependencies": { "nan": "^2.14.0" + }, + "engines": { + "node": ">=0.10" } }, - "duplexer2": { + "node_modules/duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, - "requires": { + "dependencies": { "readable-stream": "^2.0.2" - }, + } + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "eastasianwidth": { + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "electron-to-chromium": { - "version": "1.4.348", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.348.tgz", - "integrity": "sha512-gM7TdwuG3amns/1rlgxMbeeyNoBFPa+4Uu0c7FeROWh4qWmvSOnvcslKmWy51ggLKZ2n/F/4i2HJ+PVNxH9uCQ==", + "node_modules/electron-to-chromium": { + "version": "1.4.378", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.378.tgz", + "integrity": "sha512-RfCD26kGStl6+XalfX3DGgt3z2DNwJS5DKRHCpkPq5T/PqpZMPB1moSRXuK9xhkt/sF57LlpzJgNoYl7mO7Z6w==", "dev": true }, - "elegant-spinner": { + "node_modules/elegant-spinner": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==" + "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", + "engines": { + "node": ">=0.10.0" + } }, - "emoji-regex": { + "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==" }, - "encoding": { + "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "optional": true, - "requires": { + "dependencies": { "iconv-lite": "^0.6.2" - }, + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "end-of-stream": { + "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { + "dependencies": { "once": "^1.4.0" } }, - "env-paths": { + "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==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "err-code": { + "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, - "error-ex": { + "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, - "requires": { + "dependencies": { "is-arrayish": "^0.2.1" } }, - "es6-error": { + "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "escalade": { + "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "escape-string-regexp": { + "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==" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } }, - "esprima": { + "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "events": { + "node_modules/events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==" + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "engines": { + "node": ">=0.4.x" + } }, - "execa": { + "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { + "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", @@ -3900,361 +6752,486 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "expect": { + "node_modules/expect": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", "dev": true, - "requires": { + "dependencies": { "@jest/expect-utils": "^28.1.3", "jest-get-type": "^28.0.2", "jest-matcher-utils": "^28.1.3", "jest-message-util": "^28.1.3", "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "external-editor": { + "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "requires": { + "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - } + "engines": { + "node": ">=4" } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } }, - "fast-deep-equal": { + "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==" }, - "fast-glob": { + "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, - "requires": { + "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" } }, - "fast-json-stable-stringify": { + "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==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, - "fast-memoize": { + "node_modules/fast-memoize": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", "dev": true }, - "fast-redact": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", - "dev": true + "node_modules/fast-redact": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz", + "integrity": "sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "fast-safe-stringify": { + "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true }, - "fast-xml-parser": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz", - "integrity": "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==", - "dev": true, - "requires": { - "strnum": "^1.0.4" + "node_modules/fast-xml-parser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz", + "integrity": "sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg==", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" } }, - "fastestsmallesttextencoderdecoder": { + "node_modules/fastestsmallesttextencoderdecoder": { "version": "1.0.22", "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", "dev": true }, - "fastq": { + "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, - "requires": { + "dependencies": { "reusify": "^1.0.4" } }, - "fb-watchman": { + "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, - "requires": { + "dependencies": { "bser": "2.1.1" } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "figures": { + "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { + "dependencies": { "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "file-type": { + "node_modules/file-type": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "fill-keys": { + "node_modules/fill-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", "integrity": "sha512-tcgI872xXjwFF4xgQmLxi76GnwJG3g/3isB1l4/G5Z4zrbddGpBjqZCO9oEAcB5wX0Hj/5iQB3toxfO7in1hHA==", "dev": true, - "requires": { + "dependencies": { "is-object": "~1.0.1", "merge-descriptors": "~1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "fill-range": { + "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { + "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "find-cache-dir": { + "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, - "requires": { + "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "find-package-json": { + "node_modules/find-package-json": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/find-package-json/-/find-package-json-1.2.0.tgz", "integrity": "sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==", "dev": true }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "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, - "requires": { - "locate-path": "^5.0.0", + "dependencies": { + "locate-path": "^6.0.0", "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "flat": { + "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true + "dev": true, + "bin": { + "flat": "cli.js" + } }, - "flatstr": { + "node_modules/flatstr": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==", "dev": true }, - "fnv-plus": { + "node_modules/fnv-plus": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/fnv-plus/-/fnv-plus-1.3.1.tgz", "integrity": "sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw==", "dev": true }, - "folder-hash": { + "node_modules/folder-hash": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/folder-hash/-/folder-hash-4.0.4.tgz", "integrity": "sha512-zEyYH+UsHEfJJcCRSf9ai5I4CTZwZ8ObONRuEI5hcEmJY5pS0FUWKruX9mMnYJrgC7MlPFDYnGsK1R+WFYjLlQ==", - "requires": { + "dependencies": { "debug": "^4.3.3", "minimatch": "~5.1.2" }, + "bin": { + "folder-hash": "bin/folder-hash" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/folder-hash/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==", "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "requires": { - "brace-expansion": "^2.0.1" - } - } + "balanced-match": "^1.0.0" + } + }, + "node_modules/folder-hash/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "follow-redirects": { + "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } }, - "for-each": { + "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==", - "requires": { + "dependencies": { "is-callable": "^1.1.3" } }, - "foreach": { + "node_modules/foreach": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", "dev": true }, - "foreground-child": { + "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, - "requires": { + "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, - "format-util": { + "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, + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format-util": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", "dev": true }, - "fp-and-or": { + "node_modules/fp-and-or": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.3.tgz", "integrity": "sha512-wJaE62fLaB3jCYvY2ZHjZvmKK2iiLiiehX38rz5QZxtdN8fVPJDeZUiVvJrHStdTc+23LHlyZuSEKgFc0pxi2g==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "fp-ts": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.13.1.tgz", - "integrity": "sha512-0eu5ULPS2c/jsa1lGFneEFFEdTbembJv8e4QKXeVJ3lm/5hyve06dlKZrpxmMwJt6rYen7sxmHHK2CLaXvWuWQ==", + "node_modules/fp-ts": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.15.0.tgz", + "integrity": "sha512-3o6EllAvGuCsDgjM+frscLKDRPR9pqbrg13tJ13z86F4eni913kBV8h85rM6zpu2fEvJ8RWA0ouYlUWwHEmxTg==", "dev": true }, - "fromentries": { + "node_modules/fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "fs-constants": { + "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, - "fs-extra": { + "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "requires": { + "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "node_modules/fs-minipass": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", + "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", "dev": true, - "requires": { - "minipass": "^3.0.0" + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "fs.realpath": { + "node_modules/fs-minipass/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==" }, - "fsevents": { + "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "fstream": { + "node_modules/fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", "mkdirp": ">=0.5 0", "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "function-bind": { + "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "gauge": { + "node_modules/gauge": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, - "requires": { + "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", "console-control-strings": "^1.1.0", @@ -4263,987 +7240,1317 @@ "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "gensync": { + "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "get-caller-file": { + "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==" + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, - "get-func-name": { + "node_modules/get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "get-intrinsic": { + "node_modules/get-intrinsic": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "requires": { + "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "dependencies": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "get-pkg-repo": "src/cli.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-pkg-repo/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/get-pkg-repo/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/get-pkg-repo/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true + "node_modules/get-pkg-repo/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } }, - "get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "node_modules/get-pkg-repo/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "requires": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, "dependencies": { - "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, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "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 - } + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "get-stdin": { + "node_modules/get-stdin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "get-stream": { + "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==" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "requires": { - "assert-plus": "^1.0.0" + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "git-raw-commits": { + "node_modules/git-raw-commits": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", "dev": true, - "requires": { + "dependencies": { "dargs": "^7.0.0", "lodash": "^4.17.15", "meow": "^8.0.0", "split2": "^3.0.0", "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" } }, - "git-remote-origin-url": { + "node_modules/git-remote-origin-url": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", "dev": true, - "requires": { + "dependencies": { "gitconfiglocal": "^1.0.0", "pify": "^2.3.0" }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - } + "engines": { + "node": ">=4" + } + }, + "node_modules/git-remote-origin-url/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "git-semver-tags": { + "node_modules/git-semver-tags": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", "dev": true, - "requires": { + "dependencies": { "meow": "^8.0.0", "semver": "^6.0.0" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "bin": { + "git-semver-tags": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-semver-tags/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "gitconfiglocal": { + "node_modules/gitconfiglocal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", "dev": true, - "requires": { + "dependencies": { "ini": "^1.3.2" } }, - "glob": { + "node_modules/gitconfiglocal/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { + "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==", - "requires": { + "dependencies": { "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "global-dirs": { + "node_modules/global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, - "requires": { + "dependencies": { "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" } }, - "globals": { + "node_modules/global-dirs/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "globby": { + "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "requires": { + "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "gopd": { + "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { + "dependencies": { "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } + "node_modules/got": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", + "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "graceful-fs": { + "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==" }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "handlebars": { + "node_modules/handlebars": { "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, - "requires": { + "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.0", "source-map": "^0.6.1", - "uglify-js": "^3.1.4", "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "handler-agent": { + "node_modules/handler-agent": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/handler-agent/-/handler-agent-0.2.0.tgz", "integrity": "sha512-cUduQxa5p3TFtGmb55mrRbkk/3EJCsLSeFrCIuTakQHQlYVWXeW2L9IUQUHyoHLI4UgpBNaN2JrZ0He1jPu+vg==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - } - } - }, - "hard-rejection": { + "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "has": { + "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { + "dependencies": { "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" } }, - "has-ansi": { + "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "requires": { + "dependencies": { "ansi-regex": "^2.0.0" }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" - } + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" } }, - "has-flag": { + "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==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } }, - "has-symbols": { + "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==" + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "has-tostringtag": { + "node_modules/has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { + "dependencies": { "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "has-unicode": { + "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "hasha": { + "node_modules/hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, - "requires": { + "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" } }, - "he": { + "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 + "dev": true, + "bin": { + "he": "bin/he" + } }, - "hosted-git-info": { + "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "requires": { + "dependencies": { "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "html-escaper": { + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "http-cache-semantics": { + "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 }, - "http-proxy-agent": { + "node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, - "requires": { + "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" + }, + "engines": { + "node": ">= 6" } }, - "http-reasons": { + "node_modules/http-reasons": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", "dev": true }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/http2-wrapper/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "https-proxy-agent": { + "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, - "requires": { + "dependencies": { "agent-base": "6", "debug": "4" + }, + "engines": { + "node": ">= 6" } }, - "human-signals": { + "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } }, - "humanize-ms": { + "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, - "requires": { + "dependencies": { "ms": "^2.0.0" } }, - "husky": { + "node_modules/husky": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", - "dev": true + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } }, - "iconv-lite": { + "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "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==" }, - "ignore": { + "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4" + } }, - "ignore-by-default": { + "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" }, - "ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "node_modules/ignore-walk": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", "dev": true, - "requires": { - "minimatch": "^5.0.1" + "dependencies": { + "minimatch": "^9.0.0" }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/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==", + "dev": true, "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "immutable": { + "node_modules/immutable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==" }, - "import-fresh": { + "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, - "requires": { + "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "dev": true + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "imurmurhash": { + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.19" + } }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", + "engines": { + "node": ">=4" + } }, - "infer-owner": { + "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true }, - "inflight": { + "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==", - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "node_modules/ini": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.0.tgz", + "integrity": "sha512-HLR38RSF2iulAzc3I/sma4CoYxQP844rPYCNfzGDOHqa/YqVlwuuZgBx6M50/X8dKgzk0cm1qRg3+47mK2N+cQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "inquirer": { + "node_modules/inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", - "requires": { + "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/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==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" + "wcwidth": "^1.0.1" }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - } + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "insync": { + "node_modules/insync": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/insync/-/insync-2.1.1.tgz", "integrity": "sha512-UzUhOZFpCMM22Xlig9iUPqalf8n7c4eYScamce1C+jN3ad8FtmVm42ryMwVq0hAxHbwUhWFhPvTFQQpFdDUKkw==", "dev": true }, - "io-ts": { + "node_modules/io-ts": { "version": "2.2.20", "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-2.2.20.tgz", "integrity": "sha512-Rq2BsYmtwS5vVttie4rqrOCIfHCS9TgpRLFpKQCM1wZBBRY9nWVGmEvm2FnDbSE2un1UE39DvFpTR5UL47YDcA==", - "dev": true + "dev": true, + "peerDependencies": { + "fp-ts": "^2.5.0" + } }, - "ip": { + "node_modules/ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, - "is-arguments": { + "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==", - "requires": { + "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-arrayish": { + "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 }, - "is-binary-path": { + "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==", - "requires": { + "dependencies": { "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-callable": { + "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==" + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, - "requires": { - "ci-info": "^2.0.0" - }, "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - } + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" } }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "requires": { + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dependencies": { "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-docker": { + "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==" + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-generator-function": { + "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==", - "requires": { + "dependencies": { "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-glob": { + "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==", - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-installed-globally": { + "node_modules/is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dev": true, - "requires": { + "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally/node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, "dependencies": { - "global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "requires": { - "ini": "2.0.0" - } - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - } + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" } }, - "is-interactive": { + "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } }, - "is-lambda": { + "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-number": { + "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==" + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } }, - "is-number-like": { + "node_modules/is-number-like": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "requires": { + "dependencies": { "lodash.isfinite": "^3.3.2" } }, - "is-obj": { + "node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-object": { + "node_modules/is-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", - "dev": true + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "is-observable": { + "node_modules/is-observable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", - "requires": { + "dependencies": { "symbol-observable": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "is-path-inside": { + "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 + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-plain-obj": { + "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-promise": { + "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, - "is-stream": { + "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==" + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-text-path": { + "node_modules/is-text-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "dev": true, - "requires": { + "dependencies": { "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-typed-array": { + "node_modules/is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "requires": { + "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-typedarray": { + "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, - "is-unicode-supported": { + "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==" + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-windows": { + "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-wsl": { + "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==", - "requires": { + "dependencies": { "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "dev": true, + "engines": { + "node": ">=12" + } }, - "isarray": { + "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "isomorphic-fetch": { + "node_modules/isomorphic-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", "dev": true, - "requires": { + "dependencies": { "node-fetch": "^2.6.1", "whatwg-fetch": "^3.4.1" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "istanbul-lib-coverage": { + "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "istanbul-lib-hook": { + "node_modules/istanbul-lib-hook": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, - "requires": { + "dependencies": { "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "istanbul-lib-instrument": { + "node_modules/istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "istanbul-lib-processinfo": { + "node_modules/istanbul-lib-processinfo": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, - "requires": { + "dependencies": { "archy": "^1.0.0", "cross-spawn": "^7.0.3", "istanbul-lib-coverage": "^3.2.0", @@ -5251,115 +8558,247 @@ "rimraf": "^3.0.0", "uuid": "^8.3.2" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, "dependencies": { - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "istanbul-lib-report": { + "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, - "requires": { + "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "istanbul-lib-source-maps": { + "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" } }, - "istanbul-reports": { + "node_modules/istanbul-reports": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, - "requires": { + "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.1.4.tgz", + "integrity": "sha512-7CGd4ZQu5M/FgQLlcgcsY858wf+ukg1ma5M95FACSfC54+88vm594Nv6C3NqWfk8wyK1u+E3SzvVsxr7bwONmg==", + "dev": true, + "dependencies": { + "cliui": "github:isaacs/cliui#isaacs/esm-cjs-consistency" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jackspeak/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jackspeak/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jackspeak/node_modules/cliui": { + "version": "8.0.1", + "resolved": "git+ssh://git@github.com/isaacs/cliui.git#9f97090165675fdda63a79c29bc36bb1033506b0", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jackspeak/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/jackspeak/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jackspeak/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jackspeak/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, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "jest-diff": { + "node_modules/jest-diff": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^28.1.1", "jest-get-type": "^28.0.2", "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "jest-get-type": { + "node_modules/jest-get-type": { "version": "28.0.2", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } }, - "jest-haste-map": { + "node_modules/jest-haste-map": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^28.1.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^28.0.2", "jest-util": "^28.1.3", "jest-worker": "^28.1.3", "micromatch": "^4.0.4", "walker": "^1.0.8" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "jest-matcher-utils": { + "node_modules/jest-matcher-utils": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.0.0", "jest-diff": "^28.1.3", "jest-get-type": "^28.0.2", "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "jest-message-util": { + "node_modules/jest-message-util": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^28.1.3", "@types/stack-utils": "^2.0.0", @@ -5369,20 +8808,26 @@ "pretty-format": "^28.1.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "jest-regex-util": { + "node_modules/jest-regex-util": { "version": "28.0.2", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } }, - "jest-snapshot": { + "node_modules/jest-snapshot": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", "dev": true, - "requires": { + "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", @@ -5406,378 +8851,392 @@ "natural-compare": "^1.4.0", "pretty-format": "^28.1.3", "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "jest-util": { + "node_modules/jest-util": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", "dev": true, - "requires": { + "dependencies": { "@jest/types": "^28.1.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "jest-worker": { + "node_modules/jest-worker": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "jju": { + "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, - "jmespath": { + "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==" + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "engines": { + "node": ">= 0.6.0" + } }, - "js-tokens": { + "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 }, - "js-yaml": { + "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==", - "requires": { + "dependencies": { "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "jsesc": { + "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "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 }, - "json-parse-better-errors": { + "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 }, - "json-parse-even-better-errors": { + "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 }, - "json-parse-helpfulerror": { + "node_modules/json-parse-helpfulerror": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", "dev": true, - "requires": { + "dependencies": { "jju": "^1.1.0" } }, - "json-pointer": { + "node_modules/json-pointer": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", "dev": true, - "requires": { + "dependencies": { "foreach": "^2.0.4" } }, - "json-promise": { + "node_modules/json-promise": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/json-promise/-/json-promise-1.1.8.tgz", "integrity": "sha512-rz31P/7VfYnjQFrF60zpPTT0egMPlc8ZvIQHWs4ZtNZNnAXRmXo6oS+6eyWr5sEMG03OVhklNrTXxiIRYzoUgQ==", "dev": true, - "requires": { - "bluebird": "*" - }, "dependencies": { - "bluebird": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.2.2.tgz", - "integrity": "sha512-NqzuS2y44FmP++Ihv6/PgXpNRB+c282TKq0URBTQdA+EqPpR1Qu44QY8H8667LA39iOIaVHpmRPI4gpthYT8Ug==", - "dev": true - } + "bluebird": "*" } }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-compare": { + "node_modules/json-schema-compare": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", "dev": true, - "requires": { + "dependencies": { "lodash": "^4.17.4" } }, - "json-schema-faker": { + "node_modules/json-schema-faker": { "version": "0.5.0-rcv.40", "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.0-rcv.40.tgz", "integrity": "sha512-BczZvu03jKrGh3ovCWrHusiX6MwiaKK2WZeyomKBNA8Nm/n7aBYz0mub1CnONB6cgxOZTNxx4afNmLblbUmZbA==", "dev": true, - "requires": { + "dependencies": { "json-schema-ref-parser": "^6.1.0", "jsonpath-plus": "^5.1.0" + }, + "bin": { + "jsf": "bin/gen.js" } }, - "json-schema-ref-parser": { + "node_modules/json-schema-ref-parser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==", + "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", "dev": true, - "requires": { + "dependencies": { "call-me-maybe": "^1.0.1", "js-yaml": "^3.12.1", "ono": "^4.0.11" - }, + } + }, + "node_modules/json-schema-ref-parser/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } + "sprintf-js": "~1.0.2" + } + }, + "node_modules/json-schema-ref-parser/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "json-schema-traverse": { + "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==" }, - "json-stringify-safe": { + "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true }, - "json5": { + "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, - "jsonc-parser": { + "node_modules/jsonc-parser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==", "dev": true }, - "jsonfile": { + "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", + "dependencies": { "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "jsonlines": { + "node_modules/jsonlines": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==", "dev": true }, - "jsonparse": { + "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true + "dev": true, + "engines": [ + "node >= 0.2.0" + ] }, - "jsonpath-plus": { + "node_modules/jsonpath-plus": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-5.1.0.tgz", "integrity": "sha512-890w2Pjtj0iswAxalRlt2kHthi6HKrXEfZcn+ZNZptv7F3rUGIeDuZo+C+h4vXBHLEsVjJrHeCm35nYeZLzSBQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=10.0.0" + } }, - "jsonpointer.js": { + "node_modules/jsonpointer.js": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/jsonpointer.js/-/jsonpointer.js-0.4.0.tgz", "integrity": "sha512-2bf/1crAmPpsmj1I6rDT6W0SOErkrNBpb555xNWcMVWYrX6VnXpG0GRMQ2shvOHwafpfse8q0gnzPFYVH6Tqdg==", "dev": true }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" } }, - "just-extend": { + "node_modules/just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "dev": true, - "requires": { - "json-buffer": "3.0.0" + "dependencies": { + "json-buffer": "3.0.1" } }, - "kind-of": { + "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", "dev": true, - "requires": { - "package-json": "^6.3.0" + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "lazystream": { + "node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "requires": { + "dependencies": { "readable-stream": "^2.0.5" }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "libnpmconfig": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/libnpmconfig/-/libnpmconfig-1.2.1.tgz", - "integrity": "sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "find-up": "^3.0.0", - "ini": "^1.3.5" - }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } + "safe-buffer": "~5.1.0" } }, - "lilconfig": { + "node_modules/lilconfig": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==" + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "engines": { + "node": ">=10" + } }, - "lines-and-columns": { + "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 }, - "lint-staged": { + "node_modules/lint-staged": { "version": "12.5.0", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-12.5.0.tgz", "integrity": "sha512-BKLUjWDsKquV/JuIcoQW4MSAI3ggwEImF1+sB4zaKvyVx1wBk3FsG7UK9bpnmBTN1pm7EH2BBcMwINJzCRv12g==", - "requires": { + "dependencies": { "cli-truncate": "^3.1.0", "colorette": "^2.0.16", "commander": "^9.3.0", @@ -5793,36 +9252,55 @@ "supports-color": "^9.2.2", "yaml": "^1.10.2" }, - "dependencies": { - "commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==" - }, - "supports-color": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.3.1.tgz", - "integrity": "sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==" - } + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/lint-staged/node_modules/supports-color": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.3.1.tgz", + "integrity": "sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "liquid-json": { + "node_modules/liquid-json": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "listenercount": { + "node_modules/listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", "dev": true }, - "listr": { + "node_modules/listr": { "version": "0.14.3", "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", - "requires": { + "dependencies": { "@samverschueren/stream-to-observable": "^0.3.0", "is-observable": "^1.1.0", "is-promise": "^2.1.0", @@ -5833,42 +9311,23 @@ "p-map": "^2.0.0", "rxjs": "^6.3.3" }, - "dependencies": { - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "engines": { + "node": ">=6" } }, - "listr-silent-renderer": { + "node_modules/listr-silent-renderer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==" + "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==", + "engines": { + "node": ">=4" + } }, - "listr-update-renderer": { + "node_modules/listr-update-renderer": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", - "requires": { + "dependencies": { "chalk": "^1.1.3", "cli-truncate": "^0.2.1", "elegant-spinner": "^1.0.1", @@ -5878,286 +9337,276 @@ "log-update": "^2.3.0", "strip-ansi": "^3.0.1" }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "listr": "^0.14.2" + } + }, + "node_modules/listr-update-renderer/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", - "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", - "requires": { - "chalk": "^1.0.0" - } - }, - "log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", - "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" - }, - "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - } + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", + "dependencies": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", + "dependencies": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "listr-verbose-renderer": { + "node_modules/listr-update-renderer/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/listr-verbose-renderer": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", - "requires": { + "dependencies": { "chalk": "^2.4.1", "cli-cursor": "^2.1.0", "date-fns": "^1.27.2", "figures": "^2.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "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==" - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/listr-verbose-renderer/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/listr-verbose-renderer/node_modules/date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" + }, + "node_modules/listr-verbose-renderer/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" } }, - "listr2": { + "node_modules/listr/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/listr2": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", - "requires": { + "dependencies": { "cli-truncate": "^2.1.0", "colorette": "^2.0.16", "log-update": "^4.0.0", @@ -6167,243 +9616,484 @@ "through": "^2.3.8", "wrap-ansi": "^7.0.0" }, - "dependencies": { - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true } } }, - "load-json-file": { + "node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/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, "dependencies": { - "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, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/load-json-file/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, - "requires": { - "p-locate": "^4.1.0" + "engines": { + "node": ">=4" } }, - "lodash": { + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.camelcase": { + "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, - "lodash.defaults": { + "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, - "lodash.difference": { + "node_modules/lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" }, - "lodash.flatten": { + "node_modules/lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" }, - "lodash.flattendeep": { + "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, - "lodash.get": { + "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 }, - "lodash.isequalwith": { + "node_modules/lodash.isequalwith": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.isequalwith/-/lodash.isequalwith-4.4.0.tgz", "integrity": "sha512-dcZON0IalGBpRmJBmMkaoV7d3I80R2O+FrzsZyHdNSFrANq/cgDqKQNmAHE8UEj4+QYWwwhkQOVdLHiAopzlsQ==", "dev": true }, - "lodash.isfinite": { + "node_modules/lodash.isfinite": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==" }, - "lodash.ismatch": { + "node_modules/lodash.ismatch": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "dev": true }, - "lodash.isplainobject": { + "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" }, - "lodash.pick": { + "node_modules/lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", "dev": true }, - "lodash.pickby": { + "node_modules/lodash.pickby": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", "integrity": "sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==", "dev": true }, - "lodash.union": { + "node_modules/lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" }, - "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==", - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "node_modules/log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", + "dependencies": { + "chalk": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/log-symbols/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/log-symbols/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", + "dependencies": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" } }, - "log-update": { + "node_modules/log-update/node_modules/strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", "dependencies": { - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "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==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" } }, - "loupe": { + "node_modules/loupe": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", "dev": true, - "requires": { + "dependencies": { "get-func-name": "^2.0.0" } }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "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, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" } }, - "make-dir": { + "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "requires": { + "dependencies": { "semver": "^6.0.0" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "make-error": { + "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 }, - "make-fetch-happen": { + "node_modules/make-fetch-happen": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, - "requires": { + "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^16.1.0", "http-cache-semantics": "^4.1.0", @@ -6421,42 +10111,230 @@ "socks-proxy-agent": "^7.0.0", "ssri": "^9.0.0" }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/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==", + "dev": true, "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - } + "balanced-match": "^1.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/make-fetch-happen/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/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, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "makeerror": { + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, - "requires": { + "dependencies": { "tmpl": "1.0.5" } }, - "map-obj": { + "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "media-typer": { + "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "meow": { + "node_modules/meow": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, - "requires": { + "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", "decamelize-keys": "^1.1.0", @@ -6469,391 +10347,438 @@ "type-fest": "^0.18.0", "yargs-parser": "^20.2.3" }, - "dependencies": { - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "merge-descriptors": { + "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, - "merge-stream": { + "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==" }, - "merge2": { + "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "micri": { + "node_modules/micri": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/micri/-/micri-4.5.1.tgz", "integrity": "sha512-AtvnSBGFglNr+iqs5gufpHT9xRXUabgu9vYEnQYPXSBs+nLSBvmUS5Mzg+3LJ9eQBrNA1o5M49WeqiX1f+d2sg==", "dev": true, - "requires": { + "dependencies": { "handler-agent": "0.2.0" + }, + "engines": { + "node": ">= 12.0.0" } }, - "micromatch": { + "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "requires": { + "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } }, - "mime-format": { + "node_modules/mime-format": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz", "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==", "dev": true, - "requires": { + "dependencies": { "charset": "^1.0.0" } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { + "dependencies": { "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { + "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==" + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true + "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, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "min-indent": { + "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "minimatch": { + "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "devOptional": true }, - "minimist-options": { + "node_modules/minimist-options": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, - "requires": { + "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" } }, - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true, - "requires": { - "yallist": "^4.0.0" + "engines": { + "node": ">=8" } }, - "minipass-collect": { + "node_modules/minipass-collect": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, - "requires": { + "dependencies": { "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "minipass-fetch": { + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-fetch": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, - "requires": { - "encoding": "^0.1.13", + "dependencies": { "minipass": "^3.1.6", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "minipass-flush": { + "node_modules/minipass-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, - "requires": { + "dependencies": { "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "minipass-json-stream": { + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-json-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", "dev": true, - "requires": { + "dependencies": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" } }, - "minipass-pipeline": { + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, - "requires": { + "dependencies": { "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "minipass-sized": { + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-sized": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, - "requires": { + "dependencies": { "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "minizlib": { + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, - "requires": { + "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "mkdirp": { + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { + "devOptional": true, + "dependencies": { "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", + "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", - "debug": "4.3.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", "glob": "7.2.0", - "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "4.2.1", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.1", + "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, - "dependencies": { - "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, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "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==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "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 - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - } + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "mocha-chai-jest-snapshot": { + "node_modules/mocha-chai-jest-snapshot": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/mocha-chai-jest-snapshot/-/mocha-chai-jest-snapshot-1.1.4.tgz", "integrity": "sha512-ybwtS10P8BXDJQn9B3QyQA8Lxr/CcYxtuyWKk1PxD9vJorH8VL3edB7re4GcG9dRAdDPE/B0BsfwmCo6W43O7w==", "dev": true, - "requires": { + "dependencies": { "@jest/test-result": "^28.1.1", "chalk": "^4.1.2", "find-package-json": "^1.2.0", @@ -6862,164 +10787,408 @@ "slash": "^3.0.0", "yargs": "^17.5.1" }, + "peerDependencies": { + "chai": "^4.3.6" + } + }, + "node_modules/mocha-chai-jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/mocha.parallel": { + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/mocha.parallel/-/mocha.parallel-0.15.6.tgz", + "integrity": "sha512-pWph+QieKGjk7cHY2hB78wyKJDOQLyOMDuBLQLrFL7riJb8qbQBlCY3XztFHv0D1d4I1gCpiwFNjd4LhVOXPew==", + "dev": true, + "dependencies": { + "bluebird": "^2.9.34", + "semaphore": "^1.0.5" + }, + "peerDependencies": { + "mocha": ">=2.2.5" + } + }, + "node_modules/mocha.parallel/node_modules/bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==", + "dev": true + }, + "node_modules/mocha/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/mocha/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/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, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/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, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/minimatch/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==", + "dev": true, "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } + "balanced-match": "^1.0.0" } }, - "mocha.parallel": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/mocha.parallel/-/mocha.parallel-0.15.6.tgz", - "integrity": "sha512-pWph+QieKGjk7cHY2hB78wyKJDOQLyOMDuBLQLrFL7riJb8qbQBlCY3XztFHv0D1d4I1gCpiwFNjd4LhVOXPew==", + "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 + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "requires": { - "bluebird": "^2.9.34", - "semaphore": "^1.0.5" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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, "dependencies": { - "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==", - "dev": true - } + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "modify-values": { + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/modify-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "module-not-found-error": { + "node_modules/module-not-found-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", "integrity": "sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g==", "dev": true }, - "moment": { + "node_modules/moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "optional": true + "optional": true, + "engines": { + "node": "*" + } }, - "ms": { + "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==" }, - "mustache": { + "node_modules/mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==" + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } }, - "mute-stream": { + "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, - "mv": { + "node_modules/mv": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", "optional": true, - "requires": { + "dependencies": { "mkdirp": "~0.5.1", "ncp": "~2.0.0", "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" } }, - "nan": { + "node_modules/nan": { "version": "2.17.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", "optional": true }, - "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } }, - "natural-compare": { + "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 }, - "ncp": { + "node_modules/ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==" + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "devOptional": true, + "bin": { + "ncp": "bin/ncp" + } }, - "negotiator": { + "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "neo-async": { + "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "nise": { + "node_modules/nise": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "^10.0.2", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" - }, + } + }, + "node_modules/nise/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, "dependencies": { - "@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, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0" - } - } + "type-detect": "4.0.8" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0" } }, - "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dev": true, - "requires": { + "dependencies": { "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node-gyp": { + "node_modules/node-gyp": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", "dev": true, - "requires": { + "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.6", @@ -7031,53 +11200,42 @@ "tar": "^6.1.2", "which": "^2.0.2" }, - "dependencies": { - "nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "requires": { - "abbrev": "^1.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" } }, - "node-int64": { + "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "node-preload": { + "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, - "requires": { + "dependencies": { "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "node-releases": { + "node_modules/node-releases": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, - "nodemon": { + "node_modules/nodemon": { "version": "2.0.22", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", - "requires": { + "dependencies": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", @@ -7089,437 +11247,589 @@ "touch": "^3.1.0", "undefsafe": "^2.0.5" }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "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==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "noms": { + "node_modules/noms": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", "dev": true, - "requires": { + "dependencies": { "inherits": "^2.0.1", "readable-stream": "~1.0.31" - }, + } + }, + "node_modules/noms/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/noms/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "requires": { - "abbrev": "1" + "node_modules/noms/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "normalize-package-data": { + "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "requires": { + "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" } }, - "normalize-path": { + "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==" + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true + "node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "npm-bundle": { + "node_modules/npm-bundle": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/npm-bundle/-/npm-bundle-3.0.3.tgz", "integrity": "sha512-fHF7FR32YNgjqi0MQMLnE78Ff9/wYd4/7/Cke3dLLi2QzETKotIiWGCxwDoXAZDWVoTuVRYQa2ZdiZPuBL7QnA==", "dev": true, - "requires": { + "dependencies": { "glob": "^6.0.1", "insync": "^2.1.1", "mkdirp": "^0.5.1", "ncp": "^2.0.0", "rimraf": "^2.4.4" }, + "bin": { + "npm-bundle": "bin/cli.js" + } + }, + "node_modules/npm-bundle/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "dev": true, "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" } }, - "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "node_modules/npm-bundle/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/npm-bundle/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==", "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, "dependencies": { - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - } + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "npm-check-updates": { - "version": "12.5.12", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-12.5.12.tgz", - "integrity": "sha512-JAFs+kKokZmYPRzhSHgIpKashX6vSGGXYo0VJXNaKV/nLnq3ZKI0nTVou9OwTix+PFfLAWTEJ6T/byGxkDlhWA==", + "node_modules/npm-check-updates": { + "version": "16.10.9", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.10.9.tgz", + "integrity": "sha512-J3ggasYJIFB+XqAT9qQcAAOKehpCXGRoZWlK4/u5YAOZB6hmM4CxdrxCA7A34hBK5zaPIEBnMqWBSV7mU6nixg==", "dev": true, - "requires": { - "chalk": "^4.1.2", - "cint": "^8.2.1", - "cli-table": "^0.3.11", - "commander": "^9.1.0", + "dependencies": { + "chalk": "^5.2.0", + "cli-table3": "^0.6.3", + "commander": "^10.0.0", "fast-memoize": "^2.5.2", "find-up": "5.0.0", "fp-and-or": "^0.1.3", "get-stdin": "^8.0.0", "globby": "^11.0.4", - "hosted-git-info": "^5.0.0", + "hosted-git-info": "^5.1.0", + "ini": "^4.0.0", + "js-yaml": "^4.1.0", "json-parse-helpfulerror": "^1.0.3", "jsonlines": "^0.1.1", - "libnpmconfig": "^1.2.1", "lodash": "^4.17.21", - "minimatch": "^5.0.1", + "minimatch": "^8.0.3", "p-map": "^4.0.0", - "pacote": "^13.0.5", + "pacote": "15.1.1", "parse-github-url": "^1.0.2", "progress": "^2.0.3", - "prompts": "^2.4.2", - "rc-config-loader": "^4.1.0", + "prompts-ncu": "^3.0.0", + "rc-config-loader": "^4.1.2", "remote-git-tags": "^3.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", + "rimraf": "^4.4.1", + "semver": "^7.3.8", "semver-utils": "^1.1.4", "source-map-support": "^0.5.21", - "spawn-please": "^1.0.0", - "update-notifier": "^5.1.0", - "yaml": "^1.10.2" + "spawn-please": "^2.0.1", + "strip-json-comments": "^5.0.0", + "untildify": "^4.0.0", + "update-notifier": "^6.0.2" + }, + "bin": { + "ncu": "build/src/bin/cli.js", + "npm-check-updates": "build/src/bin/cli.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/npm-check-updates/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm-check-updates/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm-check-updates/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm-check-updates/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-check-updates/node_modules/hosted-git-info": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-check-updates/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-check-updates/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-check-updates/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-check-updates/node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-check-updates/node_modules/strip-json-comments": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz", + "integrity": "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "npm-install-checks": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", - "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "node_modules/npm-install-checks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", + "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", "dev": true, - "requires": { + "dependencies": { "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "dev": true + "node_modules/npm-normalize-package-bin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz", + "integrity": "sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "npm-package-arg": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", - "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" + "validate-npm-package-name": "^5.0.0" }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, "dependencies": { - "hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - } + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "npm-packlist": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", - "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "node_modules/npm-package-arg/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "requires": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "npm-bundled": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", - "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^2.0.0" - } - } + "engines": { + "node": ">=12" } }, - "npm-pick-manifest": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.2.tgz", - "integrity": "sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw==", + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", "dev": true, - "requires": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "npm-registry-fetch": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", - "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "dev": true, - "requires": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" } }, - "npm-run-path": { + "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { + "dependencies": { "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "npmlog": { + "node_modules/npmlog": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, - "requires": { + "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", "gauge": "^4.0.3", "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "number-is-nan": { + "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "engines": { + "node": ">=0.10.0" + } }, - "nyc": { + "node_modules/nyc": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, - "requires": { + "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "caching-transform": "^4.0.0", @@ -7548,511 +11858,703 @@ "test-exclude": "^6.0.0", "yargs": "^15.0.2" }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } }, - "object-assign": { + "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } }, - "object-inspect": { + "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ono": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", + "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", + "dev": true, + "dependencies": { + "format-util": "^1.0.3" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi3-ts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-2.0.2.tgz", + "integrity": "sha512-TxhYBMoqx9frXyOgnRHufjQfPXomTIHYKhSKJ6jHfj13kS8OEIhvmE8CTuQyKtjjWttAjX5DPxM1vmalEpo8Qw==", + "dev": true, + "dependencies": { + "yaml": "^1.10.2" + } + }, + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" + "node_modules/ora/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/ora/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" + "node_modules/ora/node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" } }, - "ono": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", - "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", - "dev": true, - "requires": { - "format-util": "^1.0.3" + "node_modules/ora/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "engines": { + "node": ">=4" } }, - "open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "node_modules/ora/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "openapi3-ts": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-2.0.2.tgz", - "integrity": "sha512-TxhYBMoqx9frXyOgnRHufjQfPXomTIHYKhSKJ6jHfj13kS8OEIhvmE8CTuQyKtjjWttAjX5DPxM1vmalEpo8Qw==", - "dev": true, - "requires": { - "yaml": "^1.10.2" + "node_modules/ora/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" } }, - "ora": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", - "requires": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" + "node_modules/ora/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "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==" - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "requires": { - "chalk": "^2.0.1" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "os-tmpdir": { + "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true + "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, + "engines": { + "node": ">=12.20" + } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "requires": { - "p-try": "^2.0.0" + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "requires": { - "p-limit": "^2.2.0" + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "requires": { - "aggregate-error": "^3.0.0" + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" } }, - "p-try": { + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "package-hash": { + "node_modules/package-hash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", "lodash.flattendeep": "^4.4.0", "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "node_modules/package-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", + "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "pacote": { - "version": "13.6.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", - "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", + "node_modules/pacote": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.1.tgz", + "integrity": "sha512-eeqEe77QrA6auZxNHIp+1TzHQ0HBKf5V6c8zcaYZ134EJe1lCi+fjXATkNiEEfbG+e50nu02GLvUtmZcGOYabQ==", "dev": true, - "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^4.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.0.0", + "ssri": "^10.0.0", "tar": "^6.1.11" }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "parent-module": { + "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, - "requires": { + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "parse-github-url": { + "node_modules/parse-github-url": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true + "dev": true, + "bin": { + "parse-github-url": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } }, - "parse-json": { + "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, - "requires": { + "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "parse-prefer-header": { + "node_modules/parse-prefer-header": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-prefer-header/-/parse-prefer-header-1.0.0.tgz", "integrity": "sha512-+WJ3ncCrKOExuxF06XyKWS8bLkLttnlm6YPMZIFIUXNd09Xy0N2JISudxCaY+luDm43yTnHMHVU3zte4G2gN4g==", "dev": true, - "requires": { + "dependencies": { "lodash.camelcase": "^4.3.0" } }, - "path-exists": { + "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 + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "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==" + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "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==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } }, - "path-parse": { + "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==" }, - "path-to-regexp": { + "node_modules/path-scurry": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", + "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", + "dev": true, + "dependencies": { + "lru-cache": "^9.0.0", + "minipass": "^5.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", + "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, - "requires": { - "isarray": "0.0.1" - }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - } + "isarray": "0.0.1" } }, - "path-type": { + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "pathval": { + "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "dev": true, + "engines": { + "node": "*" + } }, - "picocolors": { + "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, - "picomatch": { + "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pidtree": { + "node_modules/pidtree": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz", - "integrity": "sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==" + "integrity": "sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } }, - "pify": { + "node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "pino": { + "node_modules/pino": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz", "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==", "dev": true, - "requires": { + "dependencies": { "fast-redact": "^3.0.0", "fast-safe-stringify": "^2.0.8", "flatstr": "^1.0.12", @@ -8060,105 +12562,189 @@ "process-warning": "^1.0.0", "quick-format-unescaped": "^4.0.3", "sonic-boom": "^1.0.2" + }, + "bin": { + "pino": "bin.js" } }, - "pino-std-serializers": { + "node_modules/pino-std-serializers": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==", "dev": true }, - "pirates": { + "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 6" + } }, - "pkg-conf": { + "node_modules/pkg-conf": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", "dev": true, - "requires": { + "dependencies": { "find-up": "^2.0.0", "load-json-file": "^4.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" } }, - "pkg-dir": { + "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "requires": { + "dependencies": { "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "portscanner": { + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/portscanner": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", - "requires": { + "dependencies": { "async": "^2.6.0", "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" } }, - "postman-collection": { + "node_modules/postman-collection": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.1.3.tgz", "integrity": "sha512-shoe2I/GGiigsdlU5+crS2frEJqQ6tgCck1+9aaPN9pQ3Kj7bt7NJdcqrn26ScciCfQymzSLG7TL9ZQZc6i05w==", "dev": true, - "requires": { + "dependencies": { "@faker-js/faker": "6.3.1", "file-type": "3.9.0", "http-reasons": "0.1.0", @@ -8171,858 +12757,1298 @@ "semver": "7.3.7", "uuid": "8.3.2" }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-collection/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postman-collection/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-collection/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "postman-url-encoder": { + "node_modules/postman-collection/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/postman-url-encoder": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==", "dev": true, - "requires": { + "dependencies": { "punycode": "^2.1.1" + }, + "engines": { + "node": ">=10" } }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true - }, - "prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", - "dev": true + "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, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } }, - "pretty-bytes": { + "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "pretty-data": { + "node_modules/pretty-data": { "version": "0.40.0", "resolved": "https://registry.npmjs.org/pretty-data/-/pretty-data-0.40.0.tgz", "integrity": "sha512-YFLnEdDEDnkt/GEhet5CYZHCvALw6+Elyb/tp8kQG03ZSIuzeaDWpZYndCXwgqu4NAjh1PI534dhDS1mHarRnQ==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "pretty-format": { + "node_modules/pretty-format": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", "dev": true, - "requires": { + "dependencies": { "@jest/schemas": "^28.1.3", "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", - "dev": true + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "process-nextick-args": { + "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "process-on-spawn": { + "node_modules/process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, - "requires": { + "dependencies": { "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" } }, - "process-warning": { + "node_modules/process-warning": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==", "dev": true }, - "progress": { + "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, - "promise-inflight": { + "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, - "promise-retry": { + "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, - "requires": { + "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" } }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/prompts-ncu": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz", + "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==", "dev": true, - "requires": { - "kleur": "^3.0.3", + "dependencies": { + "kleur": "^4.0.1", "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 14" } }, - "proxyquire": { + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/proxyquire": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", "dev": true, - "requires": { + "dependencies": { "fill-keys": "^1.0.2", "module-not-found-error": "^1.0.1", "resolve": "^1.11.1" } }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "pstree.remy": { + "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { + "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", "dev": true, - "requires": { - "escape-goat": "^2.0.0" + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "q": { + "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } }, - "querystring": { + "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==" + "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" + } }, - "queue-microtask": { + "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==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "quick-format-unescaped": { + "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", "dev": true }, - "quick-lru": { + "node_modules/quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "ramda": { + "node_modules/ramda": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz", - "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==" + "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } }, - "randombytes": { + "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "^5.1.0" } }, - "rc": { + "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, - "requires": { + "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - } + "bin": { + "rc": "cli.js" } }, - "rc-config-loader": { + "node_modules/rc-config-loader": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.2.tgz", "integrity": "sha512-qKTnVWFl9OQYKATPzdfaZIbTxcHziQl92zYSxYC6umhOqyAsoj8H8Gq/+aFjAso68sBdjTz3A7omqeAkkF1MWg==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.3.4", "js-yaml": "^4.1.0", "json5": "^2.2.2", "require-from-string": "^2.0.2" } }, - "react-is": { + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "read-package-json": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", - "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", + "node_modules/read-package-json": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.2.tgz", + "integrity": "sha512-Ismd3km1d/FGzcjm8fBf/4ktkyd0t6pbkjYqu1gvRzOzN+aTxi1eigdZp7441TlszQ+GsdYezgS+g9cgy8QK9w==", "dev": true, - "requires": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "normalize-package-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - } + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.2.tgz", + "integrity": "sha512-Xsa0BcxIC6th9UwNjZkhrMtNo/MnyRL8jGCP+uEwhA5oFOCY1f2s1/oNKY47xQ0Bg5nkjsfAEIej1VeH62bDDQ==", + "dev": true, "dependencies": { - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - } + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.0", + "minipass": "^5.0.0", + "path-scurry": "^1.7.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-package-json/node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/signal-exit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", + "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } + "bin": { + "semver": "bin/semver" } }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/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, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } + "engines": { + "node": ">=8" } }, - "readable-stream": { + "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { + "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "readdir-glob": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", - "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", - "requires": { + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { "minimatch": "^5.1.0" - }, + } + }, + "node_modules/readdir-glob/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==", "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "requires": { - "brace-expansion": "^2.0.1" - } - } + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "readdirp": { + "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "redent": { + "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, - "requires": { + "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "node_modules/redent/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "requires": { - "rc": "1.2.8" + "engines": { + "node": ">=8" } }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dev": true, + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", "dev": true, - "requires": { - "rc": "^1.2.8" + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "release-zalgo": { + "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, - "requires": { + "dependencies": { "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" } }, - "remote-git-tags": { + "node_modules/remote-git-tags": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } + "dev": true, + "engines": { + "node": ">=8" } }, - "require-directory": { + "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==" + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } }, - "require-from-string": { + "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==" + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } }, - "require-main-filename": { + "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "requires": { - "is-core-module": "^2.9.0", + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-from": { + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "resolve-global": { + "node_modules/resolve-global": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, - "requires": { + "dependencies": { "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" } }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "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, - "requires": { - "lowercase-keys": "^1.0.0" + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "restore-cursor": { + "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { + "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" } }, - "retry": { + "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4" + } }, - "reusify": { + "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "rfdc": { + "node_modules/rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "requires": { - "glob": "^6.0.1" - }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "run-async": { + "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } }, - "run-parallel": { + "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==", "dev": true, - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { "queue-microtask": "^1.2.2" } }, - "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "requires": { + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { "tslib": "^2.1.0" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "safe-json-stringify": { + "node_modules/safe-json-stringify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", "optional": true }, - "safe-stable-stringify": { + "node_modules/safe-stable-stringify": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==", "dev": true }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sax": { + "node_modules/sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" }, - "semaphore": { + "node_modules/semaphore": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "requires": { + "node_modules/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "dependencies": { "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", "dev": true, - "requires": { - "semver": "^6.3.0" - }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "semver-utils": { + "node_modules/semver-utils": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", "dev": true }, - "serialize-javascript": { + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, - "requires": { + "dependencies": { "randombytes": "^2.1.0" } }, - "set-blocking": { + "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "setimmediate": { + "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true }, - "shebang-command": { + "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==", - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "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==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } }, - "signal-exit": { + "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==" }, - "signale": { + "node_modules/signale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", "dev": true, - "requires": { + "dependencies": { "chalk": "^2.3.2", "figures": "^2.0.0", "pkg-conf": "^2.1.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/signale/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, "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "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 - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } - } + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/signale/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 + }, + "node_modules/signale/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sigstore": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.4.0.tgz", + "integrity": "sha512-N7TRpSbFjY/TrFDg6yGAQSYBrQ5s6qmPiq4pD6fkv1LoyfMsLG0NwZWG2s5q+uttLHgyVyTa0Rogx2P78rN8kQ==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.1.0", + "make-fetch-happen": "^11.0.1", + "tuf-js": "^1.1.3" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "simple-update-notifier": { + "node_modules/sigstore/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/sigstore/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sigstore/node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/simple-update-notifier": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "requires": { + "dependencies": { "semver": "~7.0.0" }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "bin": { + "semver": "bin/semver.js" } }, - "sinon": { + "node_modules/sinon": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz", "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^1.8.3", "@sinonjs/fake-timers": "^9.1.2", "@sinonjs/samsam": "^6.1.1", @@ -9030,117 +14056,145 @@ "nise": "^5.1.1", "supports-color": "^7.2.0" }, - "dependencies": { - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" } }, - "sinon-chai": { + "node_modules/sinon-chai": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true + "dev": true, + "peerDependencies": { + "chai": "^4.0.0", + "sinon": ">=4.0.0" + } }, - "sisteransi": { + "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "slice-ansi": { + "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==", - "requires": { + "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" }, - "dependencies": { - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" - }, - "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==" - } + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "smart-buffer": { + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } }, - "socks": { + "node_modules/socks": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, - "requires": { + "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" } }, - "socks-proxy-agent": { + "node_modules/socks-proxy-agent": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, - "requires": { + "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" } }, - "sonic-boom": { + "node_modules/sonic-boom": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", "dev": true, - "requires": { + "dependencies": { "atomic-sleep": "^1.0.0", "flatstr": "^1.0.12" } }, - "source-map": { + "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==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } }, - "source-map-support": { + "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==", - "requires": { + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "spawn-please": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-1.0.0.tgz", - "integrity": "sha512-Kz33ip6NRNKuyTRo3aDWyWxeGeM0ORDO552Fs6E1nj4pLWPkl37SrRtTnq+MEopVaqgmaO6bAvVS+v64BJ5M/A==", - "dev": true + "node_modules/spawn-please": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.1.tgz", + "integrity": "sha512-W+cFbZR2q2mMTfjz5ZGvhBAiX+e/zczFCNlbS9mxiSdYswBXwUuBUT+a0urH+xZZa8f/bs0mXHyZsZHR9hKogA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3" + }, + "engines": { + "node": ">=14" + } }, - "spawn-wrap": { + "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, - "requires": { + "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", "make-dir": "^3.0.0", @@ -9148,122 +14202,117 @@ "signal-exit": "^3.0.2", "which": "^2.0.1" }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "engines": { + "node": ">=8" } }, - "spdx-correct": { + "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, - "requires": { + "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-exceptions": { + "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, - "spdx-expression-parse": { + "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, - "requires": { + "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-license-ids": { + "node_modules/spdx-license-ids": { "version": "3.0.13", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, - "split": { + "node_modules/split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, - "requires": { + "dependencies": { "through": "2" + }, + "engines": { + "node": "*" } }, - "split2": { + "node_modules/split2": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, - "requires": { + "dependencies": { "readable-stream": "^3.0.0" } }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "node_modules/ssri": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", + "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "node_modules/ssri/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "requires": { - "minipass": "^3.1.1" + "engines": { + "node": ">=8" } }, - "stack-utils": { + "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "requires": { + "dependencies": { "escape-string-regexp": "^2.0.0" }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" } }, - "standard-version": { + "node_modules/standard-version": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", "dev": true, - "requires": { + "dependencies": { "chalk": "^2.4.2", "conventional-changelog": "3.1.25", "conventional-changelog-config-spec": "2.1.0", @@ -9279,221 +14328,278 @@ "stringify-package": "^1.0.1", "yargs": "^16.0.0" }, + "bin": { + "standard-version": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/standard-version/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, "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "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 - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "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 - } + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==" + "node_modules/standard-version/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-version/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, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/standard-version/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/standard-version/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 + }, + "node_modules/standard-version/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-version/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-version/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, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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==", + "engines": { + "node": ">=0.6.19" + } }, - "string-width": { + "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==", - "requires": { + "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "stringify-package": { + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-package": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", + "deprecated": "This module is not used anymore, and has been replaced by @npmcli/package-json", "dev": true }, - "strip-ansi": { + "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==", - "requires": { + "dependencies": { "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "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 + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } }, - "strip-indent": { + "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, - "requires": { + "dependencies": { "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "strip-json-comments": { + "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 + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "strnum": { + "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, - "supports-color": { + "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==", - "requires": { + "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "supports-preserve-symlinks-flag": { + "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==" + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "symbol-observable": { + "node_modules/symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "engines": { + "node": ">=0.10.0" + } }, - "tar": { + "node_modules/tar": { "version": "6.1.13", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", "dev": true, - "requires": { + "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^4.0.0", @@ -9501,149 +14607,196 @@ "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, - "dependencies": { - "minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } + "engines": { + "node": ">=10" } }, - "tar-stream": { + "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { + "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "test-exclude": { + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "requires": { + "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, - "text-extensions": { + "node_modules/text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10" + } }, - "through": { + "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, - "through2": { + "node_modules/through2": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, - "requires": { + "dependencies": { "readable-stream": "3" } }, - "tmp": { + "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { + "dependencies": { "rimraf": "^3.0.0" }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } + "engines": { + "node": ">=8.17.0" } }, - "tmpl": { + "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-fast-properties": { + "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "to-regex-range": { + "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==", - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "touch": { + "node_modules/touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "requires": { + "dependencies": { "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" } }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" } }, - "tr46": { + "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, - "traverse": { + "node_modules/traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "trim-newlines": { + "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "ts-node": { + "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, - "requires": { + "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", @@ -9657,136 +14810,274 @@ "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/ts-toolbelt": { + "version": "6.15.5", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", + "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/tuf-js": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.4.tgz", + "integrity": "sha512-Lw2JRM3HTYhEtQJM2Th3aNCPbnXirtWMl065BawwmM2pX6XStH/ZO9e8T2hh0zk/HUa+1i6j+Lv6eDitKTau6A==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "ts-toolbelt": { - "version": "6.15.5", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", - "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", - "dev": true - }, - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "node_modules/tuf-js/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" + "node_modules/tuf-js/node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "tv4": { + "node_modules/tv4": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==", - "dev": true - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "type-detect": { + "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 + "dev": true, + "engines": { + "node": ">=4" + } }, - "type-fest": { + "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==" + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "type-is": { + "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "requires": { + "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "typedarray": { + "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, - "typedarray-to-buffer": { + "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "requires": { + "dependencies": { "is-typedarray": "^1.0.0" } }, - "typescript": { + "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } }, - "uglify-js": { + "node_modules/uglify-js": { "version": "3.17.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, - "optional": true + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } }, - "undefsafe": { + "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" }, - "unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, - "requires": { - "unique-slug": "^3.0.0" + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, - "requires": { + "dependencies": { "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "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==", "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "universalify": { + "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } }, - "untildify": { + "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "unzipper": { + "node_modules/unzipper": { "version": "0.10.11", "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", "dev": true, - "requires": { + "dependencies": { "big-integer": "^1.6.17", "binary": "~0.3.0", "bluebird": "~3.4.1", @@ -9797,119 +15088,153 @@ "listenercount": "~1.0.1", "readable-stream": "~2.3.6", "setimmediate": "~1.0.4" - }, + } + }, + "node_modules/unzipper/node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "node_modules/unzipper/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/unzipper/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, - "requires": { + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", "dev": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "uri-js": { + "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { + "dependencies": { "punycode": "^2.1.0" } }, - "uri-template-lite": { + "node_modules/uri-template-lite": { "version": "22.9.0", "resolved": "https://registry.npmjs.org/uri-template-lite/-/uri-template-lite-22.9.0.tgz", "integrity": "sha512-cmGZaykSWEQ5UXKaGKnUS8zFvfp8j1Jvn7dlq3P7tGd5XeybXcfo0xnVBRWiNEp80nO1GYgCLwoaRJ8WMmmk3Q==", "dev": true }, - "urijs": { + "node_modules/urijs": { "version": "1.19.11", "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", "dev": true }, - "url": { + "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==", - "requires": { + "dependencies": { "punycode": "1.3.2", "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" - } } }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } + "node_modules/url/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==" }, - "util": { + "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==", - "requires": { + "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", @@ -9917,273 +15242,382 @@ "which-typed-array": "^1.1.2" } }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "utility-types": { + "node_modules/utility-types": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4" + } }, - "uuid": { + "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } }, - "v8-compile-cache-lib": { + "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 }, - "valid-url": { + "node_modules/valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" }, - "validate-npm-package-license": { + "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, - "requires": { + "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "dev": true, - "requires": { + "dependencies": { "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "validate.io-array": { + "node_modules/validate.io-array": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", "dev": true }, - "validate.io-function": { + "node_modules/validate.io-function": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==", "dev": true }, - "validate.io-integer": { + "node_modules/validate.io-integer": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", "dev": true, - "requires": { + "dependencies": { "validate.io-number": "^1.0.3" } }, - "validate.io-integer-array": { + "node_modules/validate.io-integer-array": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", "dev": true, - "requires": { + "dependencies": { "validate.io-array": "^1.0.3", "validate.io-integer": "^1.0.4" } }, - "validate.io-number": { + "node_modules/validate.io-number": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - } - } - }, - "walker": { + "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, - "requires": { + "dependencies": { "makeerror": "1.0.12" } }, - "wcwidth": { + "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "requires": { + "dependencies": { "defaults": "^1.0.3" } }, - "webidl-conversions": { + "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, - "whatwg-fetch": { + "node_modules/whatwg-fetch": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==", "dev": true }, - "whatwg-url": { + "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, - "requires": { + "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, - "which-typed-array": { + "node_modules/which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "requires": { + "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "wide-align": { + "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, - "requires": { + "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, - "requires": { - "string-width": "^4.0.0" + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "wordwrap": { + "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, - "workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, - "wrap-ansi": { + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "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==", - "requires": { + "dev": true, + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "wrappy": { + "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==" }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "requires": { + "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" } }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==" + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } }, - "xtend": { + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4" + } }, - "y18n": { + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, - "yaml": { + "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } }, - "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "requires": { + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", @@ -10191,65 +15625,108 @@ "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "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==" + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } }, - "yargs-unparser": { + "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, - "requires": { + "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "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 - }, - "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 - } + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "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==", + "engines": { + "node": ">=12" } }, - "yn": { + "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "yocto-queue": { + "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 + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "zip-stream": { + "node_modules/zip-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "requires": { + "dependencies": { "archiver-utils": "^2.1.0", "compress-commons": "^4.1.0", "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" } } } diff --git a/package.json b/package.json index 6f5f683c..8920b57b 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "ask-cli", - "version": "2.29.1", + "version": "2.30.7", "description": "Alexa Skills Kit (ASK) Command Line Interfaces", "bin": { "ask": "dist/bin/ask.js" }, "engines": { - "node": ">=12" + "node": ">=14" }, "license": "Apache 2.0", "repository": "alexa/ask-cli", @@ -34,9 +34,9 @@ "test:report": "nyc npm run test", "test:browser": "npm run test:report && open coverage/index.html", "pre-test": "npm run build && chmod +x ./dist/bin/ask.js", - "integration-test": "npm run pre-test && mocha -t 180000 test/integration/run-test.js", + "integration-test": "npm run pre-test && mocha --parallel -t 180000 test/integration/run-test.js", "functional-test": "npm run pre-test && mocha -t 600000 -u bdd --require ts-node/register test/functional/run-test.js -R spec 'test/functional/{,**/}!(*.d).{ts,js}'", - "functional-test:clean-up": "node scripts/aws-clean-up.js; node scripts/ask-clean-up.js", + "functional-test:clean-up": "npm run build && tsc scripts/*.ts && node scripts/aws-clean-up.js; node scripts/ask-clean-up.js", "format": "prettier --write .", "pre-release": "standard-version", "prepare": "husky install", @@ -45,15 +45,21 @@ "watch": "tsc --watch" }, "dependencies": { - "@alexa/acdl": "^0.3.0", + "@alexa/acdl": "^0.3.1", + "@aws-sdk/client-cloudformation": "^3.306.0", + "@aws-sdk/client-iam": "^3.306.0", + "@aws-sdk/client-lambda": "^3.306.0", + "@aws-sdk/client-s3": "^3.306.0", + "@aws-sdk/credential-providers": "^3.306.0", + "@aws-sdk/types": "^3.306.0", + "@smithy/shared-ini-file-loader": "^2.0.4", "adm-zip": "^0.5.9", "archiver": "^5.3.0", - "ask-smapi-model": "~1.19.7", + "ask-smapi-model": "^1.23.0", "ask-smapi-sdk": "^1.3.0", "async": "^2.6.1", "aws-profile-handler": "2.0.3", - "aws-sdk": "^2.1111.0", - "axios": "^0.26.1", + "axios": "^1.4.0", "bunyan": "^1.8.15", "chalk": "4.0.0", "commander": "^4.1.1", @@ -72,7 +78,6 @@ "portscanner": "^2.2.0", "pretty-bytes": "^5.6.0", "ramda": "^0.28.0", - "request": "^2.88.2", "rxjs": "^7.5.5", "semver": "^7.3.6", "tmp": "^0.2.1", @@ -88,7 +93,7 @@ "@commitlint/cli": "^16.2.3", "@commitlint/config-conventional": "^16.2.1", "@istanbuljs/nyc-config-typescript": "^1.0.2", - "@stoplight/prism-cli": "^4.8.0", + "@stoplight/prism-cli": "4.14.1", "@types/chai": "^4.3.0", "@types/chai-as-promised": "^7.1.5", "@types/chai-json-schema": "^1.4.6", @@ -96,6 +101,7 @@ "@types/fs-extra": "^9.0.13", "@types/inquirer": "^8.2.1", "@types/jsonfile": "^6.1.0", + "@types/listr": "0.14.4", "@types/mocha": "^9.1.1", "@types/portscanner": "^2.1.1", "@types/proxyquire": "^1.3.28", @@ -105,7 +111,6 @@ "@types/sinon-chai": "^3.2.8", "@types/uuid": "^8.3.4", "@types/vscode": "^1.34.0", - "@types/listr": "0.14.4", "@vscode/test-electron": "^1.6.1", "chai": "^4.3.6", "chai-as-promised": "^7.1.1", @@ -113,11 +118,11 @@ "chai-uuid": "^1.0.6", "copyfiles": "^2.4.1", "husky": "^7.0.4", - "mocha": "^9.2.2", + "mocha": "^10.2.0", "mocha-chai-jest-snapshot": "^1.1.3", "mocha.parallel": "^0.15.6", "npm-bundle": "3.0.3", - "npm-check-updates": "^12.5.8", + "npm-check-updates": "^16.10.8", "nyc": "^15.1.0", "postman-collection": "4.1.3", "prettier": "^2.6.2", diff --git a/scripts/ask-clean-up.js b/scripts/ask-clean-up.ts similarity index 51% rename from scripts/ask-clean-up.js rename to scripts/ask-clean-up.ts index ede9baea..d85279c2 100644 --- a/scripts/ask-clean-up.js +++ b/scripts/ask-clean-up.ts @@ -1,34 +1,31 @@ /* eslint-disable no-await-in-loop */ -const { CustomSmapiClientBuilder } = require('ask-smapi-sdk'); -const AppConfig = require('../lib/model/app-config'); -const AuthorizationController = require('../lib/controllers/authorization-controller'); -const CONSTANTS = require('../lib/utils/constants'); -const DynamicConfig = require('../lib/utils/dynamic-config'); -const profileHelper = require("../lib/utils/profile-helper"); +import { CustomSmapiClientBuilder } from 'ask-smapi-sdk'; +import { PLACEHOLDER } from '../dist/lib/utils/constants'; +import { isEnvProfile, resolveVendorId } from "../dist/lib/utils/profile-helper"; -new AppConfig(); - -const authorizationController = new AuthorizationController({ +const appConfig = new (require('../lib/model/app-config'))(); +const authorizationController = new (require('../dist/lib/controllers/authorization-controller'))({ auth_client_type: 'LWA' }); +const dynamicConfig = require('../dist/lib/utils/dynamic-config'); const profile = _findEnvProfile() || process.env.ASK_DEFAULT_PROFILE || "default";; function _findEnvProfile() { - if (profileHelper.isEnvProfile()) { + if (isEnvProfile()) { // Only when user set every required parameter in ENV, we will treat profile as ENV - return CONSTANTS.PLACEHOLDER.ENVIRONMENT_VAR.PROFILE_NAME; + return PLACEHOLDER.ENVIRONMENT_VAR.PROFILE_NAME; } return null; } const refreshTokenConfig = { - clientId: authorizationController.oauthClient.config.clientId, - clientSecret: authorizationController.oauthClient.config.clientConfirmation, - refreshToken: AppConfig.getInstance().getToken(profile).refresh_token + clientId: authorizationController.oauthClient?.config.clientId, + clientSecret: authorizationController.oauthClient?.config.clientConfirmation, + refreshToken: appConfig.getToken(profile).refresh_token }; -const authEndpoint = DynamicConfig.lwaTokenHost; -const smapiEndpoint = DynamicConfig.smapiBaseUrl; +const authEndpoint = dynamicConfig.lwaTokenHost; +const smapiEndpoint = dynamicConfig.smapiBaseUrl; const cleanUp = async () => { console.log('cleaning ask resources'); @@ -39,11 +36,11 @@ const cleanUp = async () => { .client(); let nextToken; - const skills = []; + const skills: any = []; do { - vendorId = profileHelper.resolveVendorId(profile); + const vendorId = resolveVendorId(profile); const res = await client.listSkillsForVendorV1(vendorId, nextToken); - skills.push(...res.skills); + Array.prototype.push.apply(skills, res.skills); nextToken = res.nextToken; } while (nextToken); @@ -52,8 +49,9 @@ const cleanUp = async () => { // not using promise all to avoid throttling for (const skillId of skillIds) { + console.log(`Deleting skillid: ${skillId}`); await client.deleteSkillV1(skillId); - console.log(`removed skill with id ${skillId}`); + console.log(` > removed skillid: ${skillId}`); await new Promise(r => setTimeout(r, 1000)); } console.log(`removed # skill(s) ${skillIds.length}`); diff --git a/scripts/aws-clean-up.js b/scripts/aws-clean-up.js deleted file mode 100644 index 3fe06cf6..00000000 --- a/scripts/aws-clean-up.js +++ /dev/null @@ -1,57 +0,0 @@ -const AWS = require('aws-sdk'); - -const region = 'us-east-1'; - -const s3 = new AWS.S3(); -const cf = new AWS.CloudFormation({ region }); -const lambda = new AWS.Lambda({ region }); - -const prefix = 'ask-'; - -const deleteBucket = async (name) => { - const versions = await s3.listObjectVersions({ Bucket: name }).promise(); - - let deletePromises = versions.Versions.map(i => s3.deleteObject({ Bucket: name, Key: i.Key, VersionId: i.VersionId }).promise()); - await Promise.all(deletePromises); - - deletePromises = versions.DeleteMarkers.map(i => s3.deleteObject({ Bucket: name, Key: i.Key, VersionId: i.VersionId }).promise()); - await Promise.all(deletePromises); - - return s3.deleteBucket({ Bucket: name }).promise(); -}; - -const cleanUp = async () => { - console.log(`cleaning aws resources with prefix "${prefix}"`); - - const stackResults = await cf.listStacks().promise().then(res => { - const Stacks = res.StackSummaries - .filter(s => s.StackName.startsWith(prefix) && !s.StackStatus.includes('DELETE_COMPLETE')); - console.log('Stacks #:', Stacks.length); - const deletePromises = Stacks.map(i => cf.deleteStack({ StackName: i.StackName }).promise()); - return Promise.allSettled(deletePromises); - }); - - const functionResults = await lambda.listFunctions().promise().then(res => { - const Functions = res.Functions.filter(i => i.FunctionName.startsWith(prefix)); - console.log('Functions #:', Functions.length); - const deletePromises = Functions.map(i => lambda.deleteFunction({ FunctionName: i.FunctionName }).promise()); - return Promise.allSettled(deletePromises); - }); - - const bucketResults = await s3.listBuckets().promise().then(async (res) => { - const Buckets = res.Buckets.filter(b => b.Name.startsWith(prefix)); - console.log('Buckets #:', Buckets.length); - const deletePromises = Buckets.map((i) => deleteBucket(i.Name)); - return Promise.allSettled(deletePromises); - }); - - const rejected = [...stackResults, ...functionResults, ...bucketResults].filter(r => r.status === 'rejected'); - if (rejected.length) { - rejected.forEach(r => { - console.error(r.reason); - }); - } - console.log('done'); -}; - -cleanUp(); diff --git a/scripts/aws-clean-up.ts b/scripts/aws-clean-up.ts new file mode 100644 index 00000000..08e89528 --- /dev/null +++ b/scripts/aws-clean-up.ts @@ -0,0 +1,57 @@ +import { S3Client, DeleteBucketCommand, DeleteObjectCommand, ListBucketsCommand, ListObjectVersionsCommand } from '@aws-sdk/client-s3'; +import { CloudFormationClient, DeleteStackCommand, ListStacksCommand, StackSummary } from '@aws-sdk/client-cloudformation'; +import { LambdaClient, DeleteFunctionCommand, ListFunctionsCommand } from '@aws-sdk/client-lambda'; + +const region = 'us-east-1'; +const s3 = new S3Client({ region }); +const cf = new CloudFormationClient({ region }); +const lambda = new LambdaClient({ region }); +const prefix = 'ask-'; + +const deleteBucket = async (name) => { + const versions = await s3.send(new ListObjectVersionsCommand({ Bucket: name })); + + if (versions.Versions) { + const deletePromises = versions.Versions.map(i => s3.send(new DeleteObjectCommand({ Bucket: name, Key: i.Key, VersionId: i.VersionId }))) || []; + await Promise.all(deletePromises); + const deleteMarkersPromises = versions.DeleteMarkers?.map(i => s3.send(new DeleteObjectCommand({ Bucket: name, Key: i.Key, VersionId: i.VersionId }))) || []; + await Promise.all(deleteMarkersPromises); + } + + return s3.send(new DeleteBucketCommand({ Bucket: name })); +}; + +export const cleanUp = async () => { + console.log(`cleaning aws resources with prefix "${prefix}"`); + + const stackResults = await cf.send(new ListStacksCommand({})).then(res => { + const stacks: StackSummary[] = res.StackSummaries?.filter(s => s.StackName?.startsWith(prefix) && !s.StackStatus?.includes('DELETE_COMPLETE')) || []; + console.log('Stacks #:', stacks.length); + const deletePromises = stacks.map(i => cf.send(new DeleteStackCommand({ StackName: i.StackName }))); + return Promise.allSettled(deletePromises); + }); + + const functionResults = await lambda.send(new ListFunctionsCommand({})).then(res => { + const Functions = res.Functions?.filter(i => i.FunctionName?.startsWith(prefix)) || []; + console.log('Functions #:', Functions.length); + const deletePromises = Functions.map(i => lambda.send(new DeleteFunctionCommand({ FunctionName: i.FunctionName }))); + return Promise.allSettled(deletePromises); + }); + + const bucketResults = await s3.send(new ListBucketsCommand({})).then(async (res) => { + const Buckets = res.Buckets?.filter(b => b.Name?.startsWith(prefix)) || []; + console.log('Buckets #:', Buckets.length); + const deletePromises = Buckets.map((i) => deleteBucket(i.Name)); + return Promise.allSettled(deletePromises); + }); + + const rejected = [...stackResults, ...functionResults, ...bucketResults].filter(r => r.status === 'rejected'); + if (rejected.length) { + rejected.forEach(r => { + console.error(JSON.stringify(r, null, 2)); + }); + } + console.log('done'); +}; + +cleanUp(); diff --git a/test/integration/commands/smapi-commands-test.js b/test/integration/commands/smapi-commands-test.js index 296d7c1b..b28e346f 100644 --- a/test/integration/commands/smapi-commands-test.js +++ b/test/integration/commands/smapi-commands-test.js @@ -1,6 +1,5 @@ const { expect } = require("chai"); const { ModelIntrospector } = require("ask-smapi-sdk"); -const parallel = require("mocha.parallel"); const path = require("path"); const { CliCustomizationProcessor } = require("../../../lib/commands/smapi/cli-customization-processor"); @@ -13,9 +12,7 @@ const interactionModel = require("../../integration/fixtures/interaction-model.j const annotationSet = require("../../integration/fixtures/annotation-set.json"); const jobDefinition = require("../../integration/fixtures/job-definition.json"); const experimentMetricConfigurationModel = require('../../integration/fixtures/experiment-metric-configuration.json'); - -parallel.limit(8); - +const { after, before } = require("mocha"); const processor = new CliCustomizationProcessor(); const modelIntrospector = new ModelIntrospector(); const untestedCommands = new Set([...modelIntrospector.getOperations().keys()].map(processor.processOperationName)); @@ -30,7 +27,7 @@ const addCoveredCommand = (args) => { untestedCommands.delete(smapiCmd); }; -parallel('smapi command test', () => { +describe('smapi command test', () => { const askCmd = path.join(process.cwd(), "/dist/bin/ask.js"); const subCmd = 'smapi'; let mockSmapiServer; @@ -46,7 +43,7 @@ parallel('smapi command test', () => { const productId = 'someProductId'; const stage = 'development'; const locale = 'en-US'; - const location = 'US'; + const location = 'https://some.url.com/location/us'; const sourceLocale = 'en-US'; const targetLocales = 'en-GB'; const acceptLanguage = 'en-GB'; @@ -56,7 +53,7 @@ parallel('smapi command test', () => { const subscriptionId = 'someSubscriptionId'; const updateRequestId = 'someUpdateRequestId'; const imJobId = 'someIMJobId'; - const imJobStatus = 'imJobStatus'; + const imJobStatus = 'ENALBED'; const imExecutionId = 'imExecutionId'; const version = '2.0.0'; const targetVersion = '7'; @@ -70,7 +67,7 @@ parallel('smapi command test', () => { const contentType = 'application/json'; const annotationSetId = 'someAnnotationSetId'; const experimentId = '1'; - const treatmentId = '2'; + const treatmentId = 'T1'; const metricSnapShotId = '3'; const experimentName = 'experimentName'; const experimentDescription = 'experimentDescription'; @@ -513,7 +510,7 @@ parallel('smapi command test', () => { "--name", "someName", "--events", - "AlexaDevelopmentEvent.ManifestUpdat", + "AlexaDevelopmentEvent.ManifestUpdate", "--subscriber-id", subscriberId, ]; @@ -538,7 +535,7 @@ parallel('smapi command test', () => { "--name", "someName", "--events", - "AlexaDevelopmentEvent.ManifestUpdated,AlexaDevelopmentEvent.ManifestCreated", + "AlexaDevelopmentEvent.ManifestUpdate,AlexaDevelopmentEvent.SkillCertification", ]; addCoveredCommand(args); const result = await run(askCmd, args, {...options, parse: false}); @@ -1003,7 +1000,7 @@ parallel('smapi command test', () => { }); it("| should invoke skill end point", async () => { - const args = [subCmd, "invoke-skill", "-s", skillId, "--endpoint-region", "someRegion", "--skill-request-body", JSON.stringify({})]; + const args = [subCmd, "invoke-skill", "-s", skillId, "--endpoint-region", "NA", "--skill-request-body", JSON.stringify({})]; addCoveredCommand(args); const result = await run(askCmd, args, options); expect(result).be.an("object"); @@ -1018,7 +1015,7 @@ parallel('smapi command test', () => { "-g", stage, "--endpoint-region", - "someRegion", + "NA", "--skill-request-body", JSON.stringify({}), ]; @@ -1514,4 +1511,4 @@ parallel('smapi command test', () => { mockLwaServer.kill(); expect(Array.from(untestedCommands), 'should not have untested commands').eql([]); }); -}); \ No newline at end of file +}); diff --git a/test/integration/fixtures/account-linking-request.json b/test/integration/fixtures/account-linking-request.json index 59607785..276eb230 100644 --- a/test/integration/fixtures/account-linking-request.json +++ b/test/integration/fixtures/account-linking-request.json @@ -1,6 +1,6 @@ { "accountLinkingRequest": { - "skipOnEnablement": "true", + "skipOnEnablement": true, "type": "AUTH_CODE", "authorizationUrl": "https://www.example.com/auth_url", "domains": ["example.com"], diff --git a/test/integration/fixtures/create-in-skill-product-request.json b/test/integration/fixtures/create-in-skill-product-request.json index e700ed64..9048cac1 100644 --- a/test/integration/fixtures/create-in-skill-product-request.json +++ b/test/integration/fixtures/create-in-skill-product-request.json @@ -27,7 +27,7 @@ "distributionCountries": ["US"], "pricing": { "amazon.com": { - "releaseDate": "2099-04-13", + "releaseDate": "2099-04-13T00:00:00Z", "defaultPriceListing": { "price": 0.99, "currency": "USD" diff --git a/test/integration/fixtures/lwa-swagger.json b/test/integration/fixtures/lwa-swagger.json index 4b8ff960..60f0dcd5 100644 --- a/test/integration/fixtures/lwa-swagger.json +++ b/test/integration/fixtures/lwa-swagger.json @@ -6,9 +6,9 @@ }, "produces": ["application/json"], "paths": { - "/auth/O2/token": { + "/auth/o2/token": { "post": { - "consumes": ["application/x-www-form-urlencoded"], + "consumes": ["application/json"], "parameters": [ { "in": "body", diff --git a/test/integration/fixtures/smapi_spec.json b/test/integration/fixtures/smapi_spec.json new file mode 100644 index 00000000..ccb132d4 --- /dev/null +++ b/test/integration/fixtures/smapi_spec.json @@ -0,0 +1,28554 @@ +{ + "swagger": "2.0", + "info": { + "version": "1.0", + "title": "Skill Management API SDK" + }, + "consumes":[ + "application/json" + ], + "produces": [ + "application/json" + ], + "security": [ + { + "skillManagement": [] + } + ], + "paths": { + "/v0/catalogs": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Lists catalogs associated with a vendor.", + "parameters": [ + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "required": false, + "type": "integer" + }, + { + "name": "vendorId", + "in": "query", + "description": "The vendor ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Successful operation.", + "schema": { + "$ref": "#/definitions/v0.catalog.ListCatalogsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "listCatalogsForVendorV0" + }, + "post": { + "tags": [ + "skillManagement" + ], + "description": "Creates a new catalog based on information provided in the request.", + "parameters": [ + { + "in": "body", + "name": "CreateCatalogRequest", + "description": "Defines the request body for createCatalog API.", + "required": true, + "schema": { + "$ref": "#/definitions/v0.catalog.CreateCatalogRequest" + } + } + ], + "responses": { + "201": { + "description": "Catalog created.", + "schema": { + "$ref": "#/definitions/v0.catalog.CatalogDetails" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "createCatalogV0" + } + }, + "/v0/catalogs/{catalogId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Returns information about a particular catalog.", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + } + ], + "responses": { + "200": { + "description": "Successful operation.", + "schema": { + "$ref": "#/definitions/v0.catalog.CatalogDetails" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "getCatalogV0" + } + }, + "/v0/skills/{skillId}/catalogs": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Lists all the catalogs associated with a skill.", + "parameters": [ + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "required": false, + "type": "integer" + }, + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Successful operation.", + "schema": { + "$ref": "#/definitions/v0.catalog.ListCatalogsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "listCatalogsForSkillV0" + } + }, + "/v0/skills/{skillId}/catalogs/{catalogId}": { + "put": { + "tags": [ + "skillManagement" + ], + "description": "Associate skill with catalog.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + } + ], + "responses": { + "201": { + "description": "Successful operation." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "associateCatalogWithSkillV0" + } + }, + "/v0/catalogs/{catalogId}/uploads": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Lists all the uploads for a particular catalog.", + "parameters": [ + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + } + ], + "responses": { + "200": { + "description": "Successful operation.", + "schema": { + "$ref": "#/definitions/v0.catalog.upload.ListUploadsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "listUploadsForCatalogV0" + }, + "post": { + "tags": [ + "skillManagement" + ], + "description": "Creates a new upload for a catalog and returns presigned upload parts for uploading the file.", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "in": "body", + "name": "CreateContentUploadRequest", + "description": "Defines the request body for updateCatalog API.", + "required": true, + "schema": { + "$ref": "#/definitions/v0.catalog.upload.CreateContentUploadRequest" + } + } + ], + "responses": { + "201": { + "description": "Content upload created.", + "schema": { + "$ref": "#/definitions/v0.catalog.upload.CreateContentUploadResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "createContentUploadV0" + } + }, + "/v0/catalogs/{catalogId}/uploads/{uploadId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Gets detailed information about an upload which was created for a specific catalog. Includes the upload's ingestion steps and a presigned url for downloading the file.", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "name": "uploadId", + "in": "path", + "description": "Unique identifier of the upload.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Successful operation.", + "schema": { + "$ref": "#/definitions/v0.catalog.upload.GetContentUploadResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "getContentUploadByIdV0" + }, + "post": { + "tags": [ + "skillManagement" + ], + "description": "Completes an upload. To be called after the file is uploaded to the backend data store using presigned url(s).", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "name": "uploadId", + "in": "path", + "description": "Unique identifier of the upload.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "CompleteUploadRequestPayload", + "description": "Request payload to complete an upload.", + "required": true, + "schema": { + "$ref": "#/definitions/v0.catalog.upload.CompleteUploadRequest" + } + } + ], + "responses": { + "202": { + "description": "Accepted." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "completeCatalogUploadV0" + } + }, + "/v0/developmentEvents/subscribers": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Lists the subscribers for a particular vendor.", + "parameters": [ + { + "name": "vendorId", + "in": "query", + "description": "The vendor ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "Successful operation.", + "schema": { + "$ref": "#/definitions/v0.developmentEvents.subscriber.ListSubscribersResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "listSubscribersForDevelopmentEventsV0" + }, + "post": { + "tags": [ + "skillManagement" + ], + "description": "Creates a new subscriber resource for a vendor.", + "parameters": [ + { + "in": "body", + "name": "CreateSubscriberRequest", + "description": "Defines the request body for createSubscriber API.", + "required": true, + "schema": { + "$ref": "#/definitions/v0.developmentEvents.subscriber.CreateSubscriberRequest" + } + } + ], + "responses": { + "201": { + "description": "Created. Returns a URL to retrieve the subscriber in 'Location' header.", + "headers": { + "Location": { + "type": "string", + "description": "Relative URL to retrieve the subscriber." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "createSubscriberForDevelopmentEventsV0" + } + }, + "/v0/developmentEvents/subscribers/{subscriberId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Returns information about specified subscriber.", + "parameters": [ + { + "name": "subscriberId", + "in": "path", + "description": "Unique identifier of the subscriber.", + "required": true, + "type": "string", + "format": "Amazon Common Identifier" + } + ], + "responses": { + "200": { + "description": "Successful operation.", + "schema": { + "$ref": "#/definitions/v0.developmentEvents.subscriber.SubscriberInfo" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "getSubscriberForDevelopmentEventsV0" + }, + "put": { + "tags": [ + "skillManagement" + ], + "description": "Updates the properties of a subscriber.", + "parameters": [ + { + "name": "subscriberId", + "in": "path", + "description": "Unique identifier of the subscriber.", + "required": true, + "type": "string", + "format": "Amazon Common Identifier" + }, + { + "in": "body", + "name": "UpdateSubscriberRequest", + "description": "Defines the request body for updateSubscriber API.", + "required": true, + "schema": { + "$ref": "#/definitions/v0.developmentEvents.subscriber.UpdateSubscriberRequest" + } + } + ], + "responses": { + "204": { + "description": "Success." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "setSubscriberForDevelopmentEventsV0" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Deletes a specified subscriber.", + "parameters": [ + { + "name": "subscriberId", + "in": "path", + "description": "Unique identifier of the subscriber.", + "required": true, + "type": "string", + "format": "Amazon Common Identifier" + } + ], + "responses": { + "204": { + "description": "Successful operation." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "deleteSubscriberForDevelopmentEventsV0" + } + }, + "/v0/developmentEvents/subscribers/{subscriberId}/test": {}, + "/v0/developmentEvents/subscriptions": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Lists all the subscriptions for a vendor/subscriber depending on the query parameter.", + "parameters": [ + { + "name": "vendorId", + "in": "query", + "description": "The vendor ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "subscriberId", + "in": "query", + "description": "Unique identifier of the subscriber. If this query parameter is provided, the list would be filtered by the owning subscriberId.", + "required": false, + "type": "string", + "format": "Amazon Common Identifier" + } + ], + "responses": { + "200": { + "description": "Successful operation.", + "schema": { + "$ref": "#/definitions/v0.developmentEvents.subscription.ListSubscriptionsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "listSubscriptionsForDevelopmentEventsV0" + }, + "post": { + "tags": [ + "skillManagement" + ], + "consumes": [ + "application/json" + ], + "description": "Creates a new subscription for a subscriber. This needs to be authorized by the client/vendor who created the subscriber and the vendor who publishes the event.", + "parameters": [ + { + "in": "body", + "name": "CreateSubscriptionRequest", + "description": "Request body for createSubscription API.", + "required": false, + "schema": { + "$ref": "#/definitions/v0.developmentEvents.subscription.CreateSubscriptionRequest" + } + } + ], + "responses": { + "201": { + "description": "Created; Returns a URL to retrieve the subscription in 'Location' header.", + "headers": { + "Location": { + "type": "string", + "description": "Relative URL to retrieve the subscription." + }, + "Content-Type":{ + "type": "string", + "description": "empty content", + "enum":[ + "text/plain" + ] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "createSubscriptionForDevelopmentEventsV0" + } + }, + "/v0/developmentEvents/subscriptions/{subscriptionId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Returns information about a particular subscription. Both, the vendor who created the subscriber and the vendor who publishes the event can retrieve this resource with appropriate authorization.", + "parameters": [ + { + "name": "subscriptionId", + "in": "path", + "description": "Unique identifier of the subscription.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + } + ], + "responses": { + "200": { + "description": "Successful operation.", + "schema": { + "$ref": "#/definitions/v0.developmentEvents.subscription.SubscriptionInfo" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "getSubscriptionForDevelopmentEventsV0" + }, + "put": { + "tags": [ + "skillManagement" + ], + "description": "Updates the mutable properties of a subscription. This needs to be authorized by the client/vendor who created the subscriber and the vendor who publishes the event. The subscriberId cannot be updated.", + "parameters": [ + { + "name": "subscriptionId", + "in": "path", + "description": "Unique identifier of the subscription.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "in": "body", + "name": "UpdateSubscriptionRequest", + "description": "Request body for updateSubscription API.", + "required": false, + "schema": { + "$ref": "#/definitions/v0.developmentEvents.subscription.UpdateSubscriptionRequest" + } + } + ], + "responses": { + "204": { + "description": "No content." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "setSubscriptionForDevelopmentEventsV0" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Deletes a particular subscription. Both, the vendor who created the subscriber and the vendor who publishes the event can delete this resource with appropriate authorization.", + "parameters": [ + { + "name": "subscriptionId", + "in": "path", + "description": "Unique identifier of the subscription.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + } + ], + "responses": { + "204": { + "description": "Successful operation." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v0.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "x-operation-name": "deleteSubscriptionForDevelopmentEventsV0" + } + }, + "/v0/skills/{skillId}/experiments": {}, + "/v0/skills/{skillId}/experiments/{experimentId}/properties": {}, + "/v0/skills/{skillId}/experiments/{experimentId}": {}, + "/v0/skills/{skillId}/experiments/{experimentId}/exposurePercentage": {}, + "/v0/skills/{skillId}/experiments/{experimentId}/treatmentOverrides/~current": {}, + "/v0/skills/{skillId}/experiments/{experimentId}/state": {}, + "/v0/skills/{skillId}/experiments/{experimentId}/metricSnapshots": {}, + "/v0/skills/{skillId}/experiments/{experimentId}/metricSnapshots/{metricSnapshotId}": {}, + "/v0/skills/{skillId}/_internationalize": {}, + "/v0/skills/{skillId}/_internationalizations/{internationalizationId}": {}, + "/v0/_burnerDeveloperAccounts": {}, + "/v0/_burnerDeveloperAccounts/{vendorId}": {}, + "/v1/catalogs/{catalogId}/urls": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Generates preSigned urls to upload data", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "in": "body", + "name": "GenerateCatalogUploadUrlRequestBody", + "description": "Request body to generate catalog upload url", + "required": true, + "schema": { + "$ref": "#/definitions/v1.catalog.CreateContentUploadUrlRequest" + } + } + ], + "responses": { + "201": { + "description": "Successful operation.", + "schema": { + "$ref": "#/definitions/v1.catalog.CreateContentUploadUrlResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "generateCatalogUploadUrlV1" + } + }, + "/v1/catalogs/{catalogId}/uploads": { + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Create new upload", + "description": "Creates a new upload for a catalog and returns location to track the upload process.", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "in": "body", + "name": "CatalogUploadRequestBody", + "description": "Provides the request body for create content upload", + "required": true, + "schema": { + "$ref": "#/definitions/v1.catalog.upload.CatalogUploadBase" + } + } + ], + "responses": { + "202": { + "description": "Accepted", + "headers": { + "Location": { + "type": "string", + "description": "Contains relative URL to track upload." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes\ntotal requests, per API, ClientId, and CustomerId.\n", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "createCatalogUploadV1" + } + }, + "/v1/catalogs/{catalogId}/uploads/{uploadId}": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Get upload", + "description": "Gets detailed information about an upload which was created for a specific catalog. Includes the upload's ingestion steps and a url for downloading the file.", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "name": "uploadId", + "in": "path", + "description": "Unique identifier of the upload.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Successful operation.", + "schema": { + "$ref": "#/definitions/v1.catalog.upload.GetContentUploadResponse" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes\ntotal requests, per API, ClientId, and CustomerId.\n", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getContentUploadByIdV1" + } + }, + "/v1/inSkillProducts": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the list of in-skill products for the vendor.", + "parameters": [ + { + "name": "vendorId", + "in": "query", + "description": "The vendor ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 100, + "minimum": 1 + }, + { + "name": "productId", + "in": "query", + "description": "The list of in-skill product IDs that you wish to get the summary for. A maximum of 50 in-skill product IDs can be specified in a single listInSkillProducts call. Please note that this parameter must not be used with 'nextToken' and/or 'maxResults' parameter.", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + }, + { + "name": "stage", + "in": "query", + "description": "Filter in-skill products by specified stage.", + "required": false, + "type": "string", + "maxLength": 63, + "minLength": 1 + }, + { + "name": "type", + "in": "query", + "description": "Type of in-skill product to filter on.", + "required": false, + "type": "string", + "enum": [ + "SUBSCRIPTION", + "ENTITLEMENT", + "CONSUMABLE" + ] + }, + { + "name": "referenceName", + "in": "query", + "description": "Filter in-skill products by reference name.", + "required": false, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "status", + "in": "query", + "description": "Status of in-skill product.", + "required": false, + "type": "string", + "enum": [ + "INCOMPLETE", + "COMPLETE", + "CERTIFICATION", + "PUBLISHED", + "SUPPRESSED" + ] + }, + { + "name": "isAssociatedWithSkill", + "in": "query", + "description": "Filter in-skill products by whether or not they are associated to a skill.", + "required": false, + "type": "string", + "enum": [ + "ASSOCIATED_WITH_SKILL", + "NO_SKILL_ASSOCIATIONS", + "NOT_ASSOCIATED_WITH_SKILL" + ] + } + ], + "responses": { + "200": { + "description": "Response contains list of in-skill products for the specified vendor and stage.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body.", + "enum": [ + "application/json" + ] + } + }, + "schema": { + "$ref": "#/definitions/v1.isp.ListInSkillProductResponse" + } + }, + "400": { + "description": "Bad request. Returned when a required parameter is not present, badly formatted.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Too many requests received.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getIspListForVendorV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "description": "Creates a new in-skill product for given vendorId.", + "parameters": [ + { + "in": "body", + "name": "createInSkillProductRequest", + "description": "defines the request body for createInSkillProduct API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.isp.createInSkillProductRequest" + } + } + ], + "responses": { + "201": { + "description": "Success.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v1.isp.ProductResponse" + } + }, + "400": { + "description": "Bad request. Returned when a required parameter is not present, badly formatted.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Too many requests received.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "createIspForVendorV1" + } + }, + "/v1/skills/{skillId}/stages/{stage}/inSkillProducts": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the list of in-skill products for the skillId.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 100, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "Response contains list of in-skill products for the specified skillId and stage.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body.", + "enum": [ + "application/json" + ] + } + }, + "schema": { + "$ref": "#/definitions/v1.isp.ListInSkillProductResponse" + } + }, + "400": { + "description": "Bad request. Returned when a required parameter is not present, badly formatted.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "Requested resource not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Too many requests received.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getIspListForSkillIdV1" + } + }, + "/v1/inSkillProducts/{productId}/stages/{stage}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Returns the in-skill product definition for given productId.", + "parameters": [ + { + "name": "productId", + "in": "path", + "description": "The in-skill product ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Response contains the latest version of an in-skill product for the specified stage.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body.", + "enum": [ + "application/json" + ] + }, + "ETag": { + "type": "string", + "description": "Identifier for the version of the resource, can be used for conditional updates." + } + }, + "schema": { + "$ref": "#/definitions/v1.isp.InSkillProductDefinitionResponse" + } + }, + "400": { + "description": "Bad request. Returned when a required parameter is not present, badly formatted.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "Requested resource not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Too many requests received.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getIspDefinitionV1" + }, + "put": { + "tags": [ + "skillManagement" + ], + "description": "Updates in-skill product definition for given productId. Only development stage supported.", + "parameters": [ + { + "name": "If-Match", + "in": "header", + "description": "Request header that specified an entity tag. The server will update the resource only if the eTag matches with the resource's current eTag.", + "required": false, + "type": "string" + }, + { + "name": "productId", + "in": "path", + "description": "The in-skill product ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + }, + { + "in": "body", + "name": "updateInSkillProductRequest", + "description": "defines the request body for updateInSkillProduct API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.isp.updateInSkillProductRequest" + } + } + ], + "responses": { + "204": { + "description": "Success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body.", + "enum": [ + "application/json" + ] + } + } + }, + "400": { + "description": "Bad request. Returned when a required parameter is not present, badly formatted.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "Request is forbidden.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "Requested resource not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "412": { + "description": "Precondition failed.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Too many requests received.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "updateIspForProductV1" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Deletes the in-skill product for given productId. Only development stage supported. Live in-skill products or in-skill products associated with a skill cannot be deleted by this API.", + "parameters": [ + { + "name": "productId", + "in": "path", + "description": "The in-skill product ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + }, + { + "name": "If-Match", + "in": "header", + "description": "Request header that specified an entity tag. The server will update the resource only if the eTag matches with the resource's current eTag.", + "required": false, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": {} + }, + "400": { + "description": "Bad request. Returned when a required parameter is not present, badly formatted.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "Request is forbidden.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "Requested resource not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "412": { + "description": "Precondition failed.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Too many requests received.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "deleteIspForProductV1" + } + }, + "/v1/inSkillProducts/{productId}/stages/{stage}/summary": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the summary information for an in-skill product.", + "parameters": [ + { + "name": "productId", + "in": "path", + "description": "The in-skill product ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Returns current in-skill product summary for productId.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body.", + "enum": [ + "application/json" + ] + }, + "ETag": { + "type": "string", + "description": "Identifier for the version of the resource, can be used for conditional updates." + } + }, + "schema": { + "$ref": "#/definitions/v1.isp.InSkillProductSummaryResponse" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "Requested resource not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Too many requests received.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getIspSummaryV1" + } + }, + "/v1/inSkillProducts/{productId}/stages/{stage}/skills": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the associated skills for the in-skill product.", + "parameters": [ + { + "name": "productId", + "in": "path", + "description": "The in-skill product ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 100, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "Returns skills associated with the in-skill product.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body.", + "enum": [ + "application/json" + ] + } + }, + "schema": { + "$ref": "#/definitions/v1.isp.AssociatedSkillResponse" + } + }, + "400": { + "description": "Bad request. Returned when a required parameter is not present, badly formatted.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "Requested resource not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Too many requests received.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getIspAssociatedSkillsV1" + } + }, + "/v1/inSkillProducts/{productId}/skills/{skillId}": { + "put": { + "tags": [ + "skillManagement" + ], + "description": "Associates an in-skill product with a skill.", + "parameters": [ + { + "name": "productId", + "in": "path", + "description": "The in-skill product ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": {} + }, + "400": { + "description": "Bad request. Returned when a required parameter is not present, badly formatted.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "Request is forbidden.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "Requested resource not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Too many requests received.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "associateIspWithSkillV1" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Disassociates an in-skill product from a skill.", + "parameters": [ + { + "name": "productId", + "in": "path", + "description": "The in-skill product ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": {} + }, + "400": { + "description": "Bad request. Returned when a required parameter is not present, badly formatted.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "Request is forbidden.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "Requested resource not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Too many requests received.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "disassociateIspWithSkillV1" + } + }, + "/v1/inSkillProducts/{productId}/stages/{stage}/entitlement": { + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Resets the entitlement(s) of the Product for the current user.", + "parameters": [ + { + "name": "productId", + "in": "path", + "description": "The in-skill product ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": {} + }, + "400": { + "description": "Bad request. Returned when a required parameter is not present, badly formatted.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "Request is forbidden.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "Requested resource not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "412": { + "description": "Precondition failed.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Too many requests received.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "resetEntitlementForProductV1" + } + }, + "/v1/skills/{skillId}/stages/{stageV2}/accountLinkingClient": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get AccountLinking information for the skill.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stageV2", + "in": "path", + "description": "Stages of a skill including the new certified stage.\n* `development` - skills which are currently in development corresponds to this stage.\n* `certified` - skills which have completed certification and ready for publishing corresponds to this stage.\n* `live` - skills which are currently live corresponds to this stage.\n", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Returns AccountLinking response of the skill.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + }, + "ETag": { + "type": "string", + "description": "Identifer for the version of the resource, can be used for conditional updates." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.accountLinking.AccountLinkingResponse" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getAccountLinkingInfoV1" + }, + "put": { + "tags": [ + "skillManagement" + ], + "description": "Create AccountLinking information for the skill.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stageV2", + "in": "path", + "description": "Stages of a skill including the new certified stage.\n* `development` - skills which are currently in development corresponds to this stage.\n* `certified` - skills which have completed certification and ready for publishing corresponds to this stage.\n* `live` - skills which are currently live corresponds to this stage.\n", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "accountLinkingRequest", + "description": "The fields required to create accountLinking partner.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.accountLinking.AccountLinkingRequest" + } + }, + { + "name": "If-Match", + "in": "header", + "description": "Request header that specified an entity tag. The server will update the resource only if the eTag matches with the resource's current eTag.", + "required": false, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Success", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only 'application/json' supported.", + "enum": ["text/plain"] + }, + "ETag": { + "type": "string", + "description": "Identifer for the updated version of the resource, can be used for conditional updates." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. Authorization Url is invalid.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "412": { + "description": "Precondition failed.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "updateAccountLinkingInfoV1" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Delete AccountLinking information of a skill for the given stage.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stageV2", + "in": "path", + "description": "Stages of a skill including the new certified stage.\n* `development` - skills which are currently in development corresponds to this stage.\n* `certified` - skills which have completed certification and ready for publishing corresponds to this stage.\n* `live` - skills which are currently live corresponds to this stage.\n", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only \"application/json\" supported", + "enum":["text/plain"] + } + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill/stage/accountLinkingClient doesn't exist.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "deleteAccountLinkingInfoV1" + } + }, + "/v1/skills/{skillId}/alexaHosted/repository/credentials/generate": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Generates hosted skill repository credentials to access the hosted skill repository.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "hostedSkillRepositoryCredentialsRequest", + "description": "defines the request body for hosted skill repository credentials", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillRepositoryCredentialsRequest" + } + } + ], + "responses": { + "200": { + "description": "Response contains the hosted skill repository credentials", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only \"application/json\" supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillRepositoryCredentialsList" + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. Authorization Url is invalid", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "generateCredentialsForAlexaHostedSkillV1" + } + }, + "/v1/skills/{skillId}/alexaHosted": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get Alexa hosted skill's metadata", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "response contains the Alexa hosted skill's metadata", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only \"application/json\" supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillMetadata" + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. Authorization Url is invalid", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getAlexaHostedSkillMetadataV1" + } + }, + "/v1/vendors/{vendorId}/alexaHosted/permissions/{hostedSkillPermissionType}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the current user permissions about Alexa hosted skill features.", + "parameters": [ + { + "name": "vendorId", + "in": "path", + "description": "vendorId", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "hostedSkillPermissionType", + "in": "path", + "description": "The permission of a hosted skill feature that customer needs to check.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "response contains the user's permission of hosted skill features", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only \"application/json\" supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillPermission" + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. Authorization Url is invalid", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getAlexaHostedSkillUserPermissionsV1" + } + }, + "/v1/skills/{skillId}/betaTest": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Get beta test.", + "description": "Get beta test for a given Alexa skill.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Content type of the response; only application/json supported.", + "enum":["text/plain"] + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.betaTest.BetaTest" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "Thrown if user tries to request a new simulation while the old simulation is in progress.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getBetaTestV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Create beta test.", + "description": "Create a beta test for a given Alexa skill.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "createTestBody", + "description": "JSON object containing the details of a beta test used to create the test.", + "required": false, + "schema": { + "$ref": "#/definitions/v1.skill.betaTest.TestBody" + } + } + ], + "responses": { + "201": { + "description": "Success. Return a URL to track the resource in 'Location' header.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Content type of the response; only application/json supported.", + "enum": ["text/plain"] + }, + "Location": { + "type": "string", + "description": "Relative URL to get the resource." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "createBetaTestV1" + }, + "put": { + "tags": [ + "skillManagement" + ], + "summary": "Update beta test.", + "description": "Update a beta test for a given Alexa skill.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "createTestBody", + "description": "JSON object containing the details of a beta test used to create the test.", + "required": false, + "schema": { + "$ref": "#/definitions/v1.skill.betaTest.TestBody" + } + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Content type of the response; only application/json supported.", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "Thrown if user tries to request a new simulation while the old simulation is in progress.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "updateBetaTestV1" + } + }, + "/v1/skills/{skillId}/betaTest/start": { + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Start beta test", + "description": "Start a beta test for a given Alexa skill. System will send invitation emails to each tester in the test, and add entitlement on the acceptance.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "202": { + "description": "Accept. Return a URL to track the resource in 'Location' header.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Content type of the response; only application/json supported.", + "enum":["text/plain"] + }, + "Location": { + "type": "string", + "description": "Relative URL to get the resource." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "startBetaTestV1" + } + }, + "/v1/skills/{skillId}/betaTest/end": { + "post": { + "tags": [ + "skillManagement" + ], + "summary": "End beta test.", + "description": "End a beta test for a given Alexa skill. System will revoke the entitlement of each tester and send access-end notification email to them.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "202": { + "description": "Accept. Return a URL to track the resource in 'Location' header.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Content type of the response; only application/json supported.", + "enum":["text/plain"] + }, + "Location": { + "type": "string", + "description": "Relative URL to get the resource." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "endBetaTestV1" + } + }, + "/v1/skills/{skillId}/betaTest/testers": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "List testers.", + "description": "List all testers in a beta test for the given Alexa skill.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 500 results, you can add this parameter to your request. The response might contain fewer results than maxResults, but it will never contain more.", + "required": false, + "type": "integer", + "maximum": 500, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "Success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Content type of the response; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.betaTest.testers.ListTestersResponse" + } + }, + "400": { + "description": "Bad request.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getListOfTestersV1" + } + }, + "/v1/skills/{skillId}/betaTest/testers/add": { + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Add testers to an existing beta test.", + "description": "Add testers to a beta test for the given Alexa skill. System will send invitation email to each tester and add entitlement on the acceptance.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "TestersRequest", + "description": "JSON object containing the email address of beta testers.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.betaTest.testers.TestersList" + } + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Content type of the response; only application/json supported.", + "enum":["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "addTestersToBetaTestV1" + } + }, + "/v1/skills/{skillId}/betaTest/testers/remove": { + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Remove testers from an existing beta test.", + "description": "Remove testers from a beta test for the given Alexa skill. System will send access end email to each tester and remove entitlement for them.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "TestersRequest", + "description": "JSON object containing the email address of beta testers.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.betaTest.testers.TestersList" + } + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Content type of the response; only application/json supported.", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "removeTestersFromBetaTestV1" + } + }, + "/v1/skills/{skillId}/betaTest/testers/sendReminder": { + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Send reminder to testers in a beta test.", + "description": "Send reminder to the testers in a beta test for the given Alexa skill. System will send invitation email to each tester and add entitlement on the acceptance.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "TestersRequest", + "description": "JSON object containing the email address of beta testers.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.betaTest.testers.TestersList" + } + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Content type of the response; only application/json supported.", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "sendReminderToTestersV1" + } + }, + "/v1/skills/{skillId}/betaTest/testers/requestFeedback": { + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Request feedback from testers.", + "description": "Request feedback from the testers in a beta test for the given Alexa skill. System will send notification emails to testers to request feedback.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "TestersRequest", + "description": "JSON object containing the email address of beta testers.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.betaTest.testers.TestersList" + } + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Content type of the response; only application/json supported.", + "enum": [ + "text/plain" + ] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "requestFeedbackFromTestersV1" + } + }, + "/v1/skills/{skillId}/stages/{stageV2}/blueprint/details": {}, + "/v1/skills/{skillId}/stages/{stageV2}/blueprint/data/locales/{locale}": {}, + "/v1/blueprints/{blueprintId}/versions/{blueprintVersion}/skills": {}, + "/v1/skills/{skillId}/certifications": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get list of all certifications available for a skill, including information about past certifications and any ongoing certification. The default sort order is descending on skillSubmissionTimestamp for Certifications.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "Returns list of certifications for the skillId.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. only application/hal+json supported.", + "enum": [ + "application/hal+json", + "text/plain" + ] + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.certification.ListCertificationsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. if any request parameter is invalid like certification Id or pagination token etc. If the maxResults is not in the range of 1 to 50, it also qualifies for this error.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. Only application/json supported.", + "enum": [ + "application/json" + ] + }, + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. Only en-US, ja-JP supported for this API currently.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. Only application/json supported.", + "enum": [ + "application/json" + ] + }, + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. Only en-US, ja-JP supported for this API currently.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "The resource being requested is not found.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. Only application/json supported.", + "enum": [ + "application/json" + ] + }, + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. Only en-US, ja-JP supported for this API currently.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceeded the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. Only application/json supported.", + "enum": [ + "application/json" + ] + }, + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. Only en-US, ja-JP supported for this API currently.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. Only application/json supported.", + "enum": [ + "application/json" + ] + }, + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. Only en-US, ja-JP supported for this API currently.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getCertificationsListV1" + } + }, + "/v1/skills/{skillId}/certifications/{certificationId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Gets a specific certification resource. The response contains the review tracking information for a skill to show how much time the skill is expected to remain under review by Amazon. Once the review is complete, the response also contains the outcome of the review. Old certifications may not be available, however any ongoing certification would always give a response. If the certification is unavailable the result will return a 404 HTTP status code.\n", + "parameters": [ + { + "name": "Accept-Language", + "in": "header", + "description": "User's locale/language in context.", + "required": false, + "type": "string" + }, + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "certificationId", + "in": "path", + "description": "Id of the certification. Reserved word identifier of mostRecent can be used to get the most recent certification for the skill. Note that the behavior of the API in this case would be the same as when the actual certification id of the most recent certification is used in the request.\n", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Successfully retrieved skill certification information.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. Only application/json supported.", + "enum": [ + "application/json" + ] + }, + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. Only en-US, ja-JP supported for this API currently.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.certification.CertificationResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. if any request parameter is invalid like certification Id or pagination token etc. If the maxResults is not in the range of 1 to 50, it also qualifies for this error.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. Only application/json supported.", + "enum": [ + "application/json" + ] + }, + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. Only en-US, ja-JP supported for this API currently.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. Only application/json supported.", + "enum": [ + "application/json" + ] + }, + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. Only en-US, ja-JP supported for this API currently.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "The resource being requested is not found.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. Only application/json supported.", + "enum": [ + "application/json" + ] + }, + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. Only en-US, ja-JP supported for this API currently.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceeded the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. only application/json supported", + "enum": [ + "application/json" + ] + }, + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. Only en-US, ja-JP supported for this API currently.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. Only application/json supported.", + "enum": [ + "application/json" + ] + }, + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. Only en-US, ja-JP supported for this API currently.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getCertificationReviewV1" + } + }, + "/v1/skills/{skillId}/stages/{stage}/enablement": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Checks whether an enablement exist for given skillId/stage and customerId (retrieved from Auth token)", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + } + ], + "responses": { + "204": { + "description": "No Content; Confirms that enablement resource exists for given skillId & stage.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Contains content type of the response; only application/json supported.", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getSkillEnablementStatusV1" + }, + "put": { + "tags": [ + "skillManagement" + ], + "description": "Creates/Updates the enablement for given skillId/stage and customerId (retrieved from Auth token)", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + } + ], + "responses": { + "204": { + "description": "No Content; Confirms that enablement is successfully created/updated.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Contains content type of the response; only application/json supported.", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "setSkillEnablementV1" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Deletes the enablement for given skillId/stage and customerId (retrieved from Auth token).", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + } + ], + "responses": { + "204": { + "description": "No Content; Confirms that enablement is successfully deleted.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Contains content type of the response; only application/json supported.", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "deleteSkillEnablementV1" + } + }, + "/v1/skills/{skillId}/stages/{stage}/interactionModel/locales/{locale}/profileNlu": { + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Profile a test utterance.", + "description": "This is a synchronous API that profiles an utterance against interaction model.", + "parameters": [ + { + "in": "body", + "name": "profileNluRequest", + "description": "Payload sent to the profile nlu API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.evaluations.ProfileNluRequest" + } + }, + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + }, + { + "name": "locale", + "in": "path", + "description": "The locale for the model requested e.g. en-GB, en-US, de-DE.", + "required": true, + "type": "string", + "format": "languager-region; same as BCP-47 language tag format" + } + ], + "responses": { + "200": { + "description": "Profiled utterance against interaction model and returned nlu response successfully.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.evaluations.ProfileNluResponse" + } + }, + "400": { + "description": "Bad request due to invalid or missing data.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "409": { + "description": "This requests conflicts with another one currently being processed.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "API user has exceeded the permitted request rate.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal service error.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + } + } + }, + "x-operation-name": "profileNluV1" + } + }, + "/v1/skills/{skillId}/experiments": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Gets a list of all experiments associated with this skill id.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "Returned skill experiments.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only 'application/json' supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.experiment.ListExperimentsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "listExperimentsV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "description": "Create a new experiment for a skill.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "createExperimentRequest", + "description": "Defines the request body for creating an experiment.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.experiment.CreateExperimentRequest" + } + } + ], + "responses": { + "201": { + "description": "Experiment created. Returns the generated experiment identifier in 'Location' header.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Content type of the response; only application/json supported.", + "enum": ["text/plain"] + }, + "Location": { + "type": "string", + "description": "Relative url to get experiment details." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "createExperimentV1" + } + }, + "/v1/skills/{skillId}/experiments/{experimentId}/properties": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Updates an existing experiment for a skill.\nCan only be called while the experiment is in CREATED state.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "experimentId", + "in": "path", + "description": "Identifies the experiment in a skill.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "updateExperimentRequest", + "description": "Defines the request body for updating an experiment.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.experiment.UpdateExperimentRequest" + } + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": {} + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "updateExperimentV1" + } + }, + "/v1/skills/{skillId}/experiments/{experimentId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Retrieves an existing experiment for a skill.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "experimentId", + "in": "path", + "description": "Identifies the experiment in a skill.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Returned skill experiment.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only 'application/json' supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.experiment.GetExperimentResponse" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getExperimentV1" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Deletes an existing experiment for a skill.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "experimentId", + "in": "path", + "description": "Identifies the experiment in a skill.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": {} + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "deleteExperimentV1" + } + }, + "/v1/skills/{skillId}/experiments/{experimentId}/exposurePercentage": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Updates the exposure of an experiment that is in CREATED or RUNNING state.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "experimentId", + "in": "path", + "description": "Identifies the experiment in a skill.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "updateExposureRequest", + "description": "Defines the request body for updating the exposure percentage of a running experiment.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.experiment.UpdateExposureRequest" + } + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": {} + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "updateExposureV1" + } + }, + "/v1/skills/{skillId}/experiments/{experimentId}/treatmentOverrides/~current": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Retrieves the current user's customer treatment override for an existing A/B Test experiment.\nThe current user must be under the same skill vendor of the requested skill id to have access to the resource.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "experimentId", + "in": "path", + "description": "Identifies the experiment in a skill.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Returned customer treatment override details.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only 'application/json' supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.experiment.GetCustomerTreatmentOverrideResponse" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getCustomerTreatmentOverrideV1" + }, + "put": { + "tags": [ + "skillManagement" + ], + "description": "Adds the requesting user's customer treatment override to an existing experiment.\nThe current user must be under the same skill vendor of the requested skill id to have access to the resource.\nOnly the current user can attempt to add the override of their own customer account to an experiment.\nCan only be called before the experiment is enabled.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "experimentId", + "in": "path", + "description": "Identifies the experiment in a skill.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "setCustomerTreatmentOverrideRequest", + "description": "Defines the request body for adding this customer's treatment override to an experiment.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.experiment.SetCustomerTreatmentOverrideRequest" + } + } + ], + "responses": { + "204": { + "description": "Success. No content.", + "headers": {} + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "setCustomerTreatmentOverrideV1" + } + }, + "/v1/skills/{skillId}/experiments/{experimentId}/state": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Retrieves the current state of the experiment.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "experimentId", + "in": "path", + "description": "Identifies the experiment in a skill.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Returned skill experiment state.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only 'application/json' supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.experiment.GetExperimentStateResponse" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getExperimentStateV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "description": "Requests an action on the experiment to move it to the targetState.\nAcceptable targetState values are:\n* `ENABLED`: Experiment configurations are deployed and customer overrides are enabled. Actual experiment has not started yet but customers with overrides set to T1 will see the T1 behavior. Initial state must be CREATED.\n* `RUNNING`: Starts the experiment with the configured exposure. Skill customers selected to be in the experiment will start contributing to the metric data. Initial state must be CREATED or ENABLED.\n* `STOPPED`: Stops the experiment by removing the experiment configurations. All customer treatment overrides are removed. Initial state must be ENABLED or RUNNING.\n Final state for ENDPOINT_BASED experiments, no further action is taken by ASK. It is expected that the skill builder updates their endpoint code to make T1 the default live behavior.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "experimentId", + "in": "path", + "description": "Identifies the experiment in a skill.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "manageExperimentStateRequest", + "description": "Defines the request body for performing an experiment action to move it to a target state.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.experiment.ManageExperimentStateRequest" + } + } + ], + "responses": { + "202": { + "description": "Accepted; Returns a URL to track the experiment state in 'Location' header.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Contains content type of the response; only application/json supported.", + "enum":["text/plain"] + }, + "Location": { + "type": "string", + "description": "Contains relative URL to get experiment state." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "manageExperimentStateV1" + } + }, + "/v1/skills/{skillId}/experiments/{experimentId}/metricSnapshots": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Gets a list of all metric snapshots associated with this experiment id. The metric snapshots\nrepresent the metric data available for a time range.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "experimentId", + "in": "path", + "description": "Identifies the experiment in a skill.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "Returned experiment metric snapshots.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only 'application/json' supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.experiment.ListExperimentMetricSnapshotsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "listExperimentMetricSnapshotsV1" + } + }, + "/v1/skills/{skillId}/experiments/{experimentId}/metricSnapshots/{metricSnapshotId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Gets a list of all metric data associated with this experiment's metric snapshot.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "experimentId", + "in": "path", + "description": "Identifies the experiment in a skill.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "metricSnapshotId", + "in": "path", + "description": "Identifies the experiment metric snapshot in a skill experiment. The metric snapshot\nrepresents metric data for a date range.\n", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Returned experiment metric data.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only 'application/json' supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.experiment.GetExperimentMetricSnapshotResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getExperimentMetricSnapshotV1" + } + }, + "/v1/skills/{skillId}/history/intentRequests": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "The Intent Request History API provides customers with the aggregated and anonymized transcription of user speech data and intent request details for their skills.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "sortDirection", + "in": "query", + "description": "Sets the sorting direction of the result items. When set to 'asc' these items are returned in ascending order of sortField value and when set to 'desc' these items are returned in descending order of sortField value.", + "required": false, + "type": "string" + }, + { + "name": "sortField", + "in": "query", + "description": "Sets the field on which the sorting would be applied.", + "required": false, + "type": "string" + }, + { + "name": "stage", + "in": "query", + "description": "The stage of the skill to be used for evaluation. An error will be returned if this skill stage is not enabled on the account used for evaluation.", + "required": true, + "type": "string", + "enum": [ + "development", + "live" + ] + }, + { + "name": "locale", + "in": "query", + "required": false, + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.history.localeInQuery" + } + }, + { + "name": "dialogAct.name", + "in": "query", + "description": "A filter used to retrieve items where the dialogAct name is equal to the given value.\n* `Dialog.ElicitSlot`: Alexa asked the user for the value of a specific slot. (https://developer.amazon.com/docs/custom-skills/dialog-interface-reference.html#elicitslot)\n* `Dialog.ConfirmSlot`: Alexa confirmed the value of a specific slot before continuing with the dialog. (https://developer.amazon.com/docs/custom-skills/dialog-interface-reference.html#confirmslot)\n* `Dialog.ConfirmIntent`: Alexa confirmed the all the information the user has provided for the intent before the skill took action. (https://developer.amazon.com/docs/custom-skills/dialog-interface-reference.html#confirmintent)\n", + "required": false, + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.history.DialogActName" + } + }, + { + "name": "intent.confidence.bin", + "in": "query", + "required": false, + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.history.IntentConfidenceBin" + } + }, + { + "name": "intent.name", + "in": "query", + "description": "A filter used to retrieve items where the intent name is equal to the given value.", + "required": false, + "type": "array", + "items": { + "type": "string" + } + }, + { + "name": "intent.slots.name", + "in": "query", + "description": "A filter used to retrieve items where the one of the slot names is equal to the given value.", + "required": false, + "type": "array", + "items": { + "type": "string" + } + }, + { + "name": "interactionType", + "in": "query", + "required": false, + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.history.InteractionType" + } + }, + { + "name": "publicationStatus", + "in": "query", + "required": false, + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.history.PublicationStatus" + } + }, + { + "name": "utteranceText", + "in": "query", + "description": "A filter used to retrieve items where the utterance text contains the given phrase. Each filter value can be at-least 1 character and at-most 100 characters long.", + "required": false, + "type": "array", + "items": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Returns a list of utterance items for the given skill.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json+hal supported" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.history.IntentRequests" + } + }, + "400": { + "description": "Bad Request.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "Unauthorized.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "404": { + "description": "Skill Not Found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getUtteranceDataV1" + } + }, + "/v1/skills/{skillId}/stages/{stageV2}/interactionModel/locales/{locale}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Gets the `InteractionModel` for the skill in the given stage.\nThe path params **skillId**, **stage** and **locale** are required.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stageV2", + "in": "path", + "description": "Stages of a skill including the new certified stage.\n* `development` - skills which are currently in development corresponds to this stage.\n* `certified` - skills which have completed certification and ready for publishing corresponds to this stage.\n* `live` - skills which are currently live corresponds to this stage.\n", + "required": true, + "type": "string" + }, + { + "name": "locale", + "in": "path", + "description": "The locale for the model requested e.g. en-GB, en-US, de-DE.", + "required": true, + "type": "string", + "format": "languager-region; same as BCP-47 language tag format" + } + ], + "responses": { + "200": { + "description": "Returns interaction model object on success.", + "headers": { + "ETag": { + "type": "string", + "description": "Identifer for the version of the resource, can be used for conditional updates." + }, + "Content-Type": { + "type": "string", + "description": "Returned content type, only 'application/json' supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.InteractionModelData" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill doesn't exist or there is no model defined for the locale.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getInteractionModelV1" + }, + "head": { + "tags": [ + "skillManagement" + ], + "description": "Get the latest metadata for the interaction model resource for the given stage.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stageV2", + "in": "path", + "description": "Stages of a skill including the new certified stage.\n* `development` - skills which are currently in development corresponds to this stage.\n* `certified` - skills which have completed certification and ready for publishing corresponds to this stage.\n* `live` - skills which are currently live corresponds to this stage.\n", + "required": true, + "type": "string" + }, + { + "name": "locale", + "in": "path", + "description": "The locale for the model requested e.g. en-GB, en-US, de-DE.", + "required": true, + "type": "string", + "format": "languager-region; same as BCP-47 language tag format" + } + ], + "responses": { + "204": { + "description": "Success. There is no content but returns etag.", + "headers": { + "ETag": { + "type": "string", + "description": "Identifer for the version of the resource, can be used for conditional updates" + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill or stage or locale does not exist", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getInteractionModelMetadataV1" + }, + "put": { + "tags": [ + "skillManagement" + ], + "description": "Creates an `InteractionModel` for the skill.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stageV2", + "in": "path", + "description": "Stages of a skill including the new certified stage.\n* `development` - skills which are currently in development corresponds to this stage.\n* `certified` - skills which have completed certification and ready for publishing corresponds to this stage.\n* `live` - skills which are currently live corresponds to this stage.\n", + "required": true, + "type": "string" + }, + { + "name": "locale", + "in": "path", + "description": "The locale for the model requested e.g. en-GB, en-US, de-DE.", + "required": true, + "type": "string", + "format": "languager-region; same as BCP-47 language tag format" + }, + { + "in": "body", + "name": "interactionModel", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.InteractionModelData" + } + }, + { + "name": "If-Match", + "in": "header", + "description": "Request header that specified an entity tag. The server will update the resource only if the eTag matches with the resource's current eTag.", + "required": false, + "type": "string" + } + ], + "responses": { + "202": { + "description": "Returns build status location link on success.", + "headers": { + "Location": { + "type": "string", + "description": "Build status URL." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. the input interaction model is invalid.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill or stage or locale does not exist.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "412": { + "description": "Precondition failed.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "setInteractionModelV1" + } + }, + "/v1/skills/api/custom/interactionModel/catalogs": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "List all catalogs for the vendor.\n", + "parameters": [ + { + "name": "vendorId", + "in": "query", + "description": "The vendor ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "sortDirection", + "in": "query", + "description": "Sets the sorting direction of the result items. When set to 'asc' these items are returned in ascending order of sortField value and when set to 'desc' these items are returned in descending order of sortField value.", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Returns list of catalogs for the vendor.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.catalog.ListCatalogResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no catalog defined for the catalogId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "listInteractionModelCatalogsV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "description": "Create a new version of catalog within the given catalogId.\n", + "parameters": [ + { + "in": "body", + "name": "catalog", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.catalog.DefinitionData" + } + } + ], + "responses": { + "200": { + "description": "Returns the generated catalogId.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.catalog.CatalogResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. the catalog definition is invalid.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "412": { + "description": "Precondition failed.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "createInteractionModelCatalogV1" + } + }, + "/v1/skills/api/custom/interactionModel/catalogs/{catalogId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "get the catalog definition\n", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + } + ], + "responses": { + "200": { + "description": "the catalog definition", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.catalog.CatalogDefinitionOutput" + } + }, + "400": { + "description": "The catalog cannot be retrieved due to errors listed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no catalog defined for the catalogId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getInteractionModelCatalogDefinitionV1" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Delete the catalog.\n", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + } + ], + "responses": { + "204": { + "description": "No content; just confirm the catalog is deleted.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported.", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "The catalog cannot be deleted from reasons due to in-use by other entities.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no catalog defined for the catalogId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "deleteInteractionModelCatalogV1" + } + }, + "/v1/skills/api/custom/interactionModel/catalogs/{catalogId}/updateRequest/{updateRequestId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the status of catalog resource and its sub-resources for a given catalogId.\n", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "name": "updateRequestId", + "in": "path", + "description": "The identifier for slotType version creation process", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Returns the build status and error codes for the given catalogId", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.catalog.CatalogStatus" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no catalog defined for the catalogId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getInteractionModelCatalogUpdateStatusV1" + } + }, + "/v1/skills/api/custom/interactionModel/catalogs/{catalogId}/update": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "update description and vendorGuidance string for certain version of a catalog.\n", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "in": "body", + "name": "updateRequest", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.catalog.UpdateRequest" + } + } + ], + "responses": { + "204": { + "description": "No content, indicates the fields were successfully updated." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no catalog defined for the catalogId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "updateInteractionModelCatalogV1" + } + }, + "/v1/skills/{skillId}/stages/{stage}/interactionModel/locales/{locale}/versions/{version}/conflictDetectionJobStatus": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Retrieve conflict detection job status for skill.", + "description": "This API returns the job status of conflict detection job for a specified interaction model.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "locale", + "in": "path", + "description": "The locale for the model requested e.g. en-GB, en-US, de-DE.", + "required": true, + "type": "string", + "format": "languager-region; same as BCP-47 language tag format" + }, + { + "name": "stage", + "in": "path", + "description": "Stage of the interaction model.", + "required": true, + "type": "string", + "enum": [ + "development" + ] + }, + { + "name": "version", + "in": "path", + "description": "Version of interaction model. Use \"~current\" to get the model of the current version.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Get conflict detection results successfully.", + "headers": { + "Content-Type": { + "type": "string", + "description": "returned content type, only application/json supported" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.conflictDetection.GetConflictDetectionJobStatusResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no catalog defined for the catalogId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getConflictDetectionJobStatusForInteractionModelV1" + } + }, + "/v1/skills/{skillId}/stages/{stage}/interactionModel/locales/{locale}/versions/{version}/conflicts": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Retrieve conflict detection results for a specified interaction model.", + "description": "This is a paginated API that retrieves results of conflict detection job for a specified interaction model.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "locale", + "in": "path", + "description": "The locale for the model requested e.g. en-GB, en-US, de-DE.", + "required": true, + "type": "string", + "format": "languager-region; same as BCP-47 language tag format" + }, + { + "name": "stage", + "in": "path", + "description": "Stage of the interaction model.", + "required": true, + "type": "string", + "enum": [ + "development" + ] + }, + { + "name": "version", + "in": "path", + "description": "Version of interaction model. Use \"~current\" to get the model of the current version.", + "required": true, + "type": "string" + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. Defaults to 100. If more results are present, the response will contain a nextToken and a _link.next href.", + "required": false, + "type": "number", + "default": 100, + "maximum": 1000, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "Get conflict detection results sucessfully.", + "headers": { + "Content-Type": { + "type": "string", + "description": "returned content type, only application/json supported" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.conflictDetection.GetConflictsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no catalog defined for the catalogId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getConflictsForInteractionModelV1" + } + }, + "/v1/skills/api/custom/interactionModel/catalogs/{catalogId}/versions": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "List all the historical versions of the given catalogId.", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "sortDirection", + "in": "query", + "description": "Sets the sorting direction of the result items. When set to 'asc' these items are returned in ascending order of sortField value and when set to 'desc' these items are returned in descending order of sortField value.", + "required": false, + "type": "string" + }, + { + "name": "sortField", + "in": "query", + "description": "Sets the field on which the sorting would be applied.", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Returns list of catalogs for the vendor.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.version.ListCatalogEntityVersionsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. the catalog definition is invalid.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified catalog does not exist.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "listInteractionModelCatalogVersionsV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "description": "Create a new version of catalog entity for the given catalogId.\n", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "in": "body", + "name": "catalog", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.version.VersionData" + } + } + ], + "responses": { + "202": { + "description": "Returns update status location link on success.", + "headers": { + "Location": { + "type": "string", + "description": "The location of the catalog status to track." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. the catalog definition is invalid.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified catalog does not exist.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "createInteractionModelCatalogVersionV1" + } + }, + "/v1/skills/api/custom/interactionModel/catalogs/{catalogId}/versions/{version}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get catalog version data of given catalog version.\n", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "name": "version", + "in": "path", + "description": "Version for interaction model.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Returns the catalog version metadata for the given catalogId and version.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.version.CatalogVersionData" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no catalog defined for the catalogId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getInteractionModelCatalogVersionV1" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Delete catalog version.\n", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "name": "version", + "in": "path", + "description": "Version for interaction model.", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "No Content; Confirms that version is successfully deleted." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no catalog version for this catalogId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "deleteInteractionModelCatalogVersionV1" + } + }, + "/v1/skills/api/custom/interactionModel/catalogs/{catalogId}/versions/{version}/update": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Update description and vendorGuidance string for certain version of a catalog.\n", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "name": "version", + "in": "path", + "description": "Version for interaction model.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "catalogUpdate", + "required": false, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.version.catalogUpdate" + } + } + ], + "responses": { + "204": { + "description": "No Content; Confirms that version is successfully updated." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no catalog defined for the catalogId", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "updateInteractionModelCatalogVersionV1" + } + }, + "/v1/skills/api/custom/interactionModel/catalogs/{catalogId}/versions/{version}/values": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get catalog values from the given catalogId & version.\n", + "parameters": [ + { + "name": "catalogId", + "in": "path", + "description": "Provides a unique identifier of the catalog.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1, + "format": "Amazon Common Identifier" + }, + { + "name": "version", + "in": "path", + "description": "Version for interaction model.", + "required": true, + "type": "string" + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Returns list of catalog values for the given catalogId and version.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.version.CatalogValues" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no catalog defined for the catalogId", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getInteractionModelCatalogValuesV1" + } + }, + "/v1/skills/{skillId}/stages/{stageV2}/interactionModel/locales/{locale}/versions/{version}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Gets the specified version `InteractionModel` of a skill for the vendor. Use `~current` as version parameter to get the current version model.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stageV2", + "in": "path", + "description": "Stages of a skill including the new certified stage.\n* `development` - skills which are currently in development corresponds to this stage.\n* `certified` - skills which have completed certification and ready for publishing corresponds to this stage.\n* `live` - skills which are currently live corresponds to this stage.\n", + "required": true, + "type": "string" + }, + { + "name": "locale", + "in": "path", + "description": "The locale for the model requested e.g. en-GB, en-US, de-DE.", + "required": true, + "type": "string", + "format": "languager-region; same as BCP-47 language tag format" + }, + { + "name": "version", + "in": "path", + "description": "Version for interaction model.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Returns interaction model object on success.", + "headers": { + "ETag": { + "type": "string", + "description": "Identifer for the version of the resource, can be used for conditional updates." + }, + "Content-Type": { + "type": "string", + "description": "Returned content type, only 'application/json' supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.InteractionModelData" + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. the input interaction model is invalid.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill doesn't exist or there is no model defined for the locale or version.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getInteractionModelVersionV1" + } + }, + "/v1/skills/{skillId}/stages/{stageV2}/interactionModel/locales/{locale}/versions": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the list of interactionModel versions of a skill for the vendor.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stageV2", + "in": "path", + "description": "Stages of a skill including the new certified stage.\n* `development` - skills which are currently in development corresponds to this stage.\n* `certified` - skills which have completed certification and ready for publishing corresponds to this stage.\n* `live` - skills which are currently live corresponds to this stage.\n", + "required": true, + "type": "string" + }, + { + "name": "locale", + "in": "path", + "description": "The locale for the model requested e.g. en-GB, en-US, de-DE.", + "required": true, + "type": "string", + "format": "languager-region; same as BCP-47 language tag format" + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "sortDirection", + "in": "query", + "description": "Sets the sorting direction of the result items. When set to 'asc' these items are returned in ascending order of sortField value and when set to 'desc' these items are returned in descending order of sortField value.", + "required": false, + "type": "string" + }, + { + "name": "sortField", + "in": "query", + "description": "Sets the field on which the sorting would be applied.", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Returns list of interactionModel versions of a skill for the vendor.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.version.ListResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. the input interaction model is invalid.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill doesn't exist or there is no model defined for the locale.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "listInteractionModelVersionsV1" + } + }, + "/v1/skills/api/custom/interactionModel/slotTypes": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "List all slot types for the vendor.\n", + "parameters": [ + { + "name": "vendorId", + "in": "query", + "description": "The vendor ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "sortDirection", + "in": "query", + "description": "Sets the sorting direction of the result items. When set to 'asc' these items are returned in ascending order of sortField value and when set to 'desc' these items are returned in descending order of sortField value.", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Returns list of slot types for the vendor.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.type.ListSlotTypeResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "listInteractionModelSlotTypesV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "description": "Create a new version of slot type within the given slotTypeId.\n", + "parameters": [ + { + "in": "body", + "name": "slotType", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.type.DefinitionData" + } + } + ], + "responses": { + "200": { + "description": "Returns the generated slotTypeId.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.type.SlotTypeResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. the slot type definition is invalid.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "createInteractionModelSlotTypeV1" + } + }, + "/v1/skills/api/custom/interactionModel/slotTypes/{slotTypeId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the slot type definition.\n", + "parameters": [ + { + "name": "slotTypeId", + "in": "path", + "description": "The identifier for a slot type.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "The slot type definition.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.type.SlotTypeDefinitionOutput" + } + }, + "400": { + "description": "The slot type cannot be retrieved due to errors listed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no slot type defined for the slotTypeId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getInteractionModelSlotTypeDefinitionV1" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Delete the slot type.\n", + "parameters": [ + { + "name": "slotTypeId", + "in": "path", + "description": "The identifier for a slot type.", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "No content; just confirm the slot type is deleted.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported.", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "The slot type cannot be deleted from reasons due to in-use by other entities.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no slot type defined for the slotTypeId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "deleteInteractionModelSlotTypeV1" + } + }, + "/v1/skills/api/custom/interactionModel/slotTypes/{slotTypeId}/updateRequest/{updateRequestId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the status of slot type resource and its sub-resources for a given slotTypeId.\n", + "parameters": [ + { + "name": "slotTypeId", + "in": "path", + "description": "The identifier for a slot type.", + "required": true, + "type": "string" + }, + { + "name": "updateRequestId", + "in": "path", + "description": "The identifier for slotType version creation process", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Returns the build status and error codes for the given slotTypeId.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.type.SlotTypeStatus" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no slot type defined for the slotTypeId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getInteractionModelSlotTypeBuildStatusV1" + } + }, + "/v1/skills/api/custom/interactionModel/slotTypes/{slotTypeId}/update": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Update description and vendorGuidance string for certain version of a slot type.\n", + "parameters": [ + { + "name": "slotTypeId", + "in": "path", + "description": "The identifier for a slot type.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "updateRequest", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.type.UpdateRequest" + } + } + ], + "responses": { + "204": { + "description": "No content, indicates the fields were successfully updated." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no slot type defined for the slotTypeId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "updateInteractionModelSlotTypeV1" + } + }, + "/v1/skills/api/custom/interactionModel/jobs": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Retrieve a list of jobs associated with the vendor.", + "parameters": [ + { + "name": "vendorId", + "in": "query", + "description": "The vendor ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "List of all jobs associated with the vendor.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Contains content type of the response; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.ListJobDefinitionsResponse" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "listJobDefinitionsForInteractionModelV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "description": "Creates a new Job Definition from the Job Definition request provided. This can be either a CatalogAutoRefresh, which supports time-based configurations for catalogs, or a ReferencedResourceVersionUpdate, which is used for slotTypes and Interaction models to be automatically updated on the dynamic update of their referenced catalog.\n", + "parameters": [ + { + "in": "body", + "name": "createJobDefinitionRequest", + "description": "Request to create a new Job Definition.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.CreateJobDefinitionRequest" + } + } + ], + "responses": { + "201": { + "description": "Returns the generated jobId.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.CreateJobDefinitionResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.ValidationErrors" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "createJobDefinitionForInteractionModelV1" + } + }, + "/v1/skills/api/custom/interactionModel/jobs/{jobId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the job definition for a given jobId.\n", + "parameters": [ + { + "name": "jobId", + "in": "path", + "description": "The identifier for dynamic jobs.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "The job definition for a given jobId.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.JobDefinition" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getJobDefinitionForInteractionModelV1" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Delete the job definition for a given jobId.", + "parameters": [ + { + "name": "jobId", + "in": "path", + "description": "The identifier for dynamic jobs.", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "No content, confirms the resource is updated.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.ValidationErrors" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "deleteJobDefinitionForInteractionModelV1" + } + }, + "/v1/skills/api/custom/interactionModel/jobs/{jobId}/status": { + "put": { + "tags": [ + "skillManagement" + ], + "description": "Update the JobStatus to Enable or Disable a job.", + "parameters": [ + { + "name": "jobId", + "in": "path", + "description": "The identifier for dynamic jobs.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "updateJobStatusRequest", + "description": "Request to update Job Definition status.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.UpdateJobStatusRequest" + } + } + ], + "responses": { + "204": { + "description": "No content; Confirms that the fields are updated.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported.", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Contains content type of the response; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.ValidationErrors" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "setJobStatusForInteractionModelV1" + } + }, + "/v1/skills/api/custom/interactionModel/jobs/{jobId}/executions": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "List the execution history associated with the job definition, with default sortField to be the executions' timestamp.", + "parameters": [ + { + "name": "jobId", + "in": "path", + "description": "The identifier for dynamic jobs.", + "required": true, + "type": "string" + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "sortDirection", + "in": "query", + "description": "Sets the sorting direction of the result items. When set to 'asc' these items are returned in ascending order of sortField value and when set to 'desc' these items are returned in descending order of sortField value.", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Retrun list of executions associated with the job definition.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Contains content type of the response; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.GetExecutionsResponse" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "listJobExecutionsForInteractionModelV1" + } + }, + "/v1/skills/api/custom/interactionModel/jobs/{jobId}/executions/{executionId}": { + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Cancel the next execution for the given job.", + "parameters": [ + { + "name": "jobId", + "in": "path", + "description": "The identifier for dynamic jobs.", + "required": true, + "type": "string" + }, + { + "name": "executionId", + "in": "path", + "description": "The identifier for dynamic job executions. Currently only allowed for scheduled executions.", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "No Content; Confirms that the next execution is canceled.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported.", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.ValidationErrors" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "cancelNextJobExecutionForInteractionModelV1" + } + }, + "/v1/skills/api/custom/interactionModel/slotTypes/{slotTypeId}/versions": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "List all slot type versions for the slot type id.\n", + "parameters": [ + { + "name": "slotTypeId", + "in": "path", + "description": "The identifier for a slot type.", + "required": true, + "type": "string" + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "sortDirection", + "in": "query", + "description": "Sets the sorting direction of the result items. When set to 'asc' these items are returned in ascending order of sortField value and when set to 'desc' these items are returned in descending order of sortField value.", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Returns list of slot type version for the slot type id.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.typeVersion.ListSlotTypeVersionResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "listInteractionModelSlotTypeVersionsV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "description": "Create a new version of slot type entity for the given slotTypeId.\n", + "parameters": [ + { + "name": "slotTypeId", + "in": "path", + "description": "The identifier for a slot type.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "slotType", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.typeVersion.VersionData" + } + } + ], + "responses": { + "202": { + "description": "Returns update status location link on success.", + "headers": { + "Location": { + "type": "string", + "description": "The location of the slot type status to track." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error e.g. the slot type definition is invalid.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified slot type does not exist.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "createInteractionModelSlotTypeVersionV1" + } + }, + "/v1/skills/api/custom/interactionModel/slotTypes/{slotTypeId}/versions/{version}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get slot type version data of given slot type version.\n", + "parameters": [ + { + "name": "slotTypeId", + "in": "path", + "description": "The identifier for a slot type.", + "required": true, + "type": "string" + }, + { + "name": "version", + "in": "path", + "description": "Version for interaction model.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Returns the slot type version metadata for the given slotTypeId and version.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/hal+json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.typeVersion.SlotTypeVersionData" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no slot type defined for the slotTypeId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getInteractionModelSlotTypeVersionV1" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Delete slot type version.\n", + "parameters": [ + { + "name": "slotTypeId", + "in": "path", + "description": "The identifier for a slot type.", + "required": true, + "type": "string" + }, + { + "name": "version", + "in": "path", + "description": "Version for interaction model.", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "No Content; Confirms that version is successfully deleted." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no slot type version for this slotTypeId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "deleteInteractionModelSlotTypeVersionV1" + } + }, + "/v1/skills/api/custom/interactionModel/slotTypes/{slotTypeId}/versions/{version}/update": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Update description and vendorGuidance string for certain version of a slot type.\n", + "parameters": [ + { + "name": "slotTypeId", + "in": "path", + "description": "The identifier for a slot type.", + "required": true, + "type": "string" + }, + { + "name": "version", + "in": "path", + "description": "Version for interaction model.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "slotTypeUpdate", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.interactionModel.typeVersion.slotTypeUpdate" + } + } + ], + "responses": { + "204": { + "description": "No Content; Confirms that version is successfully updated." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "There is no slot type defined for the slotTypeId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "updateInteractionModelSlotTypeVersionV1" + } + }, + "/v1/skills/{skillId}/invocations": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "This is a synchronous API that invokes the Lambda or third party HTTPS endpoint for a given skill. A successful response will contain information related to what endpoint was called, payload sent to and received from the endpoint. In cases where requests to this API results in an error, the response will contain an error code and a description of the problem. In cases where invoking the skill endpoint specifically fails, the response will contain a status attribute indicating that a failure occurred and details about what was sent to the endpoint. The skill must belong to and be enabled by the user of this API. Also, note that calls to the skill endpoint will timeout after 10 seconds.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "invokeSkillRequest", + "description": "Payload sent to the skill invocation API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.invocations.InvokeSkillRequest" + } + } + ], + "responses": { + "200": { + "description": "Skill was invoked.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v1.skill.invocations.InvokeSkillResponse" + } + }, + "400": { + "description": "Bad request due to invalid or missing data.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "API user does not have permission to call this API or is currently in a state that does not allow invocation of this skill.\n", + "headers": {}, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill does not exist.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "API user has exceeded the permitted request rate.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "invokeSkillV1" + } + }, + "/v1/skills/{skillId}/stages/{stageV2}/manifest": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Returns the skill manifest for given skillId and stage.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stageV2", + "in": "path", + "description": "Stages of a skill including the new certified stage.\n* `development` - skills which are currently in development corresponds to this stage.\n* `certified` - skills which have completed certification and ready for publishing corresponds to this stage.\n* `live` - skills which are currently live corresponds to this stage.\n", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response contains the latest version of skill manifest.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Contains content type of the response; only application/json supported." + }, + "ETag": { + "type": "string", + "description": "Identifer for the version of the resource can be used for conditional updates" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifestEnvelope" + } + }, + "303": { + "description": "See Other", + "headers": { + "Location": { + "type": "string", + "description": "Contains relative URL to get skill status." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getSkillManifestV1" + }, + "put": { + "tags": [ + "skillManagement" + ], + "description": "Updates skill manifest for given skillId and stage.", + "parameters": [ + { + "name": "If-Match", + "in": "header", + "description": "Request header that specified an entity tag. The server will update the resource only if the eTag matches with the resource's current eTag.", + "required": false, + "type": "string" + }, + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stageV2", + "in": "path", + "description": "Stages of a skill including the new certified stage.\n* `development` - skills which are currently in development corresponds to this stage.\n* `certified` - skills which have completed certification and ready for publishing corresponds to this stage.\n* `live` - skills which are currently live corresponds to this stage.\n", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "updateSkillRequest", + "description": "Defines the request body for updateSkill API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifestEnvelope" + } + } + ], + "responses": { + "202": { + "description": "Accepted; Returns a URL to track the status in 'Location' header.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Contains content type of the response; only application/json supported.", + "enum": ["text/plain", "application/json"] + }, + "Location": { + "type": "string", + "description": "Contains relative URL to get skill status." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "412": { + "description": "Precondition failed.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "updateSkillManifestV1" + } + }, + "/v1/skills/{skillId}/metrics": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get analytic metrics report of skill usage.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "startTime", + "in": "query", + "description": "The start time of query.", + "required": true, + "type": "string", + "format": "date-time" + }, + { + "name": "endTime", + "in": "query", + "description": "The end time of query (The maximum time duration is 1 week)", + "required": true, + "type": "string", + "format": "date-time" + }, + { + "name": "period", + "in": "query", + "description": "The aggregation period to use when retrieving the metric, follows ISO_8601#Durations format.", + "required": true, + "type": "string" + }, + { + "name": "metric", + "in": "query", + "description": "A distinct set of logic which predictably returns a set of data.", + "required": true, + "type": "string" + }, + { + "name": "stage", + "in": "query", + "description": "The stage of the skill (live, development).", + "required": true, + "type": "string" + }, + { + "name": "skillType", + "in": "query", + "description": "The type of the skill (custom, smartHome and flashBriefing).", + "required": true, + "type": "string" + }, + { + "name": "intent", + "in": "query", + "description": "The intent of the skill.", + "required": false, + "type": "string" + }, + { + "name": "locale", + "in": "query", + "description": "The locale for the skill. e.g. en-GB, en-US, de-DE and etc.", + "required": false, + "type": "string" + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Get analytic metrics report successfully.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.metrics.GetMetricDataResponse" + } + }, + "400": { + "description": "Bad request due to invalid or missing data.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getSkillMetricsV1" + } + }, + "/v1/skills/{skillId}/stages/{stage}/privateDistributionAccounts/{id}": { + "put": { + "tags": [ + "skillManagement" + ], + "description": "Add an id to the private distribution accounts.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + }, + { + "name": "id", + "in": "path", + "description": "ARN that a skill can be privately distributed to.", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only \"application/json\" supported.", + "enum": ["text/plain", "application/json"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "setPrivateDistributionAccountIdV1" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Remove an id from the private distribution accounts.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + }, + { + "name": "id", + "in": "path", + "description": "ARN that a skill can be privately distributed to.", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "Success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only \"application/json\" supported", + "enum": ["text/plain", "application/json"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "deletePrivateDistributionAccountIdV1" + } + }, + "/v1/skills/{skillId}/stages/{stage}/privateDistributionAccounts": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "List private distribution accounts.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "Returns list of private distribution accounts on success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.Private.ListPrivateDistributionAccountsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "listPrivateDistributionAccountsV1" + } + }, + "/v1/skills/{skillId}/publications": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "If the skill is in certified stage, initiate publishing immediately or set a date at which the skill can publish at.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "Accept-Language", + "in": "header", + "description": "User's locale/language in context.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "publishSkillRequest", + "description": "Defines the request body for publish skill API.", + "required": false, + "schema": { + "$ref": "#/definitions/v1.skill.publication.PublishSkillRequest" + } + } + ], + "responses": { + "202": { + "description": "Successfully processed skill publication request.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. only application/json supported.", + "enum": [ + "application/json" + ] + }, + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. Only en-US, ja-JP supported for this API currently.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.publication.SkillPublicationResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "publishSkillV1" + } + }, + "/v1/skills/{skillId}/publications/~latest": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Retrieves the latest skill publishing details of the certified stage of the skill. The publishesAtDate and\nstatus of skill publishing.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "Accept-Language", + "in": "header", + "description": "User's locale/language in context.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved latest skill publication information.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body. only application/json supported.", + "enum": [ + "application/json" + ] + }, + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. Only en-US, ja-JP supported for this API currently.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.publication.SkillPublicationResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getSkillPublicationsV1" + } + }, + "/v1/skills/{skillId}/simulations": { + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Simulate executing a skill with the given id.", + "description": "This is an asynchronous API that simulates a skill execution in the Alexa eco-system given an utterance text of what a customer would say to Alexa. A successful response will contain a header with the location of the simulation resource. In cases where requests to this API results in an error, the response will contain an error code and a description of the problem. The skill being simulated must be in development stage, and it must also belong to and be enabled by the user of this API. Concurrent requests per user is currently not supported.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "simulationsApiRequest", + "description": "Payload sent to the skill simulation API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.simulations.SimulationsApiRequest" + } + } + ], + "responses": { + "200": { + "description": "Skill simulation has successfully began.", + "headers": { + "Location": { + "type": "string", + "description": "Path to simulation resource." + }, + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.simulations.SimulationsApiResponse" + } + }, + "400": { + "description": "Bad request due to invalid or missing data.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "API user does not have permission to call this API or is currently in a state that does not allow simulation of this skill.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill does not exist.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "This requests conflicts with another one currently being processed.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "API user has exceeded the permitted request rate.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal service error.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "simulateSkillV1" + } + }, + "/v1/skills/{skillId}/simulations/{simulationId}": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Get the result of a previously executed simulation.", + "description": "This API gets the result of a previously executed simulation. A successful response will contain the status of the executed simulation. If the simulation successfully completed, the response will also contain information related to skill invocation. In cases where requests to this API results in an error, the response will contain an error code and a description of the problem. In cases where the simulation failed, the response will contain a status attribute indicating that a failure occurred and details about what was sent to the skill endpoint. Note that simulation results are stored for 10 minutes. A request for an expired simulation result will return a 404 HTTP status code.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "simulationId", + "in": "path", + "description": "Id of the simulation.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved skill simulation information.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.simulations.SimulationsApiResponse" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "API user does not have permission or is currently in a state that does not allow calls to this API.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill or simulation does not exist. The error response will contain a description that indicates the specific resource type that was not found.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "API user has exceeded the permitted request rate.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal service error.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getSkillSimulationV1" + } + }, + "/v1/skills/{skillId}/stages/{stage}/validations": { + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Validate a skill.", + "description": "This is an asynchronous API which allows a skill developer to execute various validations against their skill.\n", + "parameters": [ + { + "in": "body", + "name": "validationsApiRequest", + "description": "Payload sent to the skill validation API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.validations.ValidationsApiRequest" + } + }, + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + } + ], + "responses": { + "202": { + "description": "Skill validation has successfully begun.", + "headers": { + "Location": { + "type": "string", + "description": "Path to validation resource." + }, + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.validations.ValidationsApiResponse" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "API user does not have permission or is currently in a state that does not allow calls to this API.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill, stage or validation does not exist. The error response will contain a description that indicates the specific resource type that was not found.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "This requests conflicts with another one currently being processed.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "API user has exceeded the permitted request rate.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal service error.", + "headers": { + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. It falls back to en-US if the locale in the request is not supported.\n" + }, + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "submitSkillValidationV1" + } + }, + "/v1/skills/{skillId}/stages/{stage}/validations/{validationId}": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Get the result of a previously executed validation.", + "description": "This API gets the result of a previously executed validation. A successful response will contain the status of the executed validation. If the validation successfully completed, the response will also contain information related to executed validations. In cases where requests to this API results in an error, the response will contain a description of the problem. In cases where the validation failed, the response will contain a status attribute indicating that a failure occurred. Note that validation results are stored for 60 minutes. A request for an expired validation result will return a 404 HTTP status code.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "validationId", + "in": "path", + "description": "Id of the validation. Reserved word identifier of mostRecent can be used to get the most recent validation for the skill and stage. Note that the behavior of the API in this case would be the same as when the actual validation id of the most recent validation is used in the request.\n", + "required": true, + "type": "string" + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + }, + { + "name": "Accept-Language", + "in": "header", + "description": "User's locale/language in context.", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved skill validation information.", + "headers": { + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. It falls back to en-US if the locale in the request is not supported.\n" + }, + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.validations.ValidationsApiResponse" + } + }, + "403": { + "description": "API user does not have permission or is currently in a state that does not allow calls to this API.\n", + "headers": { + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. It falls back to en-US if the locale in the request is not supported.\n" + }, + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill, stage, or validation does not exist. The error response will contain a description that indicates the specific resource type that was not found.\n", + "headers": { + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. It falls back to en-US if the locale in the request is not supported.\n" + }, + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "This requests conflicts with another one currently being processed.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "API user has exceeded the permitted request rate.", + "headers": { + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. It falls back to en-US if the locale in the request is not supported.\n" + }, + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal service error.", + "headers": { + "Content-Language": { + "type": "string", + "description": "Standard HTTP header for language for which the content of the response is intended. It falls back to en-US if the locale in the request is not supported.\n" + }, + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + } + } + }, + "x-operation-name": "getSkillValidationsV1" + } + }, + "/v1/skills": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the list of skills for the vendor.", + "parameters": [ + { + "name": "vendorId", + "in": "query", + "description": "The vendor ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "skillId", + "in": "query", + "description": "The list of skillIds that you wish to get the summary for. A maximum of 10 skillIds can be specified to get the skill summary in single listSkills call. Please note that this parameter must not be used with 'nextToken' or/and 'maxResults' parameter.", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ], + "responses": { + "200": { + "description": "Returns list of skills for the vendor.", + "headers": { + "Content-Type": { + "type": "string", + "description": "returned content type; only application/json+hal supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.ListSkillResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "listSkillsForVendorV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "description": "Creates a new skill for given vendorId.", + "parameters": [ + { + "in": "body", + "name": "createSkillRequest", + "description": "Defines the request body for createSkill API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.createSkillRequest" + } + } + ], + "responses": { + "202": { + "description": "Accepted; Returns a URL to track the status in 'Location' header.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Contains content type of the response; only application/json supported." + }, + "Location": { + "type": "string", + "description": "Contains relative URL to get skill status." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.CreateSkillResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "createSkillForVendorV1" + } + }, + "/v1/skills/{skillId}": { + "delete": { + "tags": [ + "skillManagement" + ], + "description": "Delete the skill and model for given skillId.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "204": { + "description": "Success. No content." + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "deleteSkillV1" + } + }, + "/v1/skills/{skillId}/status": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the status of skill resource and its sub-resources for a given skillId.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "resource", + "in": "query", + "description": "Resource name for which status information is desired.\nIt is an optional, filtering parameter and can be used more than once, to retrieve status for all the desired (sub)resources only, in single API call.\nIf this parameter is not specified, status for all the resources/sub-resources will be returned.\n", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Returns status for skill resource and sub-resources.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.SkillStatus" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getSkillStatusV1" + } + }, + "/v1/skills/{skillId}/credentials": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the client credentials for the skill.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Response contains the skill credentials.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.SkillCredentials" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getSkillCredentialsV1" + } + }, + "/v1/skills/{skillId}/sslCertificateSets/~latest": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Returns the ssl certificate sets currently associated with this skill. Sets consist of one ssl certificate blob associated with a region as well as the default certificate for the skill.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Response contains the latest version of the ssl certificates.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Contains content type of the response; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.SSLCertificatePayload" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getSSLCertificatesV1" + }, + "put": { + "tags": [ + "skillManagement" + ], + "description": "Updates the ssl certificates associated with this skill.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "sslCertificatePayload", + "description": "Defines the input/output of the ssl certificates api for a skill.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.SSLCertificatePayload" + } + } + ], + "responses": { + "204": { + "description": "Accepted; Request was successful and get will now result in the new values.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Contains content type of the response; only application/json supported.", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "setSSLCertificatesV1" + } + }, + "/v1/skills/{skillId}/submit": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Submit the skill for certification.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "submitSkillForCertificationRequest", + "description": "Defines the request body for submitSkillForCertification API.", + "required": false, + "schema": { + "$ref": "#/definitions/v1.skill.SubmitSkillForCertificationRequest" + } + } + ], + "responses": { + "202": { + "description": "Success. There is no content but returns Location in the header.", + "headers": { + "Location": { + "type": "string", + "description": "Certification resource URL." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "submitSkillForCertificationV1" + } + }, + "/v1/skills/{skillId}/withdraw": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Withdraws the skill from certification.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "withdrawRequest", + "description": "The reason and message (in case of OTHER) to withdraw a skill.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.WithdrawRequest" + } + } + ], + "responses": { + "204": { + "description": "Success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported.", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "withdrawSkillFromCertificationV1" + } + }, + "/v1/skills/{skillId}/versions": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Retrieve a list of all skill versions associated with this skill id", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "Successfully retrieved skill versions", + "schema": { + "$ref": "#/definitions/v1.skill.ListSkillVersionsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "listVersionsForSkillV1" + } + }, + "/v1/skills/{skillId}/rollbacks": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Submit a target skill version to rollback to. Only one rollback or publish operation can be outstanding for a given skillId.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "createRollbackRequest", + "description": "defines the request body to create a rollback request", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.CreateRollbackRequest" + } + } + ], + "responses": { + "201": { + "description": "Rollback request created; Returns the generated identifier to track the rollback request and returns a URL to track the status in Location header.", + "headers": { + "Content-Type": { + "type": "string", + "description": "contains content type of the response; only application/json supported." + }, + "Location": { + "type": "string", + "description": "Relative url to track rollback status" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.CreateRollbackResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "rollbackSkillV1" + } + }, + "/v1/skills/{skillId}/rollbacks/{rollbackRequestId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the rollback status of a skill given an associated rollbackRequestId. Use ~latest in place of rollbackRequestId to get the latest rollback status.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "rollbackRequestId", + "in": "path", + "description": "Defines the identifier for a rollback request. If set to ~latest, request returns the status of the latest rollback request.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Returns the rollback status for a given skillId and rollbackRequestId. Returns the latest rollback status if ~latest is used in place of rollbackRequestId.", + "headers": { + "Content-Type": { + "type": "string", + "description": "contains content type of the response; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.RollbackRequestStatus" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getRollbackForSkillV1" + } + }, + "/v1/skills/{skillId}/stages/{stage}/exports": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Creates a new export for a skill with given skillId and stage.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + } + ], + "responses": { + "202": { + "description": "Accepted.", + "headers": { + "Location": { + "type": "string", + "description": "Contains relative URL to track export." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "createExportRequestForSkillV1" + } + }, + "/v1/skills/exports/{exportId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get status for given exportId\n", + "parameters": [ + { + "name": "exportId", + "in": "path", + "description": "The Export ID.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.ExportResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getStatusOfExportRequestV1" + } + }, + "/v1/skills/imports": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Creates a new import for a skill.\n", + "parameters": [ + { + "in": "body", + "name": "createSkillWithPackageRequest", + "description": "Defines the request body for createPackage API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.createSkillWithPackageRequest" + } + } + ], + "responses": { + "202": { + "description": "Accepted.", + "headers": { + "Location": { + "type": "string", + "description": "Contains relative URL to track import." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "413": { + "description": "Payload too large.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "createSkillPackageV1" + } + }, + "/v1/skills/{skillId}/imports": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Creates a new import for a skill with given skillId.\n", + "parameters": [ + { + "in": "body", + "name": "updateSkillWithPackageRequest", + "description": "Defines the request body for updatePackage API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.updateSkillWithPackageRequest" + } + }, + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "If-Match", + "in": "header", + "description": "Request header that specified an entity tag. The server will update the resource only if the eTag matches with the resource's current eTag.", + "required": false, + "type": "string" + } + ], + "responses": { + "202": { + "description": "Accepted.", + "headers": { + "Location": { + "type": "string", + "description": "Contains relative URL to track import." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "412": { + "description": "Precondition failed.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "413": { + "description": "Payload too large.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "importSkillPackageV1" + } + }, + "/v1/skills/imports/{importId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get status for given importId.\n", + "parameters": [ + { + "name": "importId", + "in": "path", + "description": "The Import ID.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.ImportResponse" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getImportStatusV1" + } + }, + "/v1/skills/uploads": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Creates a new uploadUrl.\n", + "parameters": [], + "responses": { + "201": { + "description": "Created.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.UploadResponse" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "createUploadUrlV1" + } + }, + "/v1/skill/definitions/apis/custom/interfaces/{interfaceType}": {}, + "/v1/skills/{skillId}/stages/{stageV2}/cloneLocale": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "Creates a new clone locale workflow for a skill with given skillId, source locale, and target locales. In a single workflow, a locale can be cloned to multiple target locales. However, only one such workflow can be started at any time.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stageV2", + "in": "path", + "description": "Stages of a skill on which locales can be cloned. Currently only `development` stage is supported.\n* `development` - skills which are currently in development corresponds to this stage.\n", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "cloneLocaleRequest", + "description": "Defines the request body for the cloneLocale API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.CloneLocaleRequest" + } + } + ], + "responses": { + "202": { + "description": "Accepted.", + "headers": { + "Location": { + "type": "string", + "description": "Returns relative URL to track the progress of the workflow." + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "cloneLocaleV1" + } + }, + "/v1/skills/{skillId}/stages/{stageV2}/cloneLocaleRequests/{cloneLocaleRequestId}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Returns the status of a clone locale workflow associated with the unique identifier of cloneLocaleRequestId.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stageV2", + "in": "path", + "description": "Stages of a skill on which locales can be cloned. Currently only `development` stage is supported.\n* `development` - skills which are currently in development corresponds to this stage.\n", + "required": true, + "type": "string" + }, + { + "name": "cloneLocaleRequestId", + "in": "path", + "description": "Defines the identifier for a clone locale workflow.\nIf set to ~latest, request returns the status of the latest clone locale workflow.\n", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only \"application/json\" supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.CloneLocaleStatusResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "429": { + "description": "Exceeds the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "x-operation-name": "getCloneLocaleStatusV1" + } + }, + "/v1/vendors": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "Get the list of Vendor information.\n", + "parameters": [], + "responses": { + "200": { + "description": "Return vendor information on success.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.vendorManagement.Vendors" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Defines the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getVendorListV1" + } + }, + "/v1/developmentAuditLogs/query": { + "post": { + "tags": [ + "skillManagement" + ], + "description": "The SMAPI Audit Logs API provides customers with an audit history of all SMAPI calls made by a developer or developers with permissions on that account.", + "parameters": [ + { + "in": "body", + "name": "getAuditLogsRequest", + "description": "Request object encompassing vendorId, optional request filters and optional pagination context.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.auditLogs.AuditLogsRequest" + } + } + ], + "responses": { + "200": { + "description": "Returns a list of audit logs for the given vendor.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.auditLogs.AuditLogsResponse" + } + }, + "400": { + "description": "Invalid request", + "headers": { + "Content-Type": { + "type": "string", + "description": "returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "Forbidden", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "404": { + "description": "Not Found", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Too Many Requests", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "queryDevelopmentAuditLogsV1" + } + }, + "/v1/skills/{skillId}/stages/{stage}/locales/{locale}/conversations/turnPredictions": {}, + "/v1/skills/resourceSchema/{resource}": { + "get": { + "tags": [ + "skillManagement" + ], + "description": "GetResourceSchema API provides schema for skill related resources. The schema returned by this API will be specific to vendor because it considers public beta features allowed for the vendor.", + "parameters": [ + { + "name": "resource", + "in": "path", + "description": "Name of the ASK resource for which schema is requested.", + "required": true, + "type": "string", + "enum": [ + "manifest", + "skillPackageStructure" + ] + }, + { + "name": "vendorId", + "in": "query", + "description": "The vendor ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "operation", + "in": "query", + "description": "This parameter is required when resource is manifest because skill manifest schema differs based on operation. For example, submit for certification schema has more validations than create skill schema.", + "required": false, + "type": "string", + "enum": [ + "CREATE_SKILL", + "UPDATE_SKILL", + "SUBMIT_SKILL", + "ENABLE_SKILL" + ] + } + ], + "responses": { + "200": { + "description": "Returns a S3 presigned URL to location of schema", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.resourceSchema.getResourceSchemaResponse" + } + }, + "400": { + "description": "Invalid request", + "headers": { + "Content-Type": { + "type": "string", + "description": "returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "Unauthorized", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "Forbidden", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Too Many Requests", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type; only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getResourceSchemaV1" + } + }, + "/v1/skills/{skillId}/testSetGenerations": {}, + "/v1/skills/{skillId}/testSetGenerations/{testSetGenerationId}": {}, + "/v1/skills/{skillId}/testSets": {}, + "/v1/skills/{skillId}/testSets/{testSetId}/properties": {}, + "/v1/skills/{skillId}/testSets/{testSetId}": {}, + "/v1/skills/{skillId}/testSetExecutions": {}, + "/v1/skills/{skillId}/testSetExecutions/{testSetExecutionId}": {}, + "/v1/skills/{skillId}/testSetExecutions/{testSetExecutionId}/results": {}, + "/v1/skills/{skillId}/nluEvaluations": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "List nlu evaluations run for a skill.", + "description": "API which requests recently run nlu evaluations started by a vendor for a skill. Returns the evaluation id and some of the parameters used to start the evaluation. Developers can filter the results using locale and stage. Supports paging of results.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "locale", + "in": "query", + "description": "filter to evaluations started using this locale", + "required": false, + "type": "string" + }, + { + "name": "stage", + "in": "query", + "description": "filter to evaluations started using this stage", + "required": false, + "type": "string" + }, + { + "name": "annotationId", + "in": "query", + "description": "filter to evaluations started using this annotationId", + "required": false, + "type": "string" + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. Defaults to 10. If more results are present, the response will contain a nextToken and a _link.next href.\n", + "required": false, + "type": "number", + "default": 10, + "maximum": 100, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "Evaluations are returned.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, application/hal+json or application/json supported" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.ListNLUEvaluationsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "listNLUEvaluationsV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Start an evaluation against the NLU model built by the skill's interaction model.", + "description": "This is an asynchronous API that starts an evaluation against the NLU model built by the skill's interaction model.\nThe operation outputs an evaluationId which allows the retrieval of the current status of the operation and the results upon completion. This operation is unified, meaning both internal and external skill developers may use it evaluate NLU models.\n", + "parameters": [ + { + "in": "body", + "name": "evaluateNLURequest", + "description": "Payload sent to the evaluate NLU API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.EvaluateNLURequest" + } + }, + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Evaluation has successfully begun.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, - application/json or application/hal+json supported" + }, + "Location": { + "type": "string", + "description": "GET Location of the started evaluation.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.EvaluateResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "createNLUEvaluationsV1" + } + }, + "/v1/skills/{skillId}/nluEvaluations/{evaluationId}": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Get top level information and status of a nlu evaluation.", + "description": "API which requests top level information about the evaluation like the current state of the job, status of the evaluation (if complete). Also returns data used to start the job, like the number of test cases, stage, locale, and start time. This should be considered the 'cheap' operation while getResultForNLUEvaluations is 'expensive'.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "evaluationId", + "in": "path", + "description": "Identifier of the evaluation.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Evaluation exists and its status is queryable.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, - application/json or application/hal+json supported" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.GetNLUEvaluationResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getNLUEvaluationV1" + } + }, + "/v1/skills/{skillId}/nluEvaluations/{evaluationId}/results": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Get test case results for a completed Evaluation.", + "description": "Paginated API which returns the test case results of an evaluation. This should be considered the 'expensive' operation while getNluEvaluation is 'cheap'.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "evaluationId", + "in": "path", + "description": "Identifier of the evaluation.", + "required": true, + "type": "string" + }, + { + "name": "sort.field", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "STATUS", + "ACTUAL_INTENT", + "EXPECTED_INTENT" + ] + }, + { + "name": "testCaseStatus", + "in": "query", + "description": "only returns test cases with this status", + "required": false, + "type": "string", + "enum": [ + "PASSED", + "FAILED" + ] + }, + { + "name": "actualIntentName", + "in": "query", + "description": "only returns test cases with intents which resolve to this intent", + "required": false, + "type": "string" + }, + { + "name": "expectedIntentName", + "in": "query", + "description": "only returns test cases with intents which are expected to be this intent", + "required": false, + "type": "string" + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. Defaults to 1000. If more results are present, the response will contain a nextToken and a _link.next href.\n", + "required": false, + "type": "number", + "default": 1000, + "maximum": 1000, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "Evaluation exists and its status is queryable.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, - application/json or application/hal+json supported" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.GetNLUEvaluationResultsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getResultForNLUEvaluationsV1" + } + }, + "/v1/skills/{skillId}/nluAnnotationSets": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "List NLU annotation sets for a given skill.", + "description": "API which requests all the NLU annotation sets for a skill. Returns the annotationId and properties for each NLU annotation set. Developers can filter the results using locale. Supports paging of results.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "locale", + "in": "query", + "description": "filter to NLU annotation set created using this locale", + "required": false, + "type": "string" + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. Defaults to 10. If more results are present, the response will contain a nextToken and a _link.next href.\n", + "required": false, + "type": "number", + "default": 10, + "maximum": 100, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "NLU annotation sets are returned.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, application/hal+json or application/json supported" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.nlu.annotationSets.ListNLUAnnotationSetsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "listNLUAnnotationSetsV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Create a new NLU annotation set for a skill which will generate a new annotationId.", + "description": "This is an API that creates a new NLU annotation set with properties and returns the annotationId.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "CreateNLUAnnotationSetRequest", + "description": "Payload sent to the create NLU annotation set API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.nlu.annotationSets.CreateNLUAnnotationSetRequest" + } + } + ], + "responses": { + "201": { + "description": "NLU annotation set created successfully.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported", + "enum": [ + "application/json" + ] + }, + "Location": { + "type": "string", + "description": "GET Location of the created NLU annotation set.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.nlu.annotationSets.CreateNLUAnnotationSetResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "createNLUAnnotationSetV1" + } + }, + "/v1/skills/{skillId}/nluAnnotationSets/{annotationId}/properties": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Get the properties of an NLU annotation set", + "description": "Return the properties for an NLU annotation set.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "annotationId", + "in": "path", + "description": "Identifier of the NLU annotation set.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "The NLU annotation set exists.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, application/hal+json or application/json supported" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.nlu.annotationSets.GetNLUAnnotationSetPropertiesResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getPropertiesForNLUAnnotationSetsV1" + }, + "put": { + "tags": [ + "skillManagement" + ], + "summary": "update the NLU annotation set properties.", + "description": "API which updates the NLU annotation set properties. Currently, the only data can be updated is annotation set name.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "annotationId", + "in": "path", + "description": "Identifier of the NLU annotation set.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "UpdateNLUAnnotationSetPropertiesRequest", + "description": "Payload sent to the update NLU annotation set properties API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.nlu.annotationSets.UpdateNLUAnnotationSetPropertiesRequest" + } + } + ], + "responses": { + "201": { + "description": "NLU annotation set exists and properties are updated successfully.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, application/hal+json or application/json supported", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "updatePropertiesForNLUAnnotationSetsV1" + } + }, + "/v1/skills/{skillId}/nluAnnotationSets/{annotationId}": { + "delete": { + "tags": [ + "skillManagement" + ], + "summary": "Delete the NLU annotation set", + "description": "API which deletes the NLU annotation set. Developers cannot get/list the deleted annotation set.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "annotationId", + "in": "path", + "description": "Identifier of the NLU annotation set.", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "NLU annotation set exists and is deleted successfully.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, application/hal+json or application/json supported", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "deletePropertiesForNLUAnnotationSetsV1" + } + }, + "/v1/skills/{skillId}/nluAnnotationSets/{annotationId}/annotations": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Get the annotations of an NLU annotation set", + "produces": [ + "application/json", + "text/csv" + ], + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "annotationId", + "in": "path", + "description": "Identifier of the NLU annotation set.", + "required": true, + "type": "string" + }, + { + "name": "Accept", + "in": "header", + "description": "Standard HTTP. Pass `application/json` or `test/csv` for GET calls.\n", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "The specific version of a NLU annotation set has the content.", + "examples": { + "application/json": { + "data": [ + { + "inputs": { + "utterance": "i want to travel from seattle", + "referenceTimestamp": "2018-10-25T23:50:02.135Z" + }, + "expected": [ + { + "intent": { + "name": "TravelIntent", + "slots": { + "fromCity": { + "value": "seattle" + } + } + } + } + ] + } + ] + }, + "text/csv": "utterance,referenceTimestamp,intent,slot[fromCity] i want to travel from seattle,2018-10-25T23:50:02.135Z,TravelIntent,seattle\n" + }, + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, application/json supported" + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getAnnotationsForNLUAnnotationSetsV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Replace the annotations in NLU annotation set.", + "description": "API which replaces the annotations in NLU annotation set.\n", + "consumes": [ + "application/json", + "text/csv" + ], + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "annotationId", + "in": "path", + "description": "Identifier of the NLU annotation set.", + "required": true, + "type": "string" + }, + { + "name": "Content-Type", + "in": "header", + "description": "Standard HTTP. Pass `application/json` or `test/csv` for POST calls with a json/csv body.\n", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "UpdateNLUAnnotationSetAnnotationsRequest", + "description": "Payload sent to the update NLU annotation set API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.nlu.annotationSets.UpdateNLUAnnotationSetAnnotationsRequest" + } + } + ], + "responses": { + "200": { + "description": "NLU annotation set exists and starts the update.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, application/hal+json or application/json supported", + "enum": ["text/plain"] + } + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "500": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "updateAnnotationsForNLUAnnotationSetsV1" + } + }, + "/v1/skills/{skillId}/asrAnnotationSets": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "List ASR annotation sets metadata for a given skill.", + "description": "API which requests all the ASR annotation sets for a skill. Returns the annotation set id and properties for each ASR annotation set. Supports paging of results.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. Defaults to 1000. If more results are present, the response will contain a paginationContext.\n", + "required": false, + "type": "number", + "default": 1000, + "maximum": 1000, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "ASR annotation sets metadata are returned.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, application/hal+json or application/json supported", + "enum": [ + "application/json" + ] + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.asr.annotationSets.ListASRAnnotationSetsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "default": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "listASRAnnotationSetsV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Create a new ASR annotation set for a skill", + "description": "This is an API that creates a new ASR annotation set with a name and returns the annotationSetId which can later be used to retrieve or reference the annotation set\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "CreateAsrAnnotationSetRequest", + "description": "Payload sent to the create ASR annotation set API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.asr.annotationSets.CreateAsrAnnotationSetRequestObject" + } + } + ], + "responses": { + "200": { + "description": "ASR annotation set created successfully.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported", + "enum": [ + "application/json" + ] + }, + "Location": { + "type": "string", + "description": "Location of the created ASR annotation set.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.asr.annotationSets.CreateAsrAnnotationSetResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "default": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "createASRAnnotationSetV1" + } + }, + "/v1/skills/{skillId}/asrAnnotationSets/{annotationSetId}": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Get the metadata of an ASR annotation set", + "description": "Return the metadata for an ASR annotation set.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "annotationSetId", + "in": "path", + "description": "Identifier of the ASR annotation set.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "The ASR annotation set exists.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, application/json supported", + "enum": [ + "application/json" + ] + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.asr.annotationSets.GetASRAnnotationSetsPropertiesResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "default": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getASRAnnotationSetV1" + }, + "put": { + "tags": [ + "skillManagement" + ], + "summary": "update the ASR annotation set properties.", + "description": "API which updates the ASR annotation set properties. Currently, the only data can be updated is annotation set name.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "annotationSetId", + "in": "path", + "description": "Identifier of the ASR annotation set.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "UpdateAsrAnnotationSetPropertiesRequestV1", + "description": "Payload sent to the update ASR annotation set properties API.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.asr.annotationSets.UpdateAsrAnnotationSetPropertiesRequestObject" + } + } + ], + "responses": { + "204": { + "description": "ASR annotation set exists and properties are updated successfully." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "default": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "setASRAnnotationSetV1" + }, + "delete": { + "tags": [ + "skillManagement" + ], + "summary": "Delete the ASR annotation set", + "description": "API which deletes the ASR annotation set. Developers cannot get/list the deleted annotation set.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "annotationSetId", + "in": "path", + "description": "Identifier of the ASR annotation set.", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "ASR annotation set exists and is deleted successfully." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "default": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "deleteASRAnnotationSetV1" + } + }, + "/v1/skills/{skillId}/asrAnnotationSets/{annotationSetId}/annotations": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Download the annotation set contents.", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. Defaults to 1000. If more results are present, the response will contain a paginationContext.\n", + "required": false, + "type": "number", + "default": 1000, + "maximum": 1000, + "minimum": 1 + }, + { + "name": "annotationSetId", + "in": "path", + "description": "Identifier of the ASR annotation set.", + "required": true, + "type": "string" + }, + { + "name": "Accept", + "in": "header", + "description": "- `application/json`: indicate to download annotation set contents in JSON format - `text/csv`: indicate to download annotation set contents in CSV format\n", + "required": true, + "type": "string", + "enum": [ + "application/json", + "text/csv" + ] + } + ], + "responses": { + "200": { + "description": "The annotation set contents payload in specified format. This API also supports pagination for annotation set contents requested in `application/json` content type. Paginaiton for requested content type `text/csv` is not supported. In this case, the nextToken and maxResults query parameters would be ignored even if they are specified as query parameters.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "- `text/csv`: indicate the annotation set contents in CSV format. The first \n row of the csv contents defines the attribute names of annotation\n properties. Attribute names are delimited by comma. The subsequent rows\n define the annotations. Each row represents an annotation content. The\n annotation properties in each row follow the strict ordering of the attribute\n property names defined in the first row.\n- `application/json`: indicate the annotation set contents in JSON format\n", + "enum": [ + "text/csv", + "application/json" + ] + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.asr.annotationSets.GetAsrAnnotationSetAnnotationsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "default": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getAnnotationsForASRAnnotationSetV1" + }, + "put": { + "tags": [ + "skillManagement" + ], + "summary": "Update the annotations in the annotation set", + "description": "API that updates the annotaions in the annotation set\n", + "consumes": [ + "application/json", + "text/csv" + ], + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "annotationSetId", + "in": "path", + "description": "Identifier of the ASR annotation set.", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "UpdateAsrAnnotationSetContentsRequest", + "description": "Payload containing annotation set contents. Two formats are accepted here: - `application/json`: Annotation set payload in JSON format. - `text/csv`: Annotation set payload in CSV format. Note that for CSV format, the first row should describe the column attributes. Columns should be delimited by comma. The subsequent rows should describe annotation data and each annotation attributes has to follow the strict ordering defined in the first row. Each annotation fields should be delimited by comma.\n", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.asr.annotationSets.UpdateAsrAnnotationSetContentsPayload" + } + } + ], + "responses": { + "204": { + "description": "ASR annotation set contents have been updated successfully." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "default": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "setAnnotationsForASRAnnotationSetV1" + } + }, + "/v1/skills/{skillId}/asrEvaluations": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "List asr evaluations run for a skill.", + "description": "API that allows developers to get historical ASR evaluations they run before.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "locale", + "in": "query", + "description": "locale in bcp 47 format. Used to filter results with the specified locale. If omitted, the response would include all evaluations regardless of what locale was used in the evaluation", + "required": false, + "type": "string", + "format": "locale" + }, + { + "name": "stage", + "in": "query", + "description": "Query parameter used to filter evaluations with specified skill stage.\n * `development` - skill in `development` stage\n * `live` - skill in `live` stage\n", + "required": false, + "type": "string", + "enum": [ + "development", + "live" + ] + }, + { + "name": "annotationSetId", + "in": "query", + "description": "filter to evaluations started using this annotationSetId", + "required": false, + "type": "string" + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. Defaults to 1000. If more results are present, the response will contain a nextToken.\n", + "required": false, + "type": "number", + "default": 1000, + "maximum": 1000, + "minimum": 1 + } + ], + "responses": { + "200": { + "description": "Evaluations are returned.", + "headers": { + "Content-Type": { + "type": "string", + "description": "returned content type or application/json supported", + "enum": [ + "application/json" + ] + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.asr.evaluations.ListAsrEvaluationsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "default": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "listASREvaluationsV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Start an evaluation against the ASR model built by the skill's interaction model.", + "description": "This is an asynchronous API that starts an evaluation against the ASR model built by the skill's interaction model. The operation outputs an evaluationId which allows the retrieval of the current status of the operation and the results upon completion. This operation is unified, meaning both internal and external skill developers may use it to evaluate ASR models.\n", + "parameters": [ + { + "in": "body", + "name": "PostAsrEvaluationsRequest", + "description": "Payload sent to trigger evaluation run.", + "required": true, + "schema": { + "$ref": "#/definitions/v1.skill.asr.evaluations.PostAsrEvaluationsRequestObject" + } + }, + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Evaluation has successfully begun.", + "headers": { + "Content-Type": { + "type": "string", + "description": "returned content type, - application/json supported", + "enum": [ + "application/json" + ] + }, + "Location": { + "type": "string", + "description": "URI indicating where to poll the status of the evaluation.\n" + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.asr.evaluations.PostAsrEvaluationsResponseObject" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "default": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "createASREvaluationV1" + } + }, + "/v1/skills/{skillId}/asrEvaluations/{evaluationId}/status": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Get high level information and status of a asr evaluation.", + "description": "API which requests high level information about the evaluation like the current state of the job, status of the evaluation (if complete). Also returns the request used to start the job, like the number of total evaluations, number of completed evaluations, and start time. This should be considered the \"cheap\" operation while GetAsrEvaluationsResults is \"expensive\".\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "evaluationId", + "in": "path", + "description": "Identifier of the evaluation.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Evaluation exists and its status is queryable.", + "headers": { + "Content-Type": { + "type": "string", + "description": "returned content type, - application/json supported", + "enum": [ + "application/json" + ] + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.asr.evaluations.GetAsrEvaluationStatusResponseObject" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "default": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getASREvaluationStatusV1" + } + }, + "/v1/skills/{skillId}/asrEvaluations/{evaluationId}": { + "delete": { + "tags": [ + "skillManagement" + ], + "summary": "Delete an evaluation.", + "description": "API which enables the deletion of an evaluation. \n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "evaluationId", + "in": "path", + "description": "Identifier of the evaluation.", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "ASR evaluation exists and is deleted successfully." + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "default": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "deleteASREvaluationV1" + } + }, + "/v1/skills/{skillId}/asrEvaluations/{evaluationId}/results": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "List results for a completed Evaluation.", + "description": "Paginated API which returns the test case results of an evaluation. This should be considered the \"expensive\" operation while GetAsrEvaluationsStatus is \"cheap\".\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "evaluationId", + "in": "path", + "description": "Identifier of the evaluation.", + "required": true, + "type": "string" + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. Defaults to 1000. If more results are present, the response will contain a nextToken.\n", + "required": false, + "type": "number", + "default": 1000, + "maximum": 1000, + "minimum": 1 + }, + { + "name": "status", + "in": "query", + "description": "query parameter used to filter evaluation result status.\n * `PASSED` - filter evaluation result status of `PASSED`\n * `FAILED` - filter evaluation result status of `FAILED`\n", + "required": false, + "type": "string", + "enum": [ + "PASSED", + "FAILED" + ] + } + ], + "responses": { + "200": { + "description": "Evaluation exists and its status is queryable.", + "headers": { + "Content-Type": { + "type": "string", + "description": "returned content type, - application/json supported", + "enum": [ + "application/json" + ] + } + }, + "schema": { + "$ref": "#/definitions/v1.skill.asr.evaluations.GetAsrEvaluationsResultsResponse" + } + }, + "400": { + "description": "Server cannot process the request due to a client error.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": { + "WWW-Authenticate": { + "type": "string", + "description": "Define the authentication method that should be used to gain access to a resource." + } + }, + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "403": { + "description": "The operation being requested is not allowed.", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The resource being requested is not found.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceed the permitted request limit. Throttling criteria includes total requests, per API, ClientId, and CustomerId.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "default": { + "description": "Internal Server Error.", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "listASREvaluationsResultsV1" + } + }, + "/v1/skills/{skillId}/smartHome/testing/capabilityTestPlans": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "List all the test plan names and ids for a given skill ID.", + "description": "List all the test plan names and ids for a given skill ID.", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Successfully got the list of test plans.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body." + } + }, + "schema": { + "$ref": "#/definitions/v1.smartHomeEvaluation.ListSHCapabilityTestPlansResponse" + } + }, + "400": { + "description": "Bad Request. Returned when the request payload is malformed or when, at least, one required property is missing or invalid.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "403": { + "description": "API user does not have permission or is currently in a state that does not allow calls to this API.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill, test plan, or evaluation does not exist. The error response will contain a description that indicates the specific resource type that was not found.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "429": { + "description": "Exceeded the permitted request limit. Throttling criteria includes total requests, per API and CustomerId.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "default": { + "description": "Internal server error.\n", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "listSmarthomeCapabilityTestPlansV1" + } + }, + "/v1/skills/{skillId}/smartHome/testing/capabilityEvaluations/{evaluationId}/results": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Get test case results for an evaluation run.", + "description": "Get test case results for an evaluation run.", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + }, + { + "name": "evaluationId", + "in": "path", + "description": "A unique ID to identify each Smart Home capability evaluation.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the evaluation result content.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body." + } + }, + "schema": { + "$ref": "#/definitions/v1.smartHomeEvaluation.GetSHCapabilityEvaluationResultsResponse" + } + }, + "400": { + "description": "Bad Request. Returned when the request payload is malformed or when, at least, one required property is missing or invalid.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "403": { + "description": "API user does not have permission or is currently in a state that does not allow calls to this API.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill, test plan, or evaluation does not exist. The error response will contain a description that indicates the specific resource type that was not found.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "429": { + "description": "Exceeded the permitted request limit. Throttling criteria includes total requests, per API and CustomerId.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "default": { + "description": "Internal server error.\n", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getSmarthomeCapablityEvaluationResultsV1" + } + }, + "/v1/skills/{skillId}/smartHome/testing/capabilityEvaluations/{evaluationId}": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Get top level information and status of a Smart Home capability evaluation.", + "description": "Get top level information and status of a Smart Home capability evaluation.", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "evaluationId", + "in": "path", + "description": "A unique ID to identify each Smart Home capability evaluation.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the evaluation status.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body." + } + }, + "schema": { + "$ref": "#/definitions/v1.smartHomeEvaluation.GetSHCapabilityEvaluationResponse" + } + }, + "400": { + "description": "Bad Request. Returned when the request payload is malformed or when, at least, one required property is missing or invalid.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "403": { + "description": "API user does not have permission or is currently in a state that does not allow calls to this API.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill, test plan, or evaluation does not exist. The error response will contain a description that indicates the specific resource type that was not found.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "429": { + "description": "Exceeded the permitted request limit. Throttling criteria includes total requests, per API and CustomerId.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "default": { + "description": "Internal server error.\n", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "getSmartHomeCapabilityEvaluationV1" + } + }, + "/v1/skills/{skillId}/smartHome/testing/capabilityEvaluations": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "List Smart Home capability evaluation runs for a skill.", + "description": "List Smart Home capability evaluation runs for a skill.", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "query", + "description": "The stage of the skill to be used for evaluation. An error will be returned if this skill stage is not enabled on the account used for evaluation.", + "required": true, + "type": "string", + "enum": [ + "development", + "live" + ] + }, + { + "name": "startTimestampFrom", + "in": "query", + "description": "The begnning of the start time to query evaluation result.", + "required": false, + "type": "string", + "format": "date-time" + }, + { + "name": "startTimestampTo", + "in": "query", + "description": "The end of the start time to query evaluation result.", + "required": false, + "type": "string", + "format": "date-time" + }, + { + "name": "maxResults", + "in": "query", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve fewer than upper limit of 50 results, you can add this parameter to your request. maxResults should not exceed the upper limit. The response might contain fewer results than maxResults, but it will never contain more. If there are additional results that satisfy the search criteria, but these results were not returned, the response contains isTruncated = true.", + "required": false, + "type": "integer", + "maximum": 50, + "minimum": 1 + }, + { + "name": "nextToken", + "in": "query", + "description": "When response to this API call is truncated (that is, isTruncated response element value is true), the response also includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that Skill Management API understands. Token has expiry of 24 hours.", + "required": false, + "type": "string", + "maxLength": 2047, + "minLength": 1 + } + ], + "responses": { + "200": { + "description": "Successfully retrieved the evaluation infomation.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body." + } + }, + "schema": { + "$ref": "#/definitions/v1.smartHomeEvaluation.ListSHCapabilityEvaluationsResponse" + } + }, + "400": { + "description": "Bad Request. Returned when the request payload is malformed or when, at least, one required property is missing or invalid.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "403": { + "description": "API user does not have permission or is currently in a state that does not allow calls to this API.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill, test plan, or evaluation does not exist. The error response will contain a description that indicates the specific resource type that was not found.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "429": { + "description": "Exceeded the permitted request limit. Throttling criteria includes total requests, per API and CustomerId.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "default": { + "description": "Internal server error.\n", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "listSmarthomeCapabilityEvaluationsV1" + }, + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Start a capability evaluation against a Smart Home skill.", + "description": "Start a capability evaluation against a Smart Home skill.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "in": "body", + "name": "EvaluateSHCapabilityPayload", + "description": "Payload sent to start a capability evaluation against a Smart Home skill.", + "required": false, + "schema": { + "$ref": "#/definitions/v1.smartHomeEvaluation.EvaluateSHCapabilityRequest" + } + } + ], + "responses": { + "200": { + "description": "Evaluation has successfully begun.", + "headers": { + "Content-Type": { + "type": "string", + "description": "The content type of the response body." + }, + "Location": { + "type": "string", + "description": "Get location of the capability evaluaiton." + } + }, + "schema": { + "$ref": "#/definitions/v1.smartHomeEvaluation.EvaluateSHCapabilityResponse" + } + }, + "400": { + "description": "Bad Request. Returned when the request payload is malformed or when, at least, one required property is missing or invalid.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "403": { + "description": "API user does not have permission or is currently in a state that does not allow calls to this API.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "404": { + "description": "The specified skill, test plan, or evaluation does not exist. The error response will contain a description that indicates the specific resource type that was not found.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "409": { + "description": "A test run is already in progress for the specified endpoint. Please retry after some time.\n", + "schema": { + "$ref": "#/definitions/v1.Error" + } + }, + "429": { + "description": "Exceeded the permitted request limit. Throttling criteria includes total requests, per API and CustomerId.\n", + "schema": { + "$ref": "#/definitions/v1.BadRequestError" + } + }, + "default": { + "description": "Internal server error.\n", + "schema": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "x-operation-name": "createSmarthomeCapabilityEvaluationV1" + } + }, + "/v2/skills/{skillId}/stages/{stage}/simulations": { + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Simulate executing a skill with the given id against a given stage.", + "description": "This is an asynchronous API that simulates a skill execution in the Alexa eco-system given an utterance text of what a customer would say to Alexa. A successful response will contain a header with the location of the simulation resource. In cases where requests to this API results in an error, the response will contain an error code and a description of the problem. The skill being simulated must belong to and be enabled by the user of this API. Concurrent requests per user is currently not supported.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + }, + { + "in": "body", + "name": "simulationsApiRequest", + "description": "Payload sent to the skill simulation API.", + "required": true, + "schema": { + "$ref": "#/definitions/v2.skill.simulations.SimulationsApiRequest" + } + } + ], + "responses": { + "200": { + "description": "Skill simulation has successfully began.", + "headers": { + "Location": { + "type": "string", + "description": "Path to simulation resource." + }, + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.skill.simulations.SimulationsApiResponse" + } + }, + "400": { + "description": "Bad request due to invalid or missing data.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v2.Error" + } + }, + "403": { + "description": "API user does not have permission to call this API or is currently in a state that does not allow simulation of this skill.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.BadRequestError" + } + }, + "404": { + "description": "The specified skill does not exist.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.Error" + } + }, + "409": { + "description": "This requests conflicts with another one currently being processed.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.Error" + } + }, + "429": { + "description": "API user has exceeded the permitted request rate.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.Error" + } + }, + "500": { + "description": "Internal service error.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.Error" + } + } + }, + "x-operation-name": "simulateSkillV2" + } + }, + "/v2/skills/{skillId}/stages/{stage}/simulations/{simulationId}": { + "get": { + "tags": [ + "skillManagement" + ], + "summary": "Get the result of a previously executed simulation.", + "description": "This API gets the result of a previously executed simulation. A successful response will contain the status of the executed simulation. If the simulation successfully completed, the response will also contain information related to skill invocation. In cases where requests to this API results in an error, the response will contain an error code and a description of the problem. In cases where the simulation failed, the response will contain a status attribute indicating that a failure occurred and details about what was sent to the skill endpoint. Note that simulation results are stored for 10 minutes. A request for an expired simulation result will return a 404 HTTP status code.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + }, + { + "name": "simulationId", + "in": "path", + "description": "Id of the simulation.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Successfully retrieved skill simulation information.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.skill.simulations.SimulationsApiResponse" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v2.Error" + } + }, + "403": { + "description": "API user does not have permission or is currently in a state that does not allow calls to this API.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.BadRequestError" + } + }, + "404": { + "description": "The specified skill or simulation does not exist. The error response will contain a description that indicates the specific resource type that was not found.\n", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.Error" + } + }, + "429": { + "description": "API user has exceeded the permitted request rate.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.Error" + } + }, + "500": { + "description": "Internal service error.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v2.Error" + } + } + }, + "x-operation-name": "getSkillSimulationV2" + } + }, + "/v2/skills/{skillId}/stages/{stage}/invocations": { + "post": { + "tags": [ + "skillManagement" + ], + "summary": "Invokes the Lambda or third party HTTPS endpoint for the given skill against a given stage.", + "description": "This is a synchronous API that invokes the Lambda or third party HTTPS endpoint for a given skill. A successful response will contain information related to what endpoint was called, payload sent to and received from the endpoint. In cases where requests to this API results in an error, the response will contain an error code and a description of the problem. In cases where invoking the skill endpoint specifically fails, the response will contain a status attribute indicating that a failure occurred and details about what was sent to the endpoint. The skill must belong to and be enabled by the user of this API. Also, note that calls to the skill endpoint will timeout after 10 seconds. This API is currently designed in a way that allows extension to an asynchronous API if a significantly bigger timeout is required.\n", + "parameters": [ + { + "name": "skillId", + "in": "path", + "description": "The skill ID.", + "required": true, + "type": "string", + "maxLength": 255, + "minLength": 1 + }, + { + "name": "stage", + "in": "path", + "description": "Stage for skill.", + "required": true, + "type": "string", + "maxLength": 63, + "minLength": 1 + }, + { + "in": "body", + "name": "invocationsApiRequest", + "description": "Payload sent to the skill invocation API.", + "required": false, + "schema": { + "$ref": "#/definitions/v2.skill.invocations.invocationsApiRequest" + } + } + ], + "responses": { + "200": { + "description": "Skill was invoked.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v2.skill.invocations.InvocationsApiResponse" + } + }, + "400": { + "description": "Bad request due to invalid or missing data.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v2.BadRequestError" + } + }, + "401": { + "description": "The auth token is invalid/expired or doesn't have access to the resource.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v2.Error" + } + }, + "403": { + "description": "API user does not have permission to call this API or is currently in a state that does not allow invocation of this skill.\n", + "headers": {}, + "schema": { + "$ref": "#/definitions/v2.BadRequestError" + } + }, + "404": { + "description": "The specified skill does not exist.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v2.Error" + } + }, + "429": { + "description": "API user has exceeded the permitted request rate.", + "headers": {}, + "schema": { + "$ref": "#/definitions/v2.Error" + } + }, + "500": { + "description": "Internal service error.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.Error" + } + }, + "503": { + "description": "Service Unavailable.", + "headers": { + "Content-Type": { + "type": "string", + "description": "Returned content type, only application/json supported." + } + }, + "schema": { + "$ref": "#/definitions/v2.Error" + } + } + }, + "x-operation-name": "invokeSkillEndPointV2" + } + }, + "/v2/skills/{skillId}/metrics": {}, + "/v2/skills/metrics": {} + }, + "securityDefinitions": { + "skillManagement": { + "type": "oauth2", + "authorizationUrl": "api.amazon.com/ap/oa", + "tokenUrl": "https://api.amazon.com/auth/o2/token", + "flow": "accessCode", + "x-use-refresh-grant": true + } + }, + "definitions": { + "v1.BadRequestError": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Human readable description of error." + }, + "violations": { + "type": "array", + "description": "An array of violation messages.", + "items": { + "$ref": "#/definitions/v1.Error" + } + } + } + }, + "v1.Error": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "code": { + "type": "string", + "description": "Error code that maps to an error message. Developers with different locales should be able to lookup the error description based on this code.\n" + }, + "message": { + "type": "string", + "description": "Readable description of error. If standardized, this is generated from the error code and validation details." + } + }, + "x-baseType": true, + "x-concreteType": true + }, + "v2.BadRequestError": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Human readable description of error." + }, + "violations": { + "type": "array", + "description": "An array of violation messages.", + "items": { + "$ref": "#/definitions/v2.Error" + } + } + } + }, + "v2.Error": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "code": { + "type": "string", + "description": "Error code that maps to an error message. Developers with different locales should be able to lookup the error description based on this code.\n" + }, + "message": { + "type": "string", + "description": "Readable description of error." + } + } + }, + "v1.Links": { + "type": "object", + "properties": { + "self": { + "$ref": "#/definitions/v1.Link" + }, + "next": { + "$ref": "#/definitions/v1.Link" + } + }, + "description": "Links for the API navigation." + }, + "v1.Link": { + "type": "object", + "properties": { + "href": { + "type": "string" + } + } + }, + "v1.StageV2Type": { + "type": "string", + "enum": [ + "live", + "certified", + "development" + ] + }, + "v1.StageType": { + "type": "string", + "enum": [ + "development", + "live" + ] + }, + "v0.BadRequestError": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Human readable description of error." + }, + "violations": { + "type": "array", + "description": "An array of violation messages.", + "items": { + "$ref": "#/definitions/v0.Error" + } + } + } + }, + "v0.Error": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "code": { + "type": "string", + "description": "Error code that maps to an error message. Developers with different locales should be able to lookup the error description based on this code.\n" + }, + "message": { + "type": "string", + "description": "Readable description of error." + } + } + }, + "v0.catalog.CreateCatalogRequest": { + "type": "object", + "required": [ + "title", + "type", + "usage", + "vendorId" + ], + "properties": { + "title": { + "type": "string", + "description": "Title of the catalog." + }, + "type": { + "$ref": "#/definitions/v0.catalog.CatalogType", + "x-isEnum": true + }, + "usage": { + "$ref": "#/definitions/v0.catalog.CatalogUsage", + "x-isEnum": true + }, + "vendorId": { + "type": "string", + "description": "ID of the vendor owning the catalog.", + "minLength": 1, + "maxLength": 255 + } + } + }, + "v0.catalog.ListCatalogsResponse": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "catalogs": { + "type": "array", + "description": "List of catalog summaries.\n", + "items": { + "$ref": "#/definitions/v0.catalog.CatalogSummary" + } + }, + "isTruncated": { + "type": "boolean" + }, + "nextToken": { + "type": "string" + } + }, + "description": "Information about catalogs." + }, + "v0.catalog.CatalogDetails": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the added catalog object." + }, + "title": { + "type": "string", + "description": "Title of the catalog." + }, + "type": { + "$ref": "#/definitions/v0.catalog.CatalogType", + "x-isEnum": true + }, + "usage": { + "$ref": "#/definitions/v0.catalog.CatalogUsage", + "x-isEnum": true + }, + "lastUpdatedDate": { + "type": "string", + "format": "date-time", + "description": "The date time when the catalog was last updated." + }, + "createdDate": { + "type": "string", + "format": "date-time", + "description": "The date time when the catalog was created." + }, + "associatedSkillIds": { + "type": "array", + "description": "The list of skill Ids associated with the catalog.", + "items": { + "type": "string" + } + } + } + }, + "v0.catalog.CatalogSummary": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the added catalog object." + }, + "title": { + "type": "string", + "description": "Title of the catalog." + }, + "type": { + "$ref": "#/definitions/v0.catalog.CatalogType", + "x-isEnum": true + }, + "usage": { + "$ref": "#/definitions/v0.catalog.CatalogUsage", + "x-isEnum": true + }, + "lastUpdatedDate": { + "type": "string", + "format": "date-time", + "description": "The date time when the catalog was last updated." + }, + "createdDate": { + "type": "string", + "format": "date-time", + "description": "The date time when the catalog was created." + }, + "associatedSkillIds": { + "type": "array", + "description": "The list of skill Ids associated with the catalog.", + "items": { + "type": "string" + } + } + } + }, + "v0.catalog.CatalogType": { + "type": "string", + "description": "Type of catalog.", + "enum": [ + "AMAZON.BroadcastChannel", + "AMAZON.Genre", + "AMAZON.MusicAlbum", + "AMAZON.MusicGroup", + "AMAZON.MusicPlaylist", + "AMAZON.MusicRecording", + "AMAZON.TerrestrialRadioChannel", + "AMAZON.AudioRecording" + ] + }, + "v0.catalog.CatalogUsage": { + "type": "string", + "description": "Usage of the catalog.", + "enum": [ + "AlexaMusic.Catalog.BroadcastChannel", + "AlexaMusic.Catalog.Genre", + "AlexaMusic.Catalog.MusicAlbum", + "AlexaMusic.Catalog.MusicGroup", + "AlexaMusic.Catalog.MusicPlaylist", + "AlexaMusic.Catalog.MusicRecording", + "AlexaMusic.Catalog.TerrestrialRadioChannel", + "AlexaTest.Catalog.AudioRecording" + ] + }, + "v0.catalog.upload.CompleteUploadRequest": { + "type": "object", + "properties": { + "partETags": { + "type": "array", + "description": "List of (eTag, part number) pairs for each part of the file uploaded.", + "items": { + "$ref": "#/definitions/v0.catalog.upload.PreSignedUrlItem" + }, + "maxItems": 1000, + "minItems": 1 + } + } + }, + "v0.catalog.upload.CreateContentUploadRequest": { + "type": "object", + "properties": { + "numberOfUploadParts": { + "type": "integer", + "description": "Provides the number of parts the file will be split into. An equal number of presigned upload urls are generated in response to facilitate each part's upload." + } + } + }, + "v0.catalog.upload.UploadStatus": { + "type": "string", + "description": "Status of the entire upload.", + "enum": [ + "PENDING", + "PROCESSING", + "FAILED", + "SUCCEEDED" + ] + }, + "v0.catalog.upload.IngestionStepName": { + "type": "string", + "enum": [ + "UPLOAD", + "SCHEMA_VALIDATION" + ] + }, + "v0.catalog.upload.IngestionStatus": { + "type": "string", + "enum": [ + "PENDING", + "IN_PROGRESS", + "FAILED", + "SUCCEEDED", + "CANCELLED" + ] + }, + "v0.catalog.upload.UploadIngestionStep": { + "type": "object", + "required": [ + "errors", + "name", + "status" + ], + "properties": { + "name": { + "$ref": "#/definitions/v0.catalog.upload.IngestionStepName", + "x-isEnum": true + }, + "status": { + "$ref": "#/definitions/v0.catalog.upload.IngestionStatus", + "x-isEnum": true + }, + "logUrl": { + "type": "string", + "description": "Represents the url for the file containing logs of ingestion step." + }, + "errors": { + "type": "array", + "description": "This array will contain the errors occurred during the execution of step. Will be empty, if execution succeeded.", + "items": { + "$ref": "#/definitions/v0.Error" + } + } + }, + "description": "Represents a single step in the ingestion process of a new upload." + }, + "v0.catalog.upload.ListUploadsResponse": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "isTruncated": { + "type": "boolean" + }, + "nextToken": { + "type": "string" + }, + "uploads": { + "type": "array", + "description": "List of upload summaries.", + "items": { + "$ref": "#/definitions/v0.catalog.upload.ContentUploadSummary" + } + } + } + }, + "v0.catalog.upload.ContentUploadSummary": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the upload." + }, + "catalogId": { + "type": "string", + "description": "Provides a unique identifier of the catalog." + }, + "status": { + "$ref": "#/definitions/v0.catalog.upload.UploadStatus", + "x-isEnum": true + }, + "createdDate": { + "type": "string", + "format": "date-time" + }, + "lastUpdatedDate": { + "type": "string", + "format": "date-time" + } + } + }, + "v0.catalog.upload.ContentUploadFileSummary": { + "type": "object", + "properties": { + "presignedDownloadUrl": { + "type": "string", + "description": "If the file is available for download, presigned download URL can be used to download the file." + }, + "status": { + "$ref": "#/definitions/v0.catalog.upload.FileUploadStatus", + "x-isEnum": true + } + } + }, + "v0.catalog.upload.CreateContentUploadResponse": { + "allOf": [ + { + "$ref": "#/definitions/v0.catalog.upload.ContentUploadSummary" + }, + { + "type": "object", + "properties": { + "ingestionSteps": { + "type": "array", + "items": { + "$ref": "#/definitions/v0.catalog.upload.UploadIngestionStep" + } + }, + "presignedUploadParts": { + "type": "array", + "description": "Ordered list of presigned upload parts to perform a partitioned (multipart) file upload.", + "items": { + "$ref": "#/definitions/v0.catalog.upload.PresignedUploadPart" + } + } + } + } + ], + "description": "Request body for self-hosted catalog uploads." + }, + "v0.catalog.upload.GetContentUploadResponse": { + "allOf": [ + { + "$ref": "#/definitions/v0.catalog.upload.ContentUploadSummary" + }, + { + "type": "object", + "properties": { + "file": { + "$ref": "#/definitions/v0.catalog.upload.ContentUploadFileSummary" + }, + "ingestionSteps": { + "type": "array", + "items": { + "$ref": "#/definitions/v0.catalog.upload.UploadIngestionStep" + } + } + } + } + ], + "description": "Response object for get content upload request." + }, + "v0.catalog.upload.FileUploadStatus": { + "type": "string", + "description": "Value of status depends on if file is available for download or not.", + "enum": [ + "PENDING", + "AVAILABLE", + "PURGED", + "UNAVAILABLE" + ] + }, + "v0.catalog.upload.PresignedUploadPart": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "partNumber": { + "type": "integer" + } + }, + "description": "Single upload part to perform a partitioned (multipart) file upload." + }, + "v0.catalog.upload.PreSignedUrlItem": { + "type": "object", + "required": [ + "eTag", + "partNumber" + ], + "properties": { + "eTag": { + "type": "string" + }, + "partNumber": { + "type": "integer", + "minimum": 1, + "maximum": 1000 + } + } + }, + "v0.developmentEvents.subscriber.Endpoint": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": "Uri of the endpoint that receives the notification." + }, + "authorization": { + "$ref": "#/definitions/v0.developmentEvents.subscriber.EndpointAuthorization" + } + } + }, + "v0.developmentEvents.subscriber.EndpointAuthorization": { + "type": "object", + "required": [ + "type" + ], + "discriminator": "type", + "properties": { + "type": { + "type": "string", + "x-isDiscriminator": true + } + }, + "description": "Authorization information to be able to publish notification to specified endpoint." + }, + "v0.developmentEvents.subscriber.EndpointAwsAuthorization": { + "allOf": [ + { + "$ref": "#/definitions/v0.developmentEvents.subscriber.EndpointAuthorization" + }, + { + "type": "object", + "properties": { + "arn": { + "type": "string", + "description": "IAM Role arn to use/assumeRole for authorization." + } + } + } + ], + "description": "Authorization for accessing AWS SNS endpoint.", + "x-discriminator-value": "AWS_IAM" + }, + "v0.developmentEvents.subscriber.EndpointAuthorizationType": { + "type": "string", + "description": "Type of authorization (e.g. AWS IAM, OAuth).", + "enum": [ + "AWS_IAM" + ] + }, + "v0.developmentEvents.subscriber.SubscriberInfo": { + "type": "object", + "properties": { + "subscriberId": { + "type": "string", + "description": "Unique identifier of the subscriber resource." + }, + "name": { + "type": "string", + "description": "Name of the subscriber." + }, + "endpoint": { + "$ref": "#/definitions/v0.developmentEvents.subscriber.Endpoint" + } + }, + "description": "Information about the subscriber." + }, + "v0.developmentEvents.subscriber.SubscriberSummary": { + "type": "object", + "properties": { + "subscriberId": { + "type": "string", + "description": "Unique identifier of the subscriber resource." + }, + "name": { + "type": "string", + "description": "Name of the subscriber." + }, + "status": { + "$ref": "#/definitions/v0.developmentEvents.subscriber.SubscriberStatus", + "x-isEnum": true + }, + "clientId": { + "type": "string", + "description": "Client Id of the subscriber resource." + }, + "endpoint": { + "$ref": "#/definitions/v0.developmentEvents.subscriber.Endpoint" + } + } + }, + "v0.developmentEvents.subscriber.SubscriberStatus": { + "type": "string", + "description": "Status of the subscriber. This enum may get extended with new values in future. Clients are expected to gracefully handle any unknown values.", + "enum": [ + "ACTIVE", + "INACTIVE" + ] + }, + "v0.developmentEvents.subscriber.ListSubscribersResponse": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "nextToken": { + "type": "string" + }, + "subscribers": { + "type": "array", + "description": "List containing subscriber summary.", + "items": { + "$ref": "#/definitions/v0.developmentEvents.subscriber.SubscriberSummary" + } + } + } + }, + "v0.developmentEvents.subscriber.CreateSubscriberRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the subscriber." + }, + "vendorId": { + "type": "string", + "description": "The Vendor ID." + }, + "endpoint": { + "$ref": "#/definitions/v0.developmentEvents.subscriber.Endpoint" + } + } + }, + "v0.developmentEvents.subscriber.UpdateSubscriberRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the subscriber." + }, + "endpoint": { + "$ref": "#/definitions/v0.developmentEvents.subscriber.Endpoint" + } + } + }, + "v0.developmentEvents.subscription.Event": { + "type": "string", + "description": "Represents an event that the subscriber is interested in. The event is of the format EventCategory.OPERATION. You can use wildcard event 'AlexaDevelopmentEvent.All' for recieving all AlexaDevelopmentEvent notifications listed below. We do not support 'AlexaCustomerFeedbackEvent.All' at this point as we only have one event in this category.\n * 'AlexaDevelopmentEvent.ManifestUpdate' - The event representing the status of the update request on the Manifest.\n * 'AlexaDevelopmentEvent.SkillPublish' - The event representing the status of the skill publish process.\n * 'AlexaDevelopmentEvent.SkillCertification' - The event represents if a skill has been certified or not.\n * 'AlexaDevelopmentEvent.InteractionModelUpdate' - The event represents the status of an Interaction Model build for a particular locale.\n * 'AlexaDevelopmentEvent.All' - A wildcard event name that allows subscription to all the existing events. While using this, you must not specify any other event name. AlexaDevelopmentEvent.All avoids the need of specifying every development event name in order to receive all events pertaining to a vendor account. Similarly, it avoids the need of updating an existing subscription to be able to receive new events, whenever supproted by notification service. Test Subscriber API cannot use this wildcard. Please make sure that your code can gracefully handle new/previously unknown events, if you are using this wildcard.\n * 'AlexaCustomerFeedbackEvent.SkillReviewPublish' - The event represents the publishing of a new/updated customer review for a skill on the skill store.\n", + "enum": [ + "AlexaDevelopmentEvent.ManifestUpdate", + "AlexaDevelopmentEvent.SkillPublish", + "AlexaDevelopmentEvent.SkillCertification", + "AlexaDevelopmentEvent.InteractionModelUpdate", + "AlexaDevelopmentEvent.All", + "AlexaCustomerFeedbackEvent.SkillReviewPublish" + ] + }, + "v0.developmentEvents.subscription.SubscriptionInfo": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the subscription." + }, + "subscriptionId": { + "type": "string", + "description": "Unique identifier of the subscription resource." + }, + "subscriberId": { + "type": "string", + "description": "Subscriber Id of the event-receiver." + }, + "vendorId": { + "type": "string", + "description": "Vendor Id of the event-publisher." + }, + "events": { + "type": "array", + "description": "The list of events that the subscriber should be notified for.", + "items": { + "$ref": "#/definitions/v0.developmentEvents.subscription.Event" + } + } + } + }, + "v0.developmentEvents.subscription.SubscriptionSummary": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the subscription." + }, + "subscriptionId": { + "type": "string", + "description": "Unique identifier of the subscription resource." + }, + "subscriberId": { + "type": "string", + "description": "Subscriber Id of the event-reciever." + }, + "vendorId": { + "type": "string", + "description": "VendorId of the event-publisher." + }, + "events": { + "type": "array", + "description": "The list of events that the subscriber should be notified for.", + "items": { + "$ref": "#/definitions/v0.developmentEvents.subscription.Event" + } + } + } + }, + "v0.developmentEvents.subscription.ListSubscriptionsResponse": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "nextToken": { + "type": "string" + }, + "subscriptions": { + "type": "array", + "description": "List of subscription summaries.", + "items": { + "$ref": "#/definitions/v0.developmentEvents.subscription.SubscriptionSummary" + } + } + } + }, + "v0.developmentEvents.subscription.CreateSubscriptionRequest": { + "type": "object", + "required": [ + "events", + "name", + "subscriberId" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the subscription." + }, + "events": { + "type": "array", + "description": "The list of events that the subscriber should be notified for.", + "items": { + "$ref": "#/definitions/v0.developmentEvents.subscription.Event" + } + }, + "vendorId": { + "type": "string", + "description": "The vendorId of the event publisher." + }, + "subscriberId": { + "type": "string", + "description": "The id of the subscriber that would receive the events." + } + } + }, + "v0.developmentEvents.subscription.UpdateSubscriptionRequest": { + "type": "object", + "required": [ + "events", + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the subscription.", + "minLength": 1, + "maxLength": 255 + }, + "events": { + "type": "array", + "description": "The list of events that the subscriber should be notified for.", + "items": { + "$ref": "#/definitions/v0.developmentEvents.subscription.Event" + } + } + } + }, + "v0.eventSchema.AlexaDevelopmentEvent.ManifestUpdate": { + "allOf": [ + { + "$ref": "#/definitions/v0.eventSchema.BaseSchema" + }, + { + "type": "object", + "properties": { + "requestId": { + "type": "string", + "description": "A development notification includes a unique identifier that identifies the original request that resulted in the development notification. The requestId for original request is returned by Amazon APIs in response's 'X-Amzn-RequestId' header.\n" + }, + "payload": { + "$ref": "#/definitions/v0.eventSchema.SkillEventAttributes" + } + } + } + ], + "description": "'AlexaDevelopmentEvent.ManifestUpdate' event represents the status of the update request on the Manifest. This event is generated when request to create a skill or update an existing skill is completed. The request may complete either with `SUCCEEDED` or `FAILED` status.", + "x-discriminator-value": "AlexaDevelopmentEvent.ManifestUpdate" + }, + "v0.eventSchema.AlexaDevelopmentEvent.SkillPublish": { + "allOf": [ + { + "$ref": "#/definitions/v0.eventSchema.BaseSchema" + }, + { + "type": "object", + "properties": { + "requestId": { + "type": "string", + "description": "A development notification includes a unique identifier that identifies the original request that resulted in the development notification. The requestId for original request is returned by Amazon APIs in response's 'X-Amzn-RequestId' header.\n" + }, + "payload": { + "$ref": "#/definitions/v0.eventSchema.SkillEventAttributes" + } + } + } + ], + "description": "'AlexaDevelopmentEvent.SkillPublish' event represents the status of publish to live operation. When a developer submits a skill for certification, it goes through `certification workflow` followed by publish to live workflow. This event is generated in publish workflow and may complete either with `SUCCEEDED` or `FAILED` status. If 'SUCCEEDED', users can see and enable latest version of the skill via Alexa Skill Store.", + "x-discriminator-value": "AlexaDevelopmentEvent.SkillPublish" + }, + "v0.eventSchema.AlexaDevelopmentEvent.SkillCertification": { + "allOf": [ + { + "$ref": "#/definitions/v0.eventSchema.BaseSchema" + }, + { + "type": "object", + "properties": { + "requestId": { + "type": "string", + "description": "A development notification includes a unique identifier that identifies the original request that resulted in the development notification. The requestId for original request is returned by Amazon APIs in response's 'X-Amzn-RequestId' header.\n" + }, + "payload": { + "$ref": "#/definitions/v0.eventSchema.SkillEventAttributes" + } + } + } + ], + "description": "'AlexaDevelopmentEvent.SkillCertification' event represents the status of various validations of\n`certification workflow`. This step may complete either with `SUCCEEDED` or `FAILED` status.\n", + "x-discriminator-value": "AlexaDevelopmentEvent.SkillCertification" + }, + "v0.eventSchema.AlexaDevelopmentEvent.InteractionModelUpdate": { + "allOf": [ + { + "$ref": "#/definitions/v0.eventSchema.BaseSchema" + }, + { + "type": "object", + "properties": { + "requestId": { + "type": "string", + "description": "A development notification includes a unique identifier that identifies the original request that resulted in the development notification. The requestId for original request is returned by Amazon APIs in response's 'X-Amzn-RequestId' header.\n" + }, + "payload": { + "$ref": "#/definitions/v0.eventSchema.InteractionModelEventAttributes" + } + } + } + ], + "description": "'AlexaDevelopmentEvent.InteractionModelUpdate' event represents the status of set/update interaction model\nrequest. The update request may complete either with `SUCCEEDED` or `FAILED` status.\n", + "x-discriminator-value": "AlexaDevelopmentEvent.InteractionModelUpdate" + }, + "v0.eventSchema.AlexaCustomerFeedbackEvent.SkillReviewPublish": { + "allOf": [ + { + "$ref": "#/definitions/v0.eventSchema.BaseSchema" + }, + { + "type": "object", + "properties": { + "payload": { + "$ref": "#/definitions/v0.eventSchema.SkillReviewEventAttributes" + } + } + } + ], + "description": "'AlexaCustomerFeedbackEvent.SkillReviewPublish' event represents the publishing of a new/updated customer review for a skill.\n", + "x-discriminator-value": "AlexaCustomerFeedbackEvent.SkillReviewPublish" + }, + "v0.eventSchema.SkillEventAttributes": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v0.eventSchema.RequestStatus", + "x-isEnum": true + }, + "actor": { + "$ref": "#/definitions/v0.eventSchema.ActorAttributes" + }, + "skill": { + "$ref": "#/definitions/v0.eventSchema.SkillAttributes" + }, + "subscription": { + "$ref": "#/definitions/v0.eventSchema.SubscriptionAttributes" + } + }, + "description": "Skill event specific attributes.\n" + }, + "v0.eventSchema.SkillReviewEventAttributes": { + "type": "object", + "properties": { + "skill": { + "$ref": "#/definitions/v0.eventSchema.SkillAttributes" + }, + "subscription": { + "$ref": "#/definitions/v0.eventSchema.SubscriptionAttributes" + }, + "review": { + "$ref": "#/definitions/v0.eventSchema.SkillReviewAttributes" + } + }, + "description": "Skill Review by customer event specific attributes.\n" + }, + "v0.eventSchema.InteractionModelEventAttributes": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v0.eventSchema.RequestStatus", + "x-isEnum": true + }, + "actor": { + "$ref": "#/definitions/v0.eventSchema.ActorAttributes" + }, + "interactionModel": { + "$ref": "#/definitions/v0.eventSchema.InteractionModelAttributes" + }, + "subscription": { + "$ref": "#/definitions/v0.eventSchema.SubscriptionAttributes" + } + }, + "description": "Interaction model event specific attributes.\n" + }, + "v0.eventSchema.BaseSchema": { + "type": "object", + "required": [ + "eventName" + ], + "discriminator": "eventName", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "description": "ISO 8601 timestamp for the instant when event was created.\n" + }, + "eventName": { + "type": "string", + "x-isDiscriminator": true + } + }, + "description": "Represents attributes common to all development notifications.\n" + }, + "v0.eventSchema.SkillAttributes": { + "type": "object", + "properties": { + "skillId": { + "type": "string", + "format": "Amazon Common Identifier", + "description": "Unique identifier of an Alexa skill.\n" + }, + "vendorId": { + "type": "string", + "description": "Unique identifier of vendor account to which this skill belongs.\n" + } + }, + "description": "Represents a set of attributes specific to an Alexa Skill.\n" + }, + "v0.eventSchema.InteractionModelAttributes": { + "allOf": [ + { + "$ref": "#/definitions/v0.eventSchema.SkillAttributes" + }, + { + "type": "object", + "properties": { + "locale": { + "type": "string", + "format": "languager-region; same as BCP-47 language tag format", + "description": "Locale of interaction model.\n" + } + } + } + ], + "description": "Represents a set of attributes specific to interaction model of an Alexa Skill.\n" + }, + "v0.eventSchema.SubscriptionAttributes": { + "type": "object", + "properties": { + "subscriptionId": { + "type": "string", + "format": "Amazon Common Identifier", + "description": "Unique subscription id that triggered the development notification event.\n" + } + }, + "description": "Represents attributes of a subscription for development notification.\n" + }, + "v0.eventSchema.ActorAttributes": { + "type": "object", + "properties": { + "customerId": { + "type": "string", + "description": "Identifies an Amazon Customer who submitted a request corresponding to the generated event.\n" + } + }, + "description": "Represents an actor that submitted a request causing development notification event.\n" + }, + "v0.eventSchema.SkillReviewAttributes": { + "type": "object", + "properties": { + "reviewId": { + "type": "string", + "description": "Unique review id associated with a customer review for a skill.\n" + }, + "url": { + "type": "string", + "description": "Link to the customer review on Amazon retail website.\n" + }, + "starRating": { + "type": "string", + "description": "StarRating provided by the customer in the review. It is always a natural number from 1 to 5 (inclusive of 1 and 5).\n" + } + }, + "description": "Represents attributes of a customer review for a skill.\n" + }, + "v0.eventSchema.RequestStatus": { + "type": "string", + "description": "Represents the completion status of the request.\n", + "enum": [ + "SUCCEEDED", + "FAILED" + ] + }, + "v1.catalog.CreateContentUploadUrlRequest": { + "type": "object", + "required": [ + "numberOfUploadParts" + ], + "properties": { + "numberOfUploadParts": { + "type": "integer", + "example": 1, + "description": "Provides the number of parts the file will be split into. An equal number of presigned upload urls are generated in response to facilitate each part's upload.", + "minimum": 1, + "maximum": 1000 + } + } + }, + "v1.catalog.CreateContentUploadUrlResponse": { + "type": "object", + "required": [ + "urlId" + ], + "properties": { + "urlId": { + "type": "string", + "description": "Unique identifier for collection of generated urls." + }, + "presignedUploadParts": { + "type": "array", + "description": "Ordered list of presigned upload parts to perform a partitioned (multipart) file upload", + "items": { + "$ref": "#/definitions/v1.catalog.PresignedUploadPartItems" + } + } + } + }, + "v1.catalog.PresignedUploadPartItems": { + "type": "object", + "required": [ + "expiresAt", + "partNumber", + "url" + ], + "properties": { + "url": { + "type": "string" + }, + "partNumber": { + "type": "integer" + }, + "expiresAt": { + "type": "string", + "format": "date-time" + } + } + }, + "v1.catalog.upload.CatalogUploadBase": { + "type": "object", + "x-baseType": true + }, + "v1.catalog.upload.Location": { + "allOf": [ + { + "$ref": "#/definitions/v1.catalog.upload.CatalogUploadBase" + }, + { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "self hosted url location." + } + } + } + ], + "description": "Request body for self-hosted catalog uploads", + "x-inheritsFrom": "v1.catalog.upload.CatalogUploadBase" + }, + "v1.catalog.upload.PreSignedUrl": { + "allOf": [ + { + "$ref": "#/definitions/v1.catalog.upload.CatalogUploadBase" + }, + { + "type": "object", + "required": [ + "urlId" + ], + "properties": { + "urlId": { + "type": "string", + "description": "Unique identifier for urls" + }, + "partETags": { + "type": "array", + "description": "List of (eTag, part number) pairs for each part of the file uploaded", + "items": { + "$ref": "#/definitions/v1.catalog.upload.PreSignedUrlItem" + }, + "maxItems": 1000, + "minItems": 1 + } + } + } + ], + "description": "Request body for self-hosted catalog uploads", + "x-inheritsFrom": "v1.catalog.upload.CatalogUploadBase" + }, + "v1.catalog.upload.PreSignedUrlItem": { + "type": "object", + "properties": { + "eTag": { + "type": "string" + }, + "partNumber": { + "type": "integer" + } + } + }, + "v1.catalog.upload.GetContentUploadResponse": { + "type": "object", + "required": [ + "catalogId", + "createdDate", + "file", + "id", + "ingestionSteps", + "lastUpdatedDate", + "status" + ], + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the upload" + }, + "catalogId": { + "type": "string", + "description": "Unique identifier of the added catalog object" + }, + "status": { + "$ref": "#/definitions/v1.catalog.upload.UploadStatus", + "x-isEnum": true + }, + "createdDate": { + "type": "string", + "format": "date-time" + }, + "lastUpdatedDate": { + "type": "string", + "format": "date-time" + }, + "file": { + "$ref": "#/definitions/v1.catalog.upload.ContentUploadFileSummary" + }, + "ingestionSteps": { + "type": "array", + "description": "List of different steps performed on the upload.", + "items": { + "$ref": "#/definitions/v1.catalog.upload.UploadIngestionStep" + } + } + } + }, + "v1.catalog.upload.UploadStatus": { + "type": "string", + "description": "Status of the entire upload.", + "enum": [ + "PENDING", + "IN_PROGRESS", + "FAILED", + "SUCCEEDED" + ] + }, + "v1.catalog.upload.ContentUploadFileSummary": { + "type": "object", + "required": [ + "downloadUrl", + "expiresAt", + "status" + ], + "properties": { + "downloadUrl": { + "type": "string", + "format": "uri", + "description": "If the file is available for download, downloadUrl can be used to download the file." + }, + "expiresAt": { + "type": "string", + "format": "date-time" + }, + "status": { + "$ref": "#/definitions/v1.catalog.upload.FileUploadStatus", + "x-isEnum": true + } + } + }, + "v1.catalog.upload.FileUploadStatus": { + "type": "string", + "description": "Value of status depends on if file is available for download or not.", + "enum": [ + "PENDING", + "AVAILABLE", + "PURGED", + "UNAVAILABLE" + ] + }, + "v1.catalog.upload.UploadIngestionStep": { + "type": "object", + "required": [ + "name", + "status", + "violations" + ], + "properties": { + "name": { + "$ref": "#/definitions/v1.catalog.upload.IngestionStepName", + "x-isEnum": true + }, + "status": { + "$ref": "#/definitions/v1.catalog.upload.IngestionStatus", + "x-isEnum": true + }, + "logUrl": { + "type": "string", + "format": "uri", + "description": "Url for the file containing logs of ingestion step." + }, + "violations": { + "type": "array", + "description": "This array will contain the violations occurred during the execution of step. Will be empty, if execution succeeded.", + "items": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "description": "Represents a single step in the multi-step ingestion process of a new upload." + }, + "v1.catalog.upload.IngestionStepName": { + "type": "string", + "enum": [ + "UPLOAD", + "SCHEMA_VALIDATION" + ] + }, + "v1.catalog.upload.IngestionStatus": { + "type": "string", + "enum": [ + "PENDING", + "IN_PROGRESS", + "FAILED", + "SUCCEEDED", + "CANCELLED" + ] + }, + "v1.isp.ProductType": { + "type": "string", + "description": "Type of in-skill product.", + "enum": [ + "SUBSCRIPTION", + "ENTITLEMENT", + "CONSUMABLE" + ] + }, + "v1.isp.ListInSkillProductResponse": { + "type": "object", + "properties": { + "inSkillProductSummaryList": { + "$ref": "#/definitions/v1.isp.ListInSkillProduct" + } + }, + "description": "List of in-skill product response." + }, + "v1.isp.ListInSkillProduct": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "inSkillProducts": { + "type": "array", + "description": "Information for each in-skill product.", + "items": { + "$ref": "#/definitions/v1.isp.InSkillProductSummary" + } + }, + "isTruncated": { + "type": "boolean" + }, + "nextToken": { + "type": "string" + } + }, + "description": "List of in-skill products." + }, + "v1.isp.PurchasableState": { + "type": "string", + "description": "Whether or not the in-skill product is purchasable by customers. A product that is not purchasable will prevent new customers from being prompted to purchase the product. Customers who already own the product will see no effect and continue to have access to the product features.", + "enum": [ + "PURCHASABLE", + "NOT_PURCHASABLE" + ] + }, + "v1.isp.PromotableState": { + "type": "string", + "description": "Promote this ISP on Amazon channels such as Amazon.com. Enabling this setting will allow customers to view ISP detail pages and purchase the ISP on Amazon.com.", + "enum": [ + "IN_SKILL_ONLY", + "ALL_AMAZON_CHANNELS" + ] + }, + "v1.isp.InSkillProductSummaryResponse": { + "type": "object", + "properties": { + "inSkillProductSummary": { + "$ref": "#/definitions/v1.isp.InSkillProductSummary" + } + }, + "description": "In-skill product summary response." + }, + "v1.isp.InSkillProductSummary": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/v1.isp.ProductType", + "x-isEnum": true + }, + "productId": { + "type": "string", + "description": "primary identifier of in-skill product." + }, + "referenceName": { + "type": "string", + "description": "Developer selected in-skill product name. This is for developer reference only, it can be used to filter query results to identify a matching in-skill product." + }, + "lastUpdated": { + "type": "string", + "format": "date-time", + "description": "Date of last update." + }, + "nameByLocale": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "status": { + "$ref": "#/definitions/v1.isp.Status", + "x-isEnum": true + }, + "stage": { + "$ref": "#/definitions/v1.StageType", + "x-isEnum": true + }, + "editableState": { + "$ref": "#/definitions/v1.isp.EditableState", + "x-isEnum": true + }, + "purchasableState": { + "$ref": "#/definitions/v1.isp.PurchasableState", + "x-isEnum": true + }, + "promotableState": { + "$ref": "#/definitions/v1.isp.PromotableState", + "x-isEnum": true + }, + "_links": { + "$ref": "#/definitions/v1.isp.IspSummaryLinks" + }, + "pricing": { + "type": "object", + "description": "In-skill product pricing information.", + "additionalProperties": { + "$ref": "#/definitions/v1.isp.SummaryMarketplacePricing" + } + } + }, + "description": "Information about the in-skill product that is not editable." + }, + "v1.isp.Status": { + "type": "string", + "description": "Current status of in-skill product.", + "enum": [ + "INCOMPLETE", + "COMPLETE", + "CERTIFICATION", + "PUBLISHED", + "SUPPRESSED" + ] + }, + "v1.isp.EditableState": { + "type": "string", + "description": "Whether or not the in-skill product is editable.", + "enum": [ + "EDITABLE", + "NOT_EDITABLE" + ] + }, + "v1.isp.IspSummaryLinks": { + "type": "object", + "properties": { + "self": { + "$ref": "#/definitions/v1.Link" + } + } + }, + "v1.isp.SummaryMarketplacePricing": { + "type": "object", + "properties": { + "releaseDate": { + "type": "string", + "format": "date-time", + "description": "Date when in-skill product is available to customers for both purchase and use. Prior to this date the in-skill product will appear unavailable to customers and will not be purchasable." + }, + "defaultPriceListing": { + "$ref": "#/definitions/v1.isp.SummaryPriceListing" + } + }, + "description": "Localized in-skill product pricing information." + }, + "v1.isp.SummaryPriceListing": { + "type": "object", + "properties": { + "price": { + "type": "number", + "description": "The price of an in-skill product." + }, + "primeMemberPrice": { + "type": "number", + "description": "The prime price of an in-skill product." + }, + "currency": { + "$ref": "#/definitions/v1.isp.Currency", + "x-isEnum": true + } + }, + "description": "Price listing information for in-skill product." + }, + "v1.isp.Currency": { + "type": "string", + "format": "ISO 4217 format", + "description": "Currency to use for in-skill product.", + "enum": [ + "USD", + "GBP", + "EUR", + "JPY" + ] + }, + "v1.isp.createInSkillProductRequest": { + "type": "object", + "properties": { + "vendorId": { + "type": "string", + "description": "ID of the vendor owning the in-skill product." + }, + "inSkillProductDefinition": { + "$ref": "#/definitions/v1.isp.InSkillProductDefinition" + } + } + }, + "v1.isp.InSkillProductDefinitionResponse": { + "type": "object", + "properties": { + "inSkillProductDefinition": { + "$ref": "#/definitions/v1.isp.InSkillProductDefinition" + } + }, + "description": "Defines In-skill product response." + }, + "v1.isp.InSkillProductDefinition": { + "type": "object", + "properties": { + "version": { + "type": "string", + "description": "Version of in-skill product definition." + }, + "type": { + "$ref": "#/definitions/v1.isp.ProductType", + "x-isEnum": true + }, + "referenceName": { + "type": "string", + "description": "Developer selected in-skill product name. This is for developer reference only, it can be used to filter query results to identify a matching in-skill product." + }, + "purchasableState": { + "$ref": "#/definitions/v1.isp.PurchasableState", + "x-isEnum": true + }, + "promotableState": { + "$ref": "#/definitions/v1.isp.PromotableState", + "x-isEnum": true + }, + "subscriptionInformation": { + "$ref": "#/definitions/v1.isp.SubscriptionInformation" + }, + "publishingInformation": { + "$ref": "#/definitions/v1.isp.PublishingInformation" + }, + "privacyAndCompliance": { + "$ref": "#/definitions/v1.isp.PrivacyAndCompliance" + }, + "testingInstructions": { + "type": "string", + "description": "Special instructions provided by the developer to test the in-skill product." + } + }, + "description": "Defines the structure for an in-skill product." + }, + "v1.isp.SubscriptionInformation": { + "type": "object", + "properties": { + "subscriptionPaymentFrequency": { + "$ref": "#/definitions/v1.isp.subscriptionPaymentFrequency", + "x-isEnum": true + }, + "subscriptionTrialPeriodDays": { + "type": "integer", + "description": "Days of free trial period for subscription. Max allowed is 365 days." + } + }, + "description": "Defines the structure for in-skill product subscription information." + }, + "v1.isp.subscriptionPaymentFrequency": { + "type": "string", + "description": "The frequency in which payments are collected for the subscription.", + "enum": [ + "MONTHLY", + "YEARLY" + ] + }, + "v1.isp.PublishingInformation": { + "type": "object", + "properties": { + "locales": { + "type": "object", + "description": "Defines the structure for locale specific publishing information for an in-skill product.", + "additionalProperties": { + "$ref": "#/definitions/v1.isp.LocalizedPublishingInformation" + } + }, + "distributionCountries": { + "type": "array", + "description": "List of countries where the in-skill product is available.", + "items": { + "$ref": "#/definitions/v1.isp.DistributionCountries" + } + }, + "pricing": { + "type": "object", + "description": "Defines the structure for in-skill product pricing.", + "additionalProperties": { + "$ref": "#/definitions/v1.isp.MarketplacePricing" + } + }, + "taxInformation": { + "$ref": "#/definitions/v1.isp.TaxInformation" + } + }, + "description": "Defines the structure for in-skill product publishing information." + }, + "v1.isp.LocalizedPublishingInformation": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the in-skill product that is heard by customers and displayed in the Alexa app." + }, + "smallIconUri": { + "type": "string", + "description": "Uri for the small icon image of the in-skill product." + }, + "largeIconUri": { + "type": "string", + "description": "Uri for the large icon image of the in-skill product." + }, + "summary": { + "type": "string", + "description": "Short description of the in-skill product that displays on the in-skill product list page in the Alexa App." + }, + "description": { + "type": "string", + "description": "Description of the in-skill product's purpose and features, and how it works. Should describe any prerequisites like hardware or account requirements and detailed steps for the customer to get started. This description displays to customers on the in-skill product detail card in the Alexa app." + }, + "examplePhrases": { + "type": "array", + "description": "Example phrases appear on the in-skill product detail page and are the key utterances that customers can say to interact directly with the in-skill product.", + "items": { + "type": "string" + } + }, + "keywords": { + "type": "array", + "description": "Search terms that can be used to describe the in-skill product. This helps customers find an in-skill product.", + "items": { + "type": "string" + } + }, + "customProductPrompts": { + "$ref": "#/definitions/v1.isp.CustomProductPrompts" + } + }, + "description": "Defines the structure for locale specific publishing information in the in-skill product definition." + }, + "v1.isp.CustomProductPrompts": { + "type": "object", + "properties": { + "purchasePromptDescription": { + "type": "string", + "example": "{PREMIUM_CONTENT_TITLE} includes an assortment of fifty questions on a broad range of historical topics.", + "description": "Description of in-skill product heard before customer is prompted for purchase." + }, + "boughtCardDescription": { + "type": "string", + "example": "Enjoy {PREMIUM_CONTENT_TITLE}! Ask for a list of adventures to explore your purchase..", + "description": "A description of the product that displays on the skill card in the Alexa app." + } + }, + "description": "Custom prompts used for in-skill product purchasing options. Supports Speech Synthesis Markup Language (SSML), which can be used to control pronunciation, intonation, timing, and emotion." + }, + "v1.isp.DistributionCountries": { + "type": "string", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "KH", + "CM", + "CA", + "CV", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "HR", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IQ", + "IE", + "IM", + "IL", + "IT", + "CI", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MK", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "AN", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "ES", + "LK", + "SR", + "SJ", + "SZ", + "SE", + "CH", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "v1.isp.MarketplacePricing": { + "type": "object", + "properties": { + "releaseDate": { + "type": "string", + "format": "date-time", + "description": "Date when in-skill product is available to customers for both purchase and use. Prior to this date the in-skill product will appear unavailable to customers and will not be purchasable." + }, + "defaultPriceListing": { + "$ref": "#/definitions/v1.isp.PriceListing" + } + }, + "description": "In-skill product pricing information for a marketplace." + }, + "v1.isp.PriceListing": { + "type": "object", + "properties": { + "price": { + "type": "number", + "description": "Defines the price of an in-skill product. The list price should be your suggested price, not including any VAT or similar taxes. Taxes are included in the final price to end users." + }, + "currency": { + "$ref": "#/definitions/v1.isp.Currency", + "x-isEnum": true + } + }, + "description": "Price listing information for in-skill product." + }, + "v1.isp.TaxInformation": { + "type": "object", + "properties": { + "category": { + "$ref": "#/definitions/v1.isp.TaxInformationCategory", + "x-isEnum": true + } + }, + "description": "Defines the structure for in-skill product tax information." + }, + "v1.isp.TaxInformationCategory": { + "type": "string", + "description": "Select tax category that best describes in-skill product. Choice will be validated during certification process.", + "enum": [ + "SOFTWARE", + "STREAMING_AUDIO", + "STREAMING_RADIO", + "INFORMATION_SERVICES", + "VIDEO", + "PERIODICALS", + "NEWSPAPERS" + ] + }, + "v1.isp.PrivacyAndCompliance": { + "type": "object", + "properties": { + "locales": { + "type": "object", + "description": "Defines the structure for locale specific privacy and compliance.", + "additionalProperties": { + "$ref": "#/definitions/v1.isp.LocalizedPrivacyAndCompliance" + } + } + }, + "description": "Defines the structure for privacy and compliance." + }, + "v1.isp.LocalizedPrivacyAndCompliance": { + "type": "object", + "properties": { + "privacyPolicyUrl": { + "type": "string", + "description": "Link to the privacy policy that applies to this in-skill product." + } + }, + "description": "Defines the structure for localized privacy and compliance." + }, + "v1.isp.ProductResponse": { + "type": "object", + "properties": { + "productId": { + "type": "string", + "description": "ID of the in-skill product created." + } + }, + "description": "Product ID information." + }, + "v1.isp.updateInSkillProductRequest": { + "type": "object", + "properties": { + "inSkillProductDefinition": { + "$ref": "#/definitions/v1.isp.InSkillProductDefinition" + } + } + }, + "v1.isp.AssociatedSkillResponse": { + "type": "object", + "properties": { + "associatedSkillIds": { + "type": "array", + "description": "List of skill IDs that correspond to the skills associated with the in-skill product. The associations are stage specific. A live association is created through successful skill certification.", + "items": { + "type": "string" + } + }, + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "isTruncated": { + "type": "boolean" + }, + "nextToken": { + "type": "string" + } + }, + "description": "In-skill product skill association details." + }, + "v1.skill.accountLinking.AccountLinkingResponse": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/v1.skill.accountLinking.AccountLinkingType", + "x-isEnum": true + }, + "authorizationUrl": { + "type": "string", + "format": "uri", + "description": "The url where customers will be redirected in the companion app to enter login credentials." + }, + "domains": { + "type": "array", + "description": "The list of domains that the authorization URL will fetch content from.", + "items": { + "type": "string" + } + }, + "clientId": { + "type": "string", + "description": "The unique public string used to identify the client requesting for authentication." + }, + "scopes": { + "type": "array", + "description": "The list of permissions which will be requested from the skill user.", + "items": { + "type": "string" + } + }, + "accessTokenUrl": { + "type": "string", + "description": "The url used for access token and token refresh requests." + }, + "accessTokenScheme": { + "$ref": "#/definitions/v1.skill.accountLinking.AccessTokenSchemeType", + "x-isEnum": true + }, + "defaultTokenExpirationInSeconds": { + "type": "integer", + "description": "The time in seconds for which access token is valid.\nIf OAuth client returns \"expires_in\", it will be overwrite this parameter.\n" + }, + "redirectUrls": { + "type": "array", + "description": "The list of valid urls to redirect back to, when the linking process is initiated from a third party system.", + "items": { + "type": "string" + } + }, + "authorizationUrlsByPlatform": { + "type": "array", + "description": "The list of valid authorization urls for allowed platforms to initiate account linking.", + "items": { + "$ref": "#/definitions/v1.skill.accountLinking.AccountLinkingPlatformAuthorizationUrl" + } + }, + "voiceForwardAccountLinking": { + "$ref": "#/definitions/v1.skill.accountLinking.VoiceForwardAccountLinkingStatus", + "x-isEnum": true + } + }, + "description": "The account linking information of a skill." + }, + "v1.skill.accountLinking.AccountLinkingType": { + "type": "string", + "description": "The type of account linking.", + "enum": [ + "AUTH_CODE", + "IMPLICIT" + ] + }, + "v1.skill.accountLinking.AccessTokenSchemeType": { + "type": "string", + "description": "The type of client authentication scheme.", + "enum": [ + "HTTP_BASIC", + "REQUEST_BODY_CREDENTIALS" + ] + }, + "v1.skill.accountLinking.AccountLinkingPlatformAuthorizationUrl": { + "type": "object", + "required": [ + "platformAuthorizationUrl", + "platformType" + ], + "properties": { + "platformType": { + "$ref": "#/definitions/v1.skill.accountLinking.PlatformType", + "x-isEnum": true + }, + "platformAuthorizationUrl": { + "type": "string", + "description": "Defines the OAuth2 Authorization URL that will be used in this platform to authenticate the customer / person." + } + }, + "description": "A key-value pair object that contains the OAuth2 authorization url to initiate the skill account linking process." + }, + "v1.skill.accountLinking.PlatformType": { + "type": "string", + "description": "Defines the type of platform that will be used by the customer to perform account linking.", + "enum": [ + "iOS", + "Android" + ] + }, + "v1.skill.accountLinking.VoiceForwardAccountLinkingStatus": { + "type": "string", + "description": "Defines the voice forward account linking status of a skill.", + "enum": [ + "ENABLED", + "DISABLED" + ] + }, + "v1.skill.accountLinking.AccountLinkingRequest": { + "type": "object", + "properties": { + "accountLinkingRequest": { + "$ref": "#/definitions/v1.skill.accountLinking.AccountLinkingRequestPayload" + } + }, + "description": "The request body of AccountLinkingRequest." + }, + "v1.skill.accountLinking.AccountLinkingRequestPayload": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/v1.skill.accountLinking.AccountLinkingType", + "x-isEnum": true + }, + "authorizationUrl": { + "type": "string", + "description": "The url where customers will be redirected in the companion app to enter login credentials." + }, + "domains": { + "type": "array", + "description": "The list of domains that the authorization URL will fetch content from.", + "items": { + "type": "string" + } + }, + "clientId": { + "type": "string", + "description": "The unique public string used to identify the client requesting for authentication." + }, + "scopes": { + "type": "array", + "description": "The list of permissions which will be requested from the skill user.", + "items": { + "type": "string" + } + }, + "accessTokenUrl": { + "type": "string", + "description": "The url used for access token and token refresh requests." + }, + "clientSecret": { + "type": "string", + "description": "The client secret provided by developer." + }, + "accessTokenScheme": { + "$ref": "#/definitions/v1.skill.accountLinking.AccessTokenSchemeType", + "x-isEnum": true + }, + "defaultTokenExpirationInSeconds": { + "type": "integer", + "description": "The time in seconds for which access token is valid.\nIf OAuth client returns \"expires_in\", it will be overwrite this parameter.\n" + }, + "reciprocalAccessTokenUrl": { + "type": "string", + "description": "Optional, if your skill requires reciprocal authorization, provide this additional access token url to handle reciprocal (Alexa) authorization codes that can be exchanged for Alexa access tokens." + }, + "redirectUrls": { + "type": "array", + "description": "The list of valid urls to redirect back to, when the linking process is initiated from a third party system.", + "items": { + "type": "string" + } + }, + "authorizationUrlsByPlatform": { + "type": "array", + "description": "The list of valid authorization urls for allowed platforms to initiate account linking.", + "items": { + "$ref": "#/definitions/v1.skill.accountLinking.AccountLinkingPlatformAuthorizationUrl" + } + }, + "skipOnEnablement": { + "type": "boolean", + "description": "Set to true to let users enable the skill without starting the account linking flow. Set to false to require the normal account linking flow when users enable the skill." + }, + "voiceForwardAccountLinking": { + "$ref": "#/definitions/v1.skill.accountLinking.VoiceForwardAccountLinkingStatus", + "x-isEnum": true + } + }, + "description": "The payload for creating the account linking partner." + }, + "v1.skill.AlexaHosted.HostingConfiguration": { + "type": "object", + "properties": { + "alexaHosted": { + "$ref": "#/definitions/v1.skill.AlexaHosted.AlexaHostedConfig" + } + }, + "description": "Configurations for creating new hosted skill" + }, + "v1.skill.AlexaHosted.HostedSkillRepositoryCredentialsRequest": { + "type": "object", + "required": [ + "repository" + ], + "properties": { + "repository": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillRepositoryInfo" + } + } + }, + "v1.skill.AlexaHosted.HostedSkillRepositoryInfo": { + "type": "object", + "required": [ + "type", + "url" + ], + "properties": { + "url": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillRepository", + "x-isEnum": true + } + }, + "description": "Alexa Hosted Skill's Repository Information" + }, + "v1.skill.AlexaHosted.HostedSkillRepository": { + "type": "string", + "enum": [ + "GIT" + ] + }, + "v1.skill.AlexaHosted.HostedSkillRepositoryCredentialsList": { + "type": "object", + "properties": { + "repositoryCredentials": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillRepositoryCredentials" + } + }, + "description": "defines the structure for the hosted skill repository credentials response" + }, + "v1.skill.AlexaHosted.HostedSkillRepositoryCredentials": { + "type": "object", + "properties": { + "username": { + "type": "string", + "description": "AWS Access Key ID used to access hosted skill repository" + }, + "password": { + "type": "string", + "description": "signed AWS Credentials used to access hosted skill repository" + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "expiration time for the credentials" + } + } + }, + "v1.skill.AlexaHosted.HostedSkillMetadata": { + "type": "object", + "properties": { + "alexaHosted": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillInfo" + } + }, + "description": "Alexa Hosted skill's metadata" + }, + "v1.skill.AlexaHosted.HostedSkillInfo": { + "type": "object", + "properties": { + "repository": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillRepositoryInfo" + }, + "runtime": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillRuntime", + "x-isEnum": true + } + } + }, + "v1.skill.AlexaHosted.AlexaHostedConfig": { + "type": "object", + "properties": { + "runtime": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillRuntime", + "x-isEnum": true + }, + "region": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillRegion", + "x-isEnum": true + } + }, + "description": "Alexa hosted skill create configuration" + }, + "v1.skill.AlexaHosted.HostedSkillRuntime": { + "type": "string", + "description": "Hosted skill lambda runtime; Node.js 12.x is deprecated by Hosted Skill service as of October 24, 2022.", + "enum": [ + "NODE_10_X", + "PYTHON_3_7", + "NODE_12_X", + "NODE_16_X" + ] + }, + "v1.skill.AlexaHosted.HostedSkillRegion": { + "type": "string", + "description": "Hosted skill AWS region", + "enum": [ + "US_EAST_1", + "US_WEST_2", + "EU_WEST_1" + ] + }, + "v1.skill.AlexaHosted.HostedSkillPermissionType": { + "type": "string", + "enum": [ + "NEW_SKILL" + ] + }, + "v1.skill.AlexaHosted.HostedSkillPermissionStatus": { + "type": "string", + "enum": [ + "ALLOWED", + "NEW_USER_REGISTRATION_REQUIRED", + "RESOURCE_LIMIT_EXCEEDED", + "RATE_EXCEEDED" + ] + }, + "v1.skill.AlexaHosted.HostedSkillPermission": { + "type": "object", + "properties": { + "permission": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillPermissionType", + "x-isEnum": true + }, + "status": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostedSkillPermissionStatus", + "x-isEnum": true + }, + "actionUrl": { + "type": "string" + } + }, + "description": "Customer's permission about Hosted skill features." + }, + "v1.skill.betaTest.BetaTest": { + "type": "object", + "properties": { + "expiryDate": { + "type": "string", + "format": "date-time", + "description": "Expiry date of the beta test." + }, + "status": { + "$ref": "#/definitions/v1.skill.betaTest.Status", + "x-isEnum": true + }, + "feedbackEmail": { + "type": "string", + "description": "Email address for providing feedback" + }, + "invitationUrl": { + "type": "string", + "description": "Deeplinking for getting authorized to the beta test." + }, + "invitesRemaining": { + "type": "integer", + "description": "Remaining invite count for the beta test." + } + }, + "description": "Beta test for an Alexa skill." + }, + "v1.skill.betaTest.Status": { + "type": "string", + "description": "Status of the beta test.", + "enum": [ + "IN_DRAFT", + "STARTING", + "RUNNING", + "STOPPING", + "ENDED" + ] + }, + "v1.skill.betaTest.TestBody": { + "type": "object", + "properties": { + "feedbackEmail": { + "type": "string", + "description": "Email address for providing feedback." + } + }, + "description": "Beta test meta-data." + }, + "v1.skill.betaTest.testers.ListTestersResponse": { + "type": "object", + "properties": { + "testers": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.betaTest.testers.TesterWithDetails" + } + }, + "isTruncated": { + "type": "boolean" + }, + "nextToken": { + "type": "string" + } + } + }, + "v1.skill.betaTest.testers.TesterWithDetails": { + "type": "object", + "properties": { + "emailId": { + "type": "string", + "description": "Email address of the tester." + }, + "associationDate": { + "type": "string", + "format": "date-time", + "description": "Date and time when the tester is added to the beta test." + }, + "isReminderAllowed": { + "type": "boolean", + "description": "Indicates whether the tester is allowed to be sent reminder." + }, + "invitationStatus": { + "$ref": "#/definitions/v1.skill.betaTest.testers.InvitationStatus", + "x-isEnum": true + } + }, + "description": "Tester information." + }, + "v1.skill.betaTest.testers.InvitationStatus": { + "type": "string", + "description": "Indicates whether the tester has accepted the invitation.", + "enum": [ + "ACCEPTED", + "NOT_ACCEPTED" + ] + }, + "v1.skill.betaTest.testers.TestersList": { + "type": "object", + "properties": { + "testers": { + "type": "array", + "description": "List of the email address of testers.", + "items": { + "$ref": "#/definitions/v1.skill.betaTest.testers.Tester" + } + } + }, + "description": "List of testers." + }, + "v1.skill.betaTest.testers.Tester": { + "type": "object", + "properties": { + "emailId": { + "type": "string", + "description": "Email address of the tester." + } + } + }, + "v1.skill.blueprint.ShoppingKit": { + "type": "object", + "properties": { + "isShoppingActionsEnabled": { + "type": "boolean", + "description": "True if the skill uses Alexa Shopping Actions, false otherwise." + }, + "isAmazonAssociatesOnAlexaEnabled": { + "type": "boolean", + "description": "True if the skill uses Shopping Actions with Amazon Associates, false otherwise." + } + }, + "description": "Defines the structure for Shopping Kit related information in the skill manifest." + }, + "v1.skill.certification.CertificationSummary": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Certification Id for the skill." + }, + "status": { + "$ref": "#/definitions/v1.skill.certification.CertificationStatus", + "x-isEnum": true + }, + "skillSubmissionTimestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp for when the skill was submitted for certification." + }, + "reviewTrackingInfo": { + "$ref": "#/definitions/v1.skill.certification.ReviewTrackingInfoSummary" + } + }, + "description": "Summary of the certification resource. This is a leaner view of the certification resource for the collections API." + }, + "v1.skill.certification.CertificationResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Certification Id for the skill" + }, + "status": { + "$ref": "#/definitions/v1.skill.certification.CertificationStatus", + "x-isEnum": true + }, + "skillSubmissionTimestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp for when the skill was submitted for certification." + }, + "reviewTrackingInfo": { + "$ref": "#/definitions/v1.skill.certification.ReviewTrackingInfo" + }, + "result": { + "$ref": "#/definitions/v1.skill.certification.CertificationResult" + } + } + }, + "v1.skill.certification.CertificationStatus": { + "type": "string", + "description": "String that specifies the current status of skill's certification Possible values are \"IN_PROGRESS\", \"SUCCEEDED\", \"FAILED\" and \"CANCELLED\"\n", + "enum": [ + "IN_PROGRESS", + "SUCCEEDED", + "FAILED", + "CANCELLED" + ] + }, + "v1.skill.certification.ReviewTrackingInfoSummary": { + "type": "object", + "properties": { + "estimatedCompletionTimestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp for estimated completion of certification review for the skill." + }, + "actualCompletionTimestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp for actual completion of certification review workflow for the skill." + }, + "lastUpdated": { + "type": "string", + "format": "date-time", + "description": "Timestamp for when the last update was made to review tracking info." + } + }, + "description": "Structure for summarised view of review tracking information of the skill. This does not have the estimationUpdates array field." + }, + "v1.skill.certification.ReviewTrackingInfo": { + "type": "object", + "properties": { + "estimatedCompletionTimestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp for estimated completion of certification review for the skill." + }, + "actualCompletionTimestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp for actual completion of certification review for the skill." + }, + "lastUpdated": { + "type": "string", + "format": "date-time", + "description": "Timestamp for when the last update was made to review tracking info." + }, + "estimationUpdates": { + "type": "array", + "description": "List of updates to estimation completion time for certification review for the skill.", + "items": { + "$ref": "#/definitions/v1.skill.certification.EstimationUpdate" + } + } + }, + "description": "Structure for review tracking information of the skill." + }, + "v1.skill.certification.EstimationUpdate": { + "type": "object", + "properties": { + "originalEstimatedCompletionTimestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp for originally estimated completion of certification review for the skill." + }, + "revisedEstimatedCompletionTimestamp": { + "type": "string", + "format": "date-time", + "description": "Timestamp for originally estimated completion of certification review for the skill." + }, + "reason": { + "type": "string", + "description": "Reason for updates to estimates for certification review" + } + }, + "description": "Structure for any updates to estimation completion time for certification review for the skill." + }, + "v1.skill.certification.CertificationResult": { + "type": "object", + "properties": { + "distributionInfo": { + "$ref": "#/definitions/v1.skill.certification.DistributionInfo" + } + }, + "description": "Structure for the result for the outcomes of certification review for the skill. Currently provides the distribution information of a skill if the certification SUCCEEDED.\n" + }, + "v1.skill.certification.DistributionInfo": { + "type": "object", + "properties": { + "publishedCountries": { + "type": "array", + "description": "All countries where the skill was published in by Amazon.", + "items": { + "type": "string", + "description": "Two letter country codes in ISO 3166-1 alpha-2 format." + } + }, + "publicationFailures": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.certification.PublicationFailure" + } + } + }, + "description": "The distribution information for skill where Amazon distributed the skill" + }, + "v1.skill.certification.PublicationFailure": { + "type": "object", + "properties": { + "reason": { + "type": "string", + "description": "Reason why Amazon did not publish the skill in certain countries." + }, + "countries": { + "type": "array", + "description": "List of countries where Amazon did not publish the skill for a specific reason", + "items": { + "type": "string", + "description": "Two letter country codes in ISO 3166-1 alpha-2 format." + } + } + }, + "description": "Information about why the skill was not published in certain countries." + }, + "v1.skill.certification.ListCertificationsResponse": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "isTruncated": { + "type": "boolean", + "description": "boolean value for if the response is truncated. isTruncated = true if more than the assigned maxResults parameter value certification items are available for the skill. The results are then paginated and the remaining results can be retrieved in a similar paginated manner by using 'next' link in the _links or using the nextToken in a following request.\n" + }, + "nextToken": { + "type": "string", + "description": "Encrypted token present when isTruncated is true." + }, + "totalCount": { + "type": "integer", + "description": "Total number of certification results available for the skill." + }, + "items": { + "type": "array", + "description": "List of certifications available for a skill. The list of certifications is sorted in a default descending sort order on id field.\n", + "items": { + "$ref": "#/definitions/v1.skill.certification.CertificationSummary" + } + } + }, + "description": "List of certification summary for a skill." + }, + "v1.skill.evaluations.ProfileNluRequest": { + "type": "object", + "required": [ + "utterance" + ], + "properties": { + "utterance": { + "type": "string", + "description": "Actual representation of user input to Alexa." + }, + "multiTurnToken": { + "type": "string", + "description": "Opaque string which contains multi-turn related context." + } + } + }, + "v1.skill.evaluations.ProfileNluResponse": { + "type": "object", + "properties": { + "sessionEnded": { + "type": "boolean", + "description": "Represents when an utterance results in the skill exiting. It would be true when NLU selects 1P ExitAppIntent or GoHomeIntent, and false otherwise.\n" + }, + "selectedIntent": { + "$ref": "#/definitions/v1.skill.evaluations.ProfileNluSelectedIntent" + }, + "consideredIntents": { + "type": "array", + "description": "All intents that Alexa considered for the utterance in the request, but did not select.", + "items": { + "$ref": "#/definitions/v1.skill.evaluations.Intent" + } + }, + "multiTurn": { + "$ref": "#/definitions/v1.skill.evaluations.MultiTurn" + } + } + }, + "v1.skill.evaluations.ProfileNluSelectedIntent": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.evaluations.Intent" + } + ], + "description": "The intent that Alexa selected for the utterance in the request." + }, + "v1.skill.evaluations.MultiTurn": { + "type": "object", + "properties": { + "dialogAct": { + "$ref": "#/definitions/v1.skill.evaluations.DialogAct" + }, + "token": { + "type": "string", + "description": "Opaque string which contains multi-turn related context." + }, + "prompt": { + "type": "string", + "description": "A sample prompt defined in the dialog model for each DialogAct." + } + }, + "description": "Included when the selected intent has dialog defined and the dialog is not completed. To continue the dialog, provide the value of the token in the multiTurnToken field in the next request.\n" + }, + "v1.skill.evaluations.DialogAct": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/v1.skill.evaluations.DialogActType", + "x-isEnum": true + }, + "targetSlot": { + "type": "string", + "description": "The name of the target slot that needs to be filled or confirmed for a dialogAct" + } + }, + "description": "A representation of question prompts to the user for multi-turn, which requires user to fill a slot value, or confirm a slot value, or confirm an intent.\n" + }, + "v1.skill.evaluations.DialogActType": { + "type": "string", + "enum": [ + "Dialog.ElicitSlot", + "Dialog.ConfirmSlot", + "Dialog.ConfirmIntent" + ] + }, + "v1.skill.evaluations.Intent": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "confirmationStatus": { + "$ref": "#/definitions/v1.skill.evaluations.ConfirmationStatusType", + "x-isEnum": true + }, + "slots": { + "type": "object", + "description": "A map of key-value pairs that further describes what the user meant based on a predefined intent schema. The map can be empty.\n", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.evaluations.Slot" + } + } + } + }, + "v1.skill.evaluations.ConfirmationStatusType": { + "type": "string", + "description": "An enumeration indicating whether the user has explicitly confirmed or denied the entire intent. Possible values: \"NONE\", \"CONFIRMED\", \"DENIED\".\n", + "enum": [ + "NONE", + "CONFIRMED", + "DENIED" + ] + }, + "v1.skill.evaluations.Slot": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "confirmationStatus": { + "$ref": "#/definitions/v1.skill.evaluations.ConfirmationStatusType", + "x-isEnum": true + }, + "resolutions": { + "$ref": "#/definitions/v1.skill.evaluations.SlotResolutions" + } + } + }, + "v1.skill.evaluations.SlotResolutions": { + "type": "object", + "properties": { + "resolutionsPerAuthority": { + "type": "array", + "description": "An array of objects representing each possible authority for entity resolution. An authority represents the source for the data provided for the slot. For a custom slot type, the authority is the slot type you defined.\n", + "items": { + "$ref": "#/definitions/v1.skill.evaluations.ResolutionsPerAuthorityItems" + } + } + }, + "description": "A resolutions object representing the results of resolving the words captured from the user's utterance.\n" + }, + "v1.skill.evaluations.ResolutionsPerAuthorityItems": { + "type": "object", + "properties": { + "authority": { + "type": "string", + "description": "The name of the authority for the slot values. For custom slot types, this authority label incorporates your skill ID and the slot type name.\n" + }, + "status": { + "$ref": "#/definitions/v1.skill.evaluations.ResolutionsPerAuthorityStatus" + }, + "values": { + "type": "array", + "description": "An array of resolved values for the slot.", + "items": { + "$ref": "#/definitions/v1.skill.evaluations.ResolutionsPerAuthorityValueItems" + } + } + } + }, + "v1.skill.evaluations.ResolutionsPerAuthorityStatus": { + "type": "object", + "properties": { + "code": { + "$ref": "#/definitions/v1.skill.evaluations.ResolutionsPerAuthorityStatusCode", + "x-isEnum": true + } + }, + "description": "An object representing the status of entity resolution for the slot." + }, + "v1.skill.evaluations.ResolutionsPerAuthorityStatusCode": { + "type": "string", + "description": "A code indicating the results of attempting to resolve the user utterance against the defined slot types. This can be one of the following:\nER_SUCCESS_MATCH: The spoken value matched a value or synonym explicitly defined in your custom slot type. ER_SUCCESS_NO_MATCH: The spoken value did not match any values or synonyms explicitly defined in your custom slot type. ER_ERROR_TIMEOUT: An error occurred due to a timeout. ER_ERROR_EXCEPTION: An error occurred due to an exception during processing.\n", + "enum": [ + "ER_SUCCESS_MATCH", + "ER_SUCCESS_NO_MATCH", + "ER_ERROR_TIMEOUT", + "ER_ERROR_EXCEPTION" + ] + }, + "v1.skill.evaluations.ResolutionsPerAuthorityValueItems": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The string for the resolved slot value." + }, + "id": { + "type": "string", + "description": "The unique ID defined for the resolved slot value. This is based on the IDs defined in the slot type definition.\n" + } + }, + "description": "An object representing the resolved value for the slot, based on the user's utterance and the slot type definition.\n" + }, + "v1.skill.experiment.PaginationContext": { + "type": "object", + "properties": { + "nextToken": { + "type": "string", + "description": "Provided by server to retrieve the next set of paginated results." + } + }, + "description": "Defines the body that provides pagination-related properties in the operation response to indicate\nthat additional paginated results are available.\n" + }, + "v1.skill.experiment.CreateExperimentRequest": { + "type": "object", + "required": [ + "experiment" + ], + "properties": { + "experiment": { + "$ref": "#/definitions/v1.skill.experiment.CreateExperimentInput" + } + }, + "description": "Defines the request body for creating an experiment." + }, + "v1.skill.experiment.UpdateExperimentRequest": { + "type": "object", + "required": [ + "experiment" + ], + "properties": { + "experiment": { + "$ref": "#/definitions/v1.skill.experiment.UpdateExperimentInput" + } + }, + "description": "Defines the request body for updating an experiment." + }, + "v1.skill.experiment.UpdateExposureRequest": { + "type": "object", + "required": [ + "exposurePercentage" + ], + "properties": { + "exposurePercentage": { + "type": "integer", + "description": "The percentage of unique customers that will be part of the skill experiment while the experiment is running.", + "minimum": 0, + "maximum": 100 + } + }, + "description": "Defines the request body for updating the exposure of an experiment." + }, + "v1.skill.experiment.SetCustomerTreatmentOverrideRequest": { + "type": "object", + "required": [ + "treatmentId" + ], + "properties": { + "treatmentId": { + "$ref": "#/definitions/v1.skill.experiment.TreatmentId", + "x-isEnum": true + } + }, + "description": "Defines the request body for adding this customer's treatment override to an experiment." + }, + "v1.skill.experiment.GetCustomerTreatmentOverrideResponse": { + "type": "object", + "properties": { + "treatmentId": { + "$ref": "#/definitions/v1.skill.experiment.TreatmentId", + "x-isEnum": true + }, + "treatmentOverrideCount": { + "type": "integer", + "description": "The number of overrides which currently exist for the experiment.\n" + } + }, + "description": "Defines the response body when this customer's treatment override information is requested." + }, + "v1.skill.experiment.ManageExperimentStateRequest": { + "type": "object", + "required": [ + "targetState" + ], + "properties": { + "targetState": { + "$ref": "#/definitions/v1.skill.experiment.TargetState", + "x-isEnum": true + }, + "stoppedReason": { + "$ref": "#/definitions/v1.skill.experiment.ExperimentStoppedReason", + "x-isEnum": true + } + }, + "description": "Defines the request body for performing an experiment action to move it to a target state." + }, + "v1.skill.experiment.GetExperimentStateResponse": { + "type": "object", + "properties": { + "state": { + "$ref": "#/definitions/v1.skill.experiment.State", + "x-isEnum": true + } + }, + "description": "Defines the response body for retrieving the current experiment state." + }, + "v1.skill.experiment.ListExperimentsResponse": { + "type": "object", + "properties": { + "paginationContext": { + "$ref": "#/definitions/v1.skill.experiment.PaginationContext" + }, + "experiments": { + "type": "array", + "description": "List of experiments with select fields returned.", + "items": { + "$ref": "#/definitions/v1.skill.experiment.ExperimentSummary" + } + } + }, + "description": "Defines the response body for retrieving all the experiments of a skill." + }, + "v1.skill.experiment.GetExperimentResponse": { + "type": "object", + "properties": { + "experiment": { + "$ref": "#/definitions/v1.skill.experiment.ExperimentInformation" + }, + "lastStateTransition": { + "$ref": "#/definitions/v1.skill.experiment.ExperimentLastStateTransition" + } + }, + "description": "Defines the response body for retrieving an experiment." + }, + "v1.skill.experiment.ListExperimentMetricSnapshotsResponse": { + "type": "object", + "properties": { + "paginationContext": { + "$ref": "#/definitions/v1.skill.experiment.PaginationContext" + }, + "metricSnapshots": { + "type": "array", + "description": "List of experiment metric snapshots.", + "items": { + "$ref": "#/definitions/v1.skill.experiment.MetricSnapshot" + } + } + }, + "description": "Defines the response body for retrieving the experiment metric snapshots." + }, + "v1.skill.experiment.GetExperimentMetricSnapshotResponse": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.experiment.MetricSnapshotStatus", + "x-isEnum": true + }, + "statusReason": { + "type": "string", + "description": "The reason why the metric snapshot status is unreliable.\n" + }, + "metrics": { + "type": "array", + "description": "List of actual experiment metrics represented by a metric snapshot.", + "items": { + "$ref": "#/definitions/v1.skill.experiment.Metric" + } + } + }, + "description": "Defines the response body for retrieving the experiment results." + }, + "v1.skill.experiment.ExperimentInformation": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name that developer assigns to the experiment for easier identification." + }, + "description": { + "type": "string", + "description": "Hypothesis that developer provides to describe the experiment's purpose." + }, + "type": { + "$ref": "#/definitions/v1.skill.experiment.ExperimentType", + "x-isEnum": true + }, + "plannedDuration": { + "type": "string", + "description": "The number of weeks the skill builder intends to run the experiment.\nUsed for documentation purposes and by metric platform as a reference.\nDoes not impact experiment execution.\nFormat uses ISO-8601 representation of duration. (Example: 4 weeks = \"P4W\")\n" + }, + "exposurePercentage": { + "type": "integer", + "description": "The percentage of unique customers that will be part of the skill experiment while the experiment is running.", + "minimum": 0, + "maximum": 100 + }, + "treatmentOverrideCount": { + "type": "integer", + "description": "The number of overrides which currently exist for the experiment.\n" + }, + "metricConfigurations": { + "type": "array", + "description": "List of metric configurations that determine which metrics are key/guardrail metrics and the expected metric direction.\nThis is required by the system that collects metrics and generates the metric reports.\n", + "items": { + "$ref": "#/definitions/v1.skill.experiment.MetricConfiguration" + } + }, + "state": { + "$ref": "#/definitions/v1.skill.experiment.State", + "x-isEnum": true + }, + "history": { + "$ref": "#/definitions/v1.skill.experiment.ExperimentHistory" + }, + "trigger": { + "$ref": "#/definitions/v1.skill.experiment.ExperimentTrigger" + } + }, + "description": "Defines the full Experiment body which would contain all experiment details.\n" + }, + "v1.skill.experiment.ExperimentLastStateTransition": { + "type": "object", + "properties": { + "sourceState": { + "$ref": "#/definitions/v1.skill.experiment.SourceState", + "x-isEnum": true + }, + "targetState": { + "$ref": "#/definitions/v1.skill.experiment.DestinationState", + "x-isEnum": true + }, + "status": { + "$ref": "#/definitions/v1.skill.experiment.StateTransitionStatus", + "x-isEnum": true + }, + "startTime": { + "type": "string", + "format": "date-time" + }, + "endTime": { + "type": "string", + "format": "date-time" + }, + "errors": { + "type": "array", + "description": "List of error objects which define what errors caused the state transition failure.\n", + "items": { + "$ref": "#/definitions/v1.skill.experiment.StateTransitionError" + } + } + }, + "description": "Defines the last state transition information for the experiment.\n" + }, + "v1.skill.experiment.CreateExperimentInput": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name that developer assigns to the experiment for easier identification.", + "minLength": 1, + "maxLength": 255 + }, + "description": { + "type": "string", + "description": "Hypothesis that developer provides to describe the experiment's purpose.", + "maxLength": 300 + }, + "type": { + "$ref": "#/definitions/v1.skill.experiment.ExperimentType", + "x-isEnum": true + }, + "plannedDuration": { + "type": "string", + "description": "The number of weeks the skill builder intends to run the experiment.\nUsed for documentation purposes and by metric platform as a reference.\nDoes not impact experiment execution.\nFormat uses ISO-8601 representation of duration. (Example: 4 weeks = \"P4W\")\n", + "minLength": 1, + "maxLength": 255 + }, + "exposurePercentage": { + "type": "integer", + "description": "The percentage of unique customers that will be part of the skill experiment while the experiment is running.", + "minimum": 0, + "maximum": 100 + }, + "metricConfigurations": { + "type": "array", + "description": "List of metric configurations that determine which metrics are key/guardrail metrics and the expected metric direction.", + "items": { + "$ref": "#/definitions/v1.skill.experiment.MetricConfiguration" + } + } + }, + "description": "Defines the Experiment body used for requesting an experiment creation.\nOnly includes fields that are editable by the user.\n" + }, + "v1.skill.experiment.UpdateExperimentInput": { + "type": "object", + "properties": { + "description": { + "type": "string", + "description": "Hypothesis that developer provides to describe the experiment's purpose.", + "maxLength": 300 + }, + "plannedDuration": { + "type": "string", + "description": "The number of weeks the skill builder intends to run the experiment.\nUsed for documentation purposes and by metric platform as a reference.\nDoes not impact experiment execution.\nFormat uses ISO-8601 representation of duration. (Example: 4 weeks = \"P4W\")\n", + "minLength": 1, + "maxLength": 255 + }, + "exposurePercentage": { + "type": "integer", + "description": "The percentage of unique customers that will be part of the skill experiment while the experiment is running.", + "minimum": 0, + "maximum": 100 + }, + "metricConfigurations": { + "type": "array", + "description": "List of metric configurations that determine which metrics are key/guardrail metrics and the expected metric direction.", + "items": { + "$ref": "#/definitions/v1.skill.experiment.MetricConfiguration" + } + } + }, + "description": "Defines the Experiment body used for requesting an experiment update.\nOnly includes fields that are editable by the user.\n" + }, + "v1.skill.experiment.ExperimentSummary": { + "type": "object", + "properties": { + "experimentId": { + "type": "string", + "description": "Identifier for experiment within a skill." + }, + "name": { + "type": "string", + "description": "Name that developer assigns to the experiment for easier identification." + }, + "state": { + "$ref": "#/definitions/v1.skill.experiment.State", + "x-isEnum": true + }, + "experimentHistory": { + "$ref": "#/definitions/v1.skill.experiment.ExperimentHistory" + } + }, + "description": "Defines the shortened Experiment body which would contain a summary of experiment information.\n" + }, + "v1.skill.experiment.ExperimentHistory": { + "type": "object", + "properties": { + "creationTime": { + "type": "string", + "format": "date-time" + }, + "startTime": { + "type": "string", + "format": "date-time" + }, + "stoppedReason": { + "type": "string", + "description": "The reason an experiment was stopped if experiment was stopped." + } + }, + "description": "Defines historical properties of a skill experiment." + }, + "v1.skill.experiment.ExperimentTrigger": { + "type": "object", + "properties": { + "scheduledEndTime": { + "type": "string", + "format": "date-time" + } + }, + "description": "Defines trigger properties of a skill experiment." + }, + "v1.skill.experiment.MetricConfiguration": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Unique name that identifies experiment metric.", + "minLength": 1, + "maxLength": 125 + }, + "metricTypes": { + "type": "array", + "description": "List of types that the metric has been assigned.", + "items": { + "$ref": "#/definitions/v1.skill.experiment.MetricType" + } + }, + "expectedChange": { + "$ref": "#/definitions/v1.skill.experiment.MetricChangeDirection", + "x-isEnum": true + } + }, + "description": "Configures the metrics that will be captured for the skill experiment.\nThis is required by the system that collects metrics and generates the metric reports.\n" + }, + "v1.skill.experiment.MetricSnapshot": { + "type": "object", + "properties": { + "metricSnapshotId": { + "type": "string", + "description": "Identifies the experiment metric snapshot in a skill experiment." + }, + "startDate": { + "type": "string", + "format": "date-time", + "description": "The start date of the metric snapshot." + }, + "endDate": { + "type": "string", + "format": "date-time", + "description": "The end date of the metric snapshot." + } + }, + "description": "Defines the metric snapshot body with supplemental metadata properties." + }, + "v1.skill.experiment.Metric": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Unique name that identifies experiment metric." + }, + "treatmentId": { + "$ref": "#/definitions/v1.skill.experiment.TreatmentId", + "x-isEnum": true + }, + "values": { + "$ref": "#/definitions/v1.skill.experiment.MetricValues" + } + }, + "description": "Defines the metrics body." + }, + "v1.skill.experiment.MetricValues": { + "type": "object", + "properties": { + "mean": { + "type": "number", + "format": "double", + "description": "The mean (average) of each sample (T1 or C group)." + }, + "percentDiff": { + "type": "number", + "format": "double", + "description": "The relative percent difference between the mean of the T1 group and the mean of the C group." + }, + "confidenceIntervalLower": { + "type": "number", + "format": "double", + "description": "The lower limit number of the confidence interval range.\nConfidence interval measures the probability that the mean falls within a range.\n" + }, + "confidenceIntervalUpper": { + "type": "number", + "format": "double", + "description": "The upper limit number of the confidence interval range." + }, + "pValue": { + "type": "number", + "format": "double", + "description": "The probability that the difference between the two means (from T1 and C) is due to random sampling error." + }, + "userCount": { + "type": "integer", + "format": "int64", + "description": "Count of users in the treatment sample." + } + }, + "description": "Defines the body of the metric result values." + }, + "v1.skill.experiment.MetricType": { + "type": "string", + "description": "The metric types a specific metric can be assigned to.\n* `KEY` - Identified as a metric that should provide clear evidence of expected changes caused by the new treatment experience.\n* `GUARDRAIL` - Identified as a metric that would detect unexpected regressions caused by the new treatment experience.\n", + "enum": [ + "KEY", + "GUARDRAIL" + ] + }, + "v1.skill.experiment.MetricChangeDirection": { + "type": "string", + "description": "The direction that an experiment metric is expected to trend during the experiment.\n* `INCREASE` - An upward change in metric value.\n* `DECREASE` - A downward change in metric value.\n", + "enum": [ + "INCREASE", + "DECREASE" + ] + }, + "v1.skill.experiment.State": { + "type": "string", + "description": "* `CREATED` - The experiment is successfully created but has not been enabled or started.\n* `ENABLING` - The experiment has initiated the transition to becoming \"ENABLED\".\n* `ENABLED` - The experiment configurations have been deployed but only customer treatment overrides set to T1 can view the T1 experience of a skill. No metrics are collected.\n* `RUNNING` - The experiment has started and a percentage of skill customers defined in the exposurePercentage will be entered into the experiment. Customers will randomly get assigned the T1 or C experience. Metric collection will begin.\n* `STOPPING` - The experiment has initated the transition to becoming \"STOPPED\".\n* `STOPPED` - The experiment has ended and all customers will experience the C behavior. Metrics will stop being collected.\n* `FAILED` - The experiment configurations have failed to deploy while enabling or starting the experiment.\n", + "enum": [ + "CREATED", + "ENABLING", + "ENABLED", + "RUNNING", + "STOPPING", + "STOPPED", + "FAILED" + ] + }, + "v1.skill.experiment.TargetState": { + "type": "string", + "description": "These states are used to perform a transition action (Pilot, Start, Stop, Conclude) on the experiment.\n* `ENABLED`: Target state for the 'Pilot' action. Experiment configurations are deployed and customer overrides are activated. Actual experiment has not started yet.\n* `RUNNING`: Target state for the 'Start' action. Experiment has started with the configured exposure. Skill customers selected within the exposure are contributing to the metric data.\n* `STOPPED`: Target state for the 'Stop' action. Experiment has stopped and all experiment configurations have been removed. All customers will see the C behavior by default.\n", + "enum": [ + "ENABLED", + "RUNNING", + "STOPPED" + ] + }, + "v1.skill.experiment.SourceState": { + "type": "string", + "description": "These states are for recording the previous state from a transition action (Created, Pilot, Start, Stop) on the experiment.\n* `CREATED`: Result state for the 'Create' action. Experiment has been created.\n* `ENABLED`: Result state for the 'Pilot' action. Experiment configurations are deployed and customer overrides are activated. Actual experiment has not started yet.\n* `RUNNING`: Result state for the 'Start' action. Experiment has started with the configured exposure. Skill customers selected within the exposure are contributing to the metric data.\n", + "enum": [ + "CREATED", + "ENABLED", + "RUNNING" + ] + }, + "v1.skill.experiment.DestinationState": { + "type": "string", + "description": "These states are for recording the destination state from a transition action (Created, Pilot, Start, Stop) on the experiment.\n* `CREATED`: Result state for the 'Create' action. Experiment has been created.\n* `ENABLED`: Result state for the 'Pilot' action. Experiment configurations are deployed and customer overrides are activated. Actual experiment has not started yet.\n* `RUNNING`: Result state for the 'Start' action. Experiment has started with the configured exposure. Skill customers selected within the exposure are contributing to the metric data.\n* `STOPPED`: Result state for the 'Stop' action. Experiment has stopped and all experiment configurations have been removed. All customers will see the C behavior by default.\n", + "enum": [ + "CREATED", + "ENABLED", + "RUNNING", + "STOPPED" + ] + }, + "v1.skill.experiment.TreatmentId": { + "type": "string", + "description": "Treatment identifier for an experiment.\n* `C` - Control. The treatment that defines the existing skill experience.\n* `T1` - Treatment 1. The threatment that defines the experimental skill experience.\n", + "enum": [ + "C", + "T1" + ] + }, + "v1.skill.experiment.ExperimentType": { + "type": "string", + "description": "Type of the experiment which directly affects the skill version used for T1.\nC will always point to the skill version in the skill's LIVE stage regardless of experiment type.\n", + "enum": [ + "ENDPOINT_BASED" + ] + }, + "v1.skill.experiment.StateTransitionStatus": { + "type": "string", + "description": "Status indiciating whether the state transiton was successful, in progress, or failed.\n", + "enum": [ + "SUCCEEDED", + "IN_PROGRESS", + "FAILED" + ] + }, + "v1.skill.experiment.ExperimentStoppedReason": { + "type": "string", + "description": "The reason indicating why an exerpiment was stopped. If none is chosen then default to DEVELOPER_REQUEST.\nOnly used when putting experiment into STOPPED state.\n", + "enum": [ + "EXPERIMENT_SUCCESS", + "EXPERIMENT_ISSUE" + ] + }, + "v1.skill.experiment.StateTransitionErrorType": { + "type": "string", + "description": "The error type which caused a state transition failure.\n", + "enum": [ + "INELIGIBLITY" + ] + }, + "v1.skill.experiment.MetricSnapshotStatus": { + "type": "string", + "description": "The status of the metric snapshot, whether it's RELIABLE or UNRELIABLE.\n", + "enum": [ + "RELIABLE", + "UNRELIABLE" + ] + }, + "v1.skill.experiment.StateTransitionError": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/v1.skill.experiment.StateTransitionErrorType", + "x-isEnum": true + }, + "message": { + "type": "string", + "description": "The message associated with the state transition error." + } + }, + "description": "The errors which caused a state transition failure.\n" + }, + "v1.skill.history.DialogActName": { + "type": "string", + "description": "Dialog act directive name.\n* `Dialog.ElicitSlot`: Alexa asked the user for the value of a specific slot. (https://developer.amazon.com/docs/custom-skills/dialog-interface-reference.html#elicitslot)\n* `Dialog.ConfirmSlot`: Alexa confirmed the value of a specific slot before continuing with the dialog. (https://developer.amazon.com/docs/custom-skills/dialog-interface-reference.html#confirmslot)\n* `Dialog.ConfirmIntent`: Alexa confirmed the all the information the user has provided for the intent before the skill took action. (https://developer.amazon.com/docs/custom-skills/dialog-interface-reference.html#confirmintent)\n", + "enum": [ + "Dialog.ElicitSlot", + "Dialog.ConfirmSlot", + "Dialog.ConfirmIntent" + ] + }, + "v1.skill.history.Confidence": { + "type": "object", + "properties": { + "bin": { + "$ref": "#/definitions/v1.skill.history.ConfidenceBin", + "x-isEnum": true + } + }, + "description": "The hypothesized confidence for this interaction." + }, + "v1.skill.history.ConfidenceBin": { + "type": "string", + "description": "Intent confidence bin for this utterance.\n* `HIGH`: Intent was recognized with high confidence.\n* `MEDIUM`: Intent was recognized with medium confidence.\n* `LOW`: Intent was recognized with low confidence. Note: Low confidence intents are not sent to the skill.\n", + "enum": [ + "HIGH", + "MEDIUM", + "LOW" + ] + }, + "v1.skill.history.Slot": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the slot that was used in this interaction." + } + } + }, + "v1.skill.history.Intent": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The hypothesized intent for this utterance." + }, + "confidence": { + "$ref": "#/definitions/v1.skill.history.Confidence" + }, + "slots": { + "type": "object", + "description": "The hypothesized slot(s) for this interaction.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.history.Slot" + } + } + }, + "description": "Provides the intent name, slots and confidence of the intent used in this interaction." + }, + "v1.skill.history.IntentRequest": { + "type": "object", + "properties": { + "dialogAct": { + "$ref": "#/definitions/v1.skill.history.DialogAct" + }, + "intent": { + "$ref": "#/definitions/v1.skill.history.Intent" + }, + "interactionType": { + "$ref": "#/definitions/v1.skill.history.InteractionType", + "x-isEnum": true + }, + "locale": { + "$ref": "#/definitions/v1.skill.history.IntentRequestLocales", + "x-isEnum": true + }, + "publicationStatus": { + "$ref": "#/definitions/v1.skill.history.PublicationStatus", + "x-isEnum": true + }, + "stage": { + "$ref": "#/definitions/v1.StageType", + "x-isEnum": true + }, + "utteranceText": { + "type": "string", + "description": "The transcribed user speech." + } + } + }, + "v1.skill.history.DialogAct": { + "type": "object", + "properties": { + "name": { + "$ref": "#/definitions/v1.skill.history.DialogActName", + "x-isEnum": true + } + }, + "description": "The dialog act used in the interaction." + }, + "v1.skill.history.IntentRequests": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "nextToken": { + "type": "string", + "description": "This token can be used to load the next page of the result." + }, + "isTruncated": { + "type": "boolean", + "description": "This property is true when all the results matching the search request haven't been returned, false otherwise." + }, + "totalCount": { + "type": "number", + "description": "Total number of records that matched the given search query." + }, + "startIndex": { + "type": "number", + "description": "Position of the current page in the result set." + }, + "skillId": { + "type": "string", + "description": "The Skill Id." + }, + "items": { + "type": "array", + "description": "List of intent requests for the skill", + "items": { + "$ref": "#/definitions/v1.skill.history.IntentRequest" + } + } + }, + "description": "Response to the GET Intent Request History API. It contains the collection of utterances for the skill, nextToken and other metadata related to the search query." + }, + "v1.skill.history.IntentRequestLocales": { + "type": "string", + "description": "Skill locale in which this interaction occurred.", + "enum": [ + "en-US", + "en-GB", + "en-IN", + "en-CA", + "en-AU", + "de-DE", + "ja-JP" + ] + }, + "v1.skill.history.PublicationStatus": { + "type": "string", + "description": "The publication status of the skill when this interaction occurred", + "enum": [ + "Development", + "Certification" + ] + }, + "v1.skill.history.InteractionType": { + "type": "string", + "description": "Indicates if the utterance was executed as a \"ONE_SHOT\" interaction or \"MODAL\" interaction.\n* `ONE_SHOT`: The user invokes the skill and states their intent in a single phrase.\n* `MODAL`: The user first invokes the skill and then states their intent.\n", + "enum": [ + "ONE_SHOT", + "MODAL" + ] + }, + "v1.skill.history.sortFieldForIntentRequestType": { + "type": "string", + "enum": [ + "recordCount", + "intent.name", + "intent.confidence.bin", + "stage", + "dialogAct.name", + "locale", + "utteranceText", + "publicationStatus", + "interactionType" + ], + "default": "recordCount" + }, + "v1.skill.history.IntentConfidenceBin": { + "type": "string", + "description": "A filter used to retrieve items where the intent confidence bin is equal to the given value.\n* `HIGH`: Intent was recognized with high confidence.\n* `MEDIUM`: Intent was recognized with medium confidence.\n* `LOW`: Intent was recognized with low confidence. Note: Low confidence intents are not sent to the skill.\n", + "enum": [ + "HIGH", + "MEDIUM", + "LOW" + ] + }, + "v1.skill.history.localeInQuery": { + "type": "string", + "description": "A filter used to retrieve items where the locale is equal to the given value.", + "enum": [ + "en-US", + "en-GB", + "en-IN", + "en-CA", + "en-AU", + "de-DE", + "ja-JP" + ] + }, + "v1.skill.interactionModel.InteractionModelData": { + "type": "object", + "required": [ + "interactionModel" + ], + "properties": { + "version": { + "type": "string" + }, + "description": { + "type": "string" + }, + "interactionModel": { + "$ref": "#/definitions/v1.skill.interactionModel.InteractionModelSchema" + } + } + }, + "v1.skill.interactionModel.InteractionModelSchema": { + "type": "object", + "required": [ + "languageModel" + ], + "properties": { + "languageModel": { + "$ref": "#/definitions/v1.skill.interactionModel.languageModel" + }, + "dialog": { + "$ref": "#/definitions/v1.skill.interactionModel.Dialog" + }, + "prompts": { + "type": "array", + "description": "List of prompts.", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.Prompt" + } + } + } + }, + "v1.skill.interactionModel.languageModel": { + "type": "object", + "required": [ + "intents", + "invocationName" + ], + "properties": { + "invocationName": { + "type": "string", + "description": "Invocation name of the skill.", + "minLength": 1 + }, + "types": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.SlotType" + } + }, + "intents": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.Intent" + }, + "minItems": 1 + }, + "modelConfiguration": { + "$ref": "#/definitions/v1.skill.interactionModel.ModelConfiguration" + } + }, + "description": "Define the language model." + }, + "v1.skill.interactionModel.ModelConfiguration": { + "type": "object", + "properties": { + "fallbackIntentSensitivity": { + "$ref": "#/definitions/v1.skill.interactionModel.FallbackIntentSensitivity" + } + }, + "description": "Global configurations applicable to a skill's model." + }, + "v1.skill.interactionModel.FallbackIntentSensitivity": { + "type": "object", + "required": [ + "level" + ], + "properties": { + "level": { + "$ref": "#/definitions/v1.skill.interactionModel.FallbackIntentSensitivityLevel", + "x-isEnum": true + } + }, + "description": "Denotes skill's sensitivity for out-of-domain utterances." + }, + "v1.skill.interactionModel.FallbackIntentSensitivityLevel": { + "type": "string", + "description": "Skill's sensitivity level for out-of-domain utterances. By default, the sensitivity level of the skill is set to ‘LOW’.\nAs the sensitivity level for a skill is increased, more customer utterances that are not supported by the skill will be captured by AMAZON.FallbackIntent.\n", + "enum": [ + "HIGH", + "MEDIUM", + "LOW" + ] + }, + "v1.skill.interactionModel.SlotType": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the custom slot type." + }, + "generatedBy": { + "type": "string", + "description": "Name of the generator used to generate this object.", + "minLength": 1, + "maxLength": 100 + }, + "values": { + "type": "array", + "description": "List of expected values. Values outside the list are still returned.", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.TypeValue" + } + }, + "valueSupplier": { + "$ref": "#/definitions/v1.skill.interactionModel.ValueSupplier" + } + }, + "description": "Custom slot type to define a list of possible values for a slot. Used for items that are not covered by Amazon's built-in slot types." + }, + "v1.skill.interactionModel.ValueSupplier": { + "type": "object", + "required": [ + "type" + ], + "discriminator": "type", + "properties": { + "type": { + "type": "string", + "description": "The exact type of validation e.g.CatalogValueSupplier etc.", + "x-isDiscriminator": true + } + }, + "description": "Supplier object to provide slot values." + }, + "v1.skill.interactionModel.InlineValueSupplier": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.ValueSupplier" + }, + { + "type": "object", + "properties": { + "values": { + "type": "array", + "description": "The list of slot type values.", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.TypeValue" + } + } + } + } + ], + "description": "Supplies inline slot type values.", + "x-discriminator-value": "InlineValueSupplier" + }, + "v1.skill.interactionModel.CatalogValueSupplier": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.ValueSupplier" + }, + { + "type": "object", + "properties": { + "valueCatalog": { + "$ref": "#/definitions/v1.skill.interactionModel.ValueCatalog" + } + } + } + ], + "description": "Supply slot values from catalog(s).", + "x-discriminator-value": "CatalogValueSupplier" + }, + "v1.skill.interactionModel.TypeValue": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "id": { + "type": "string" + }, + "name": { + "$ref": "#/definitions/v1.skill.interactionModel.TypeValueObject" + } + }, + "description": "The value schema in type object of interaction model." + }, + "v1.skill.interactionModel.TypeValueObject": { + "type": "object", + "required": [ + "synonyms", + "value" + ], + "properties": { + "value": { + "type": "string", + "minLength": 1 + }, + "synonyms": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + } + }, + "description": "The object that contains individual type values." + }, + "v1.skill.interactionModel.ValueCatalog": { + "type": "object", + "required": [ + "catalogId", + "version" + ], + "properties": { + "catalogId": { + "type": "string", + "description": "CatalogId.", + "minLength": 1 + }, + "version": { + "type": "string", + "description": "Catalog version.", + "minLength": 1 + } + }, + "description": "Catalog reference to provide values." + }, + "v1.skill.interactionModel.Intent": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "Name to identify the intent.", + "minLength": 1 + }, + "generatedBy": { + "type": "string", + "description": "Name of the generator used to generate this object.", + "minLength": 1, + "maxLength": 100 + }, + "slots": { + "type": "array", + "description": "List of slots within the intent.", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.SlotDefinition" + } + }, + "samples": { + "type": "array", + "description": "Phrases the user can speak e.g. to trigger an intent or provide value for a slot elicitation.", + "items": { + "type": "string" + } + } + }, + "description": "The set of intents your service can accept and process." + }, + "v1.skill.interactionModel.SlotDefinition": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the slot.", + "minLength": 1 + }, + "type": { + "type": "string", + "description": "The type of the slot. It can be a built-in or custom type." + }, + "multipleValues": { + "description": "Configuration object for multiple values capturing behavior for this slot.", + "$ref": "#/definitions/v1.skill.interactionModel.MultipleValuesConfig" + }, + "samples": { + "type": "array", + "description": "Phrases the user can speak e.g. to trigger an intent or provide value for a slot elicitation.", + "items": { + "type": "string" + } + } + }, + "description": "Slot definition." + }, + "v1.skill.interactionModel.MultipleValuesConfig": { + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Boolean that indicates whether this slot can capture multiple values." + } + }, + "description": "Configuration object for multiple values capturing behavior for this slot." + }, + "v1.skill.interactionModel.Dialog": { + "type": "object", + "required": [ + "intents" + ], + "properties": { + "delegationStrategy": { + "description": "Defines a delegation strategy for the dialogs in this dialog model.", + "$ref": "#/definitions/v1.skill.interactionModel.DelegationStrategyType", + "x-isEnum": true + }, + "intents": { + "type": "array", + "description": "List of intents that have dialog rules associated with them. Dialogs can also span multiple intents.", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.DialogIntents" + }, + "minItems": 1 + } + }, + "description": "Defines dialog rules e.g. slot elicitation and validation, intent chaining etc." + }, + "v1.skill.interactionModel.DialogIntents": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the intent that has a dialog specification.", + "minLength": 1 + }, + "delegationStrategy": { + "description": "Defines an intent-specific delegation strategy for this dialog intent. Overrides dialog-level setting.", + "$ref": "#/definitions/v1.skill.interactionModel.DelegationStrategyType", + "x-isEnum": true + }, + "slots": { + "type": "array", + "description": "List of slots that have dialog rules.", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.DialogSlotItems" + } + }, + "confirmationRequired": { + "type": "boolean", + "description": "Describes whether confirmation of the intent is required." + }, + "prompts": { + "$ref": "#/definitions/v1.skill.interactionModel.DialogIntentsPrompts" + } + } + }, + "v1.skill.interactionModel.DelegationStrategyType": { + "type": "string", + "description": "Enumerates delegation strategies used to control automatic dialog management through the defined dialog model. When no delegation strategies are defined, the value SKILL_RESPONSE is assumed.\n", + "enum": [ + "ALWAYS", + "SKILL_RESPONSE" + ] + }, + "v1.skill.interactionModel.DialogSlotItems": { + "type": "object", + "required": [ + "name", + "prompts", + "type" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the slot that has dialog rules associated with it.", + "minLength": 1 + }, + "type": { + "type": "string", + "description": "Type of the slot in the dialog intent.", + "minLength": 1 + }, + "elicitationRequired": { + "type": "boolean", + "description": "Describes whether elicitation of the slot is required." + }, + "confirmationRequired": { + "type": "boolean", + "description": "Describes whether confirmation of the slot is required." + }, + "prompts": { + "$ref": "#/definitions/v1.skill.interactionModel.DialogPrompts" + }, + "validations": { + "type": "array", + "description": "List of validations for the slot. if validation fails, user will be prompted with the provided prompt.", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.SlotValidation" + } + } + } + }, + "v1.skill.interactionModel.DialogPrompts": { + "type": "object", + "properties": { + "elicitation": { + "type": "string", + "description": "Reference to a prompt-id to use If this slot value is missing." + }, + "confirmation": { + "type": "string", + "description": "Reference to a prompt-id to use to confirm the slots value." + } + }, + "description": "Dialog prompts associated with this slot i.e. for elicitation and/or confirmation." + }, + "v1.skill.interactionModel.SlotValidation": { + "type": "object", + "required": [ + "prompt", + "type" + ], + "discriminator": "type", + "properties": { + "type": { + "type": "string", + "description": "The exact type of validation e.g. isLessThan,isGreaterThan etc.", + "x-isDiscriminator": true + }, + "prompt": { + "type": "string", + "description": "The prompt id that should be used if validation fails.", + "minLength": 1 + } + }, + "description": "Validation on a slot with support for prompt and confirmation." + }, + "v1.skill.interactionModel.DialogIntentsPrompts": { + "type": "object", + "properties": { + "elicitation": { + "type": "string", + "description": "Enum value in the dialog_slots map to reference the elicitation prompt id." + }, + "confirmation": { + "type": "string", + "description": "Enum value in the dialog_slots map to reference the confirmation prompt id." + } + }, + "description": "Collection of prompts for this intent." + }, + "v1.skill.interactionModel.IsGreaterThan": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.SlotValidation" + }, + { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string", + "description": "Value to compare to.", + "minLength": 1 + } + } + } + ], + "description": "Validates that slot value is greater than the specified value.", + "x-discriminator-value": "isGreaterThan" + }, + "v1.skill.interactionModel.IsGreaterThanOrEqualTo": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.SlotValidation" + }, + { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string", + "description": "Value to compare to.", + "minLength": 1 + } + } + } + ], + "description": "Validates that slot value is greater than or equals to the specified value.", + "x-discriminator-value": "isGreaterThanOrEqualTo" + }, + "v1.skill.interactionModel.IsLessThan": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.SlotValidation" + }, + { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string", + "description": "Value to compare to.", + "minLength": 1 + } + } + } + ], + "description": "Validates that slot value is less than or equals to the specified value.", + "x-discriminator-value": "isLessThan" + }, + "v1.skill.interactionModel.IsLessThanOrEqualTo": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.SlotValidation" + }, + { + "type": "object", + "required": [ + "value" + ], + "properties": { + "value": { + "type": "string", + "description": "Value to compare to.", + "minLength": 1 + } + } + } + ], + "description": "Validates that slot value is less than or equals to the specified value.", + "x-discriminator-value": "isLessThanOrEqualTo" + }, + "v1.skill.interactionModel.IsInSet": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.SlotValidation" + }, + { + "type": "object", + "required": [ + "values" + ], + "properties": { + "values": { + "type": "array", + "description": "List of values to check.", + "items": { + "type": "string" + }, + "minItems": 1 + } + } + } + ], + "description": "Validates if the slot is in the specified set of values.", + "x-discriminator-value": "isInSet" + }, + "v1.skill.interactionModel.IsNotInSet": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.SlotValidation" + }, + { + "type": "object", + "required": [ + "values" + ], + "properties": { + "values": { + "type": "array", + "description": "List of values to check.", + "items": { + "type": "string" + }, + "minItems": 1 + } + } + } + ], + "description": "Validates if the slot is not in the specified set of values.", + "x-discriminator-value": "isNotInSet" + }, + "v1.skill.interactionModel.HasEntityResolutionMatch": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.SlotValidation" + } + ], + "description": "The hasEntityResolutionMatch would allow Alexa to trigger a re-prompt when the status produced by ER is \"ER_SUCCESS_NO_MATCH\".", + "x-discriminator-value": "hasEntityResolutionMatch" + }, + "v1.skill.interactionModel.IsInDuration": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.SlotValidation" + }, + { + "type": "object", + "properties": { + "start": { + "type": "string", + "description": "* `AMAZON.DATE`: ISO 8601 Duration using Y, M or D components or ISO 8601 Calendar Date in YYYY-MM-DD format.\n* `AMAZON.TIME`: ISO 8601 Duration using H or M component or ISO 8601 24-Hour Clock Time in hh:mm format.\n" + }, + "end": { + "type": "string", + "description": "* `AMAZON.DATE`: ISO 8601 Duration using Y, M or D components or ISO 8601 Calendar Date in YYYY-MM-DD format.\n* `AMAZON.TIME`: ISO 8601 Duration using H or M component or ISO 8601 24-Hour Clock Time in hh:mm format.\n" + } + } + } + ], + "description": "Validates that the given date or time (as a slot value) is in a given interval. Unlike other range validations, duration based validations lets the developer define a dynamic range of date or time using ISO_8601 Duration Format. Based on the given 'start' and 'end' parameters an interval is created. The slot value given by the skill's user at runtime is then validated inside this interval.\nBoth 'start' and 'end' parameters are in reference to the current date/time. Here the current date/time refers to the date/time when the skill's user made the request.\n", + "x-discriminator-value": "isInDuration" + }, + "v1.skill.interactionModel.IsNotInDuration": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.SlotValidation" + }, + { + "type": "object", + "properties": { + "start": { + "type": "string", + "description": "* `AMAZON.DATE`: ISO 8601 Duration using Y, M or D components or ISO 8601 Calendar Date in YYYY-MM-DD format.\n* `AMAZON.TIME`: ISO 8601 Duration using H or M component or ISO 8601 24-Hour Clock Time in hh:mm format.\n" + }, + "end": { + "type": "string", + "description": "* `AMAZON.DATE`: ISO 8601 Duration using Y, M or D components or ISO 8601 Calendar Date in YYYY-MM-DD format.\n* `AMAZON.TIME`: ISO 8601 Duration using H or M component or ISO 8601 24-Hour Clock Time in hh:mm format.\n" + } + } + } + ], + "description": "Validates that the given date or time (as a slot value) is not in a given interval. Unlike other range validations, duration based validations lets the developer define a dynamic range of date or time using ISO_8601 Duration Format. Based on the given 'start' and 'end' parameters an interval is created. The slot value given by the skill's user at runtime is then validated inside this interval.\nBoth 'start' and 'end' parameters are in reference to the current date/time. Here the current date/time refers to the date/time when the skill's user made the request.\n", + "x-discriminator-value": "isNotInDuration" + }, + "v1.skill.interactionModel.Prompt": { + "type": "object", + "required": [ + "id", + "variations" + ], + "properties": { + "id": { + "type": "string", + "description": "The prompt id, this id can be used from dialog definitions.", + "minLength": 1 + }, + "variations": { + "type": "array", + "description": "List of variations of the prompt, each variation can be either a text string or a well defined ssml string depending on the type defined.", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.PromptItems" + }, + "minItems": 1 + } + } + }, + "v1.skill.interactionModel.PromptItems": { + "type": "object", + "required": [ + "value" + ], + "properties": { + "type": { + "$ref": "#/definitions/v1.skill.interactionModel.PromptItemsType", + "x-isEnum": true + }, + "value": { + "type": "string", + "description": "Specifies the prompt.", + "minLength": 1 + } + } + }, + "v1.skill.interactionModel.PromptItemsType": { + "type": "string", + "description": "Prompt can be specified in different formats e.g. text, ssml.", + "enum": [ + "SSML", + "PlainText" + ] + }, + "v1.skill.interactionModel.catalog.UpdateRequest": { + "type": "object", + "required": [ + "description", + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The catalog name." + }, + "description": { + "type": "string", + "description": "The catalog description with a 255 character maximum." + } + }, + "description": "Catalog update request object." + }, + "v1.skill.interactionModel.catalog.DefinitionData": { + "type": "object", + "required": [ + "catalog", + "vendorId" + ], + "properties": { + "catalog": { + "$ref": "#/definitions/v1.skill.interactionModel.catalog.CatalogInput" + }, + "vendorId": { + "type": "string", + "description": "The vendorId that the catalog should belong to." + } + }, + "description": "Catalog request definitions." + }, + "v1.skill.interactionModel.catalog.CatalogInput": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the catalog." + }, + "description": { + "type": "string", + "description": "Description string about the catalog." + } + }, + "description": "Definition for catalog input." + }, + "v1.skill.interactionModel.catalog.CatalogEntity": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the catalog." + }, + "description": { + "type": "string", + "description": "Description string about the catalog." + } + }, + "description": "Definition for catalog entity." + }, + "v1.skill.interactionModel.catalog.CatalogItem": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the catalog." + }, + "description": { + "type": "string", + "description": "Description string about the catalog." + }, + "catalogId": { + "type": "string", + "description": "Identifier of the catalog, optional in get response as the request already has catalogId." + }, + "_links": { + "$ref": "#/definitions/v1.Links" + } + }, + "description": "Definition for catalog entity." + }, + "v1.skill.interactionModel.catalog.ListCatalogResponse": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "catalogs": { + "type": "array", + "description": "List of catalogs.\n", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.catalog.CatalogItem" + } + }, + "isTruncated": { + "type": "boolean" + }, + "nextToken": { + "type": "string" + }, + "totalCount": { + "type": "integer" + } + }, + "description": "List of catalog versions of a skill for the vendor." + }, + "v1.skill.interactionModel.catalog.CatalogStatus": { + "type": "object", + "properties": { + "lastUpdateRequest": { + "$ref": "#/definitions/v1.skill.interactionModel.catalog.LastUpdateRequest" + } + }, + "description": "Defines the structure for catalog status response." + }, + "v1.skill.interactionModel.catalog.LastUpdateRequest": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.interactionModel.catalog.CatalogStatusType", + "x-isEnum": true + }, + "version": { + "type": "string", + "description": "The version id of the entity returned." + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "description": "Contains attributes related to last modification request of a resource." + }, + "v1.skill.interactionModel.catalog.CatalogStatusType": { + "type": "string", + "description": "Status of last modification request for a resource.", + "enum": [ + "FAILED", + "IN_PROGRESS", + "SUCCEEDED" + ] + }, + "v1.skill.interactionModel.catalog.CatalogResponse": { + "type": "object", + "properties": { + "catalogId": { + "type": "string", + "description": "ID of the catalog created." + } + }, + "description": "CatalogId information." + }, + "v1.skill.interactionModel.catalog.CatalogDefinitionOutput": { + "type": "object", + "properties": { + "catalog": { + "$ref": "#/definitions/v1.skill.interactionModel.catalog.CatalogEntity" + }, + "creationTime": { + "type": "string", + "description": "Time of the catalog definition creation." + }, + "totalVersions": { + "type": "string", + "description": "Total number of versions." + } + }, + "description": "Catalog request definitions." + }, + "v1.skill.interactionModel.conflictDetection.GetConflictDetectionJobStatusResponse": { + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.interactionModel.conflictDetection.ConflictDetectionJobStatus", + "x-isEnum": true + }, + "totalConflicts": { + "type": "number", + "format": "long", + "description": "The total number of conflicts within skill model." + } + } + }, + "v1.skill.interactionModel.conflictDetection.ConflictDetectionJobStatus": { + "type": "string", + "description": "The status of conflict detection job.", + "enum": [ + "IN_PROGRESS", + "COMPLETED", + "FAILED" + ] + }, + "v1.skill.interactionModel.conflictDetection.GetConflictsResponse": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.conflictDetection.PagedResponse" + }, + { + "type": "object", + "required": [ + "results" + ], + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.conflictDetection.GetConflictsResponseResult" + } + } + } + } + ] + }, + "v1.skill.interactionModel.conflictDetection.GetConflictsResponseResult": { + "type": "object", + "required": [ + "conflictingUtterance", + "conflicts" + ], + "properties": { + "conflictingUtterance": { + "type": "string", + "description": "Utterance resolved from sample utterance that causes conflicts among different intents." + }, + "conflicts": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.conflictDetection.ConflictResult" + } + } + } + }, + "v1.skill.interactionModel.conflictDetection.ConflictResult": { + "type": "object", + "required": [ + "intent", + "sampleUtterance" + ], + "properties": { + "sampleUtterance": { + "type": "string", + "description": "Sample utterance provided by 3P developers for intents." + }, + "intent": { + "$ref": "#/definitions/v1.skill.interactionModel.conflictDetection.ConflictIntent" + } + } + }, + "v1.skill.interactionModel.conflictDetection.ConflictIntent": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "Conflict intent name" + }, + "slots": { + "type": "object", + "description": "List of conflict intent slots", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.interactionModel.conflictDetection.ConflictIntentSlot" + } + } + } + }, + "v1.skill.interactionModel.conflictDetection.ConflictIntentSlot": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "value": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "v1.skill.interactionModel.conflictDetection.PagedResponse": { + "type": "object", + "properties": { + "paginationContext": { + "$ref": "#/definitions/v1.skill.interactionModel.conflictDetection.PaginationContext" + }, + "_links": { + "$ref": "#/definitions/v1.Links" + } + } + }, + "v1.skill.interactionModel.conflictDetection.PaginationContext": { + "type": "object", + "properties": { + "nextToken": { + "type": "string", + "description": "A token returned if there are more results for the given inputs than `maxResults` from the request. It should also be used in the next request to retrieve more results." + }, + "totalCount": { + "type": "integer", + "format": "int64", + "description": "Total avaliable results for the given query." + } + } + }, + "v1.skill.interactionModel.version.catalogUpdate": { + "type": "object", + "properties": { + "description": { + "type": "string", + "description": "The catalog description with a 255 character maximum." + } + }, + "description": "Catalog update description object." + }, + "v1.skill.interactionModel.version.VersionData": { + "type": "object", + "required": [ + "source" + ], + "properties": { + "source": { + "$ref": "#/definitions/v1.skill.interactionModel.version.InputSource" + }, + "description": { + "type": "string", + "description": "Description string for specific catalog version." + } + }, + "description": "Catalog version specific data." + }, + "v1.skill.interactionModel.version.InputSource": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Type of catalog." + }, + "url": { + "type": "string", + "description": "Url to the catalog reference." + } + }, + "description": "Definition for catalog version input data." + }, + "v1.skill.interactionModel.version.CatalogVersionData": { + "type": "object", + "properties": { + "source": { + "$ref": "#/definitions/v1.skill.interactionModel.version.InputSource" + }, + "description": { + "type": "string", + "description": "Description string for specific catalog version." + }, + "version": { + "type": "string", + "description": "Specific catalog version." + } + }, + "description": "Catalog version data with metadata." + }, + "v1.skill.interactionModel.version.CatalogValues": { + "type": "object", + "properties": { + "isTruncated": { + "type": "boolean" + }, + "nextToken": { + "type": "string" + }, + "totalCount": { + "type": "integer", + "description": "Total number of catalog values." + }, + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "values": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.version.ValueSchema" + } + } + }, + "description": "List of catalog values." + }, + "v1.skill.interactionModel.version.ValueSchema": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "$ref": "#/definitions/v1.skill.interactionModel.version.ValueSchemaName" + } + }, + "description": "The value schema in type object of interaction model." + }, + "v1.skill.interactionModel.version.ValueSchemaName": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "synonyms": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "v1.skill.interactionModel.version.ListResponse": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "skillModelVersions": { + "type": "array", + "description": "List of interaction model versions.\n", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.version.VersionItems" + } + }, + "isTruncated": { + "type": "boolean" + }, + "nextToken": { + "type": "string" + } + }, + "description": "List of interactionModel versions of a skill for the vendor" + }, + "v1.skill.interactionModel.version.VersionItems": { + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "creationTime": { + "type": "string" + }, + "description": { + "type": "string" + }, + "_links": { + "$ref": "#/definitions/v1.skill.interactionModel.version.Links" + } + }, + "description": "Version metadata about the entity." + }, + "v1.skill.interactionModel.version.Links": { + "type": "object", + "properties": { + "self": { + "$ref": "#/definitions/v1.Link" + } + } + }, + "v1.skill.interactionModel.version.CatalogEntityVersion": { + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "creationTime": { + "type": "string", + "format": "date-time" + }, + "description": { + "type": "string" + }, + "_links": { + "$ref": "#/definitions/v1.skill.interactionModel.version.Links" + } + }, + "description": "Version metadata about the catalog entity version." + }, + "v1.skill.interactionModel.version.ListCatalogEntityVersionsResponse": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.skill.interactionModel.version.Links" + }, + "catalogVersions": { + "type": "array", + "description": "List of catalog entity versions.\n", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.version.CatalogEntityVersion" + } + }, + "isTruncated": { + "type": "boolean" + }, + "nextToken": { + "type": "string" + }, + "totalCount": { + "type": "integer" + } + }, + "description": "List of catalog versions of a catalog for the vendor in sortDirection order, descending as default." + }, + "v1.skill.interactionModel.type.UpdateRequest": { + "type": "object", + "properties": { + "slotType": { + "$ref": "#/definitions/v1.skill.interactionModel.type.SlotTypeUpdateDefinition" + } + }, + "description": "Slot type update request object." + }, + "v1.skill.interactionModel.type.SlotTypeUpdateDefinition": { + "type": "object", + "required": [ + "description" + ], + "properties": { + "description": { + "type": "string", + "description": "The slot type description with a 255 character maximum." + } + }, + "description": "Slot type update definition object." + }, + "v1.skill.interactionModel.type.DefinitionData": { + "type": "object", + "properties": { + "slotType": { + "$ref": "#/definitions/v1.skill.interactionModel.type.SlotTypeInput" + }, + "vendorId": { + "type": "string", + "description": "The vendorId that the slot type should belong to." + } + }, + "description": "Slot type request definitions." + }, + "v1.skill.interactionModel.type.SlotTypeInput": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the slot type." + }, + "description": { + "type": "string", + "description": "Description string about the slot type." + } + }, + "description": "Definition for slot type input." + }, + "v1.skill.interactionModel.type.SlotTypeItem": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the slot type." + }, + "description": { + "type": "string", + "description": "Description string about the slot type." + }, + "id": { + "type": "string", + "description": "Identifier of the slot type, optional in get response as the request already has slotTypeId." + }, + "_links": { + "$ref": "#/definitions/v1.Links" + } + }, + "description": "Definition for slot type entity." + }, + "v1.skill.interactionModel.type.ListSlotTypeResponse": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "slotTypes": { + "type": "array", + "description": "List of slot types.\n", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.type.SlotTypeItem" + } + }, + "nextToken": { + "type": "string" + } + }, + "description": "List of slot types of a skill for the vendor." + }, + "v1.skill.interactionModel.type.SlotTypeStatus": { + "type": "object", + "properties": { + "updateRequest": { + "$ref": "#/definitions/v1.skill.interactionModel.type.LastUpdateRequest" + } + }, + "description": "Defines the structure for slot type status response." + }, + "v1.skill.interactionModel.type.LastUpdateRequest": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.interactionModel.type.SlotTypeStatusType", + "x-isEnum": true + }, + "version": { + "type": "string", + "description": "The version id of the entity returned." + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.type.Error" + } + }, + "warnings": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.type.Warning" + } + } + }, + "description": "Contains attributes related to last modification request of a resource." + }, + "v1.skill.interactionModel.type.SlotTypeStatusType": { + "type": "string", + "description": "Status of last modification request for a resource.", + "enum": [ + "FAILED", + "IN_PROGRESS", + "SUCCEEDED" + ] + }, + "v1.skill.interactionModel.type.SlotTypeResponse": { + "type": "object", + "properties": { + "slotType": { + "$ref": "#/definitions/v1.skill.interactionModel.type.SlotTypeResponseEntity" + } + }, + "description": "Slot Type information." + }, + "v1.skill.interactionModel.type.SlotTypeResponseEntity": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "ID of the slot type created." + } + }, + "description": "SlotTypeId information." + }, + "v1.skill.interactionModel.type.SlotTypeDefinitionOutput": { + "type": "object", + "properties": { + "slotType": { + "$ref": "#/definitions/v1.skill.interactionModel.type.SlotTypeInput" + }, + "totalVersions": { + "type": "string", + "description": "Total number of versions." + } + }, + "description": "Slot Type request definitions." + }, + "v1.skill.interactionModel.type.Error": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "The error code." + }, + "message": { + "type": "string", + "description": "The error message." + } + }, + "description": "The error which would fail requests." + }, + "v1.skill.interactionModel.type.Warning": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "The warning code." + }, + "message": { + "type": "string", + "description": "The warning message." + } + }, + "description": "The warning which would not fail requests." + }, + "v1.skill.interactionModel.typeVersion.slotTypeUpdate": { + "type": "object", + "properties": { + "slotType": { + "$ref": "#/definitions/v1.skill.interactionModel.typeVersion.slotTypeUpdateObject" + } + }, + "description": "Slot Type update description wrapper." + }, + "v1.skill.interactionModel.typeVersion.slotTypeUpdateObject": { + "type": "object", + "properties": { + "description": { + "type": "string", + "description": "The slot type description with a 255 character maximum." + } + }, + "description": "Slot Type update description object." + }, + "v1.skill.interactionModel.typeVersion.VersionData": { + "type": "object", + "properties": { + "slotType": { + "$ref": "#/definitions/v1.skill.interactionModel.typeVersion.VersionDataObject" + } + }, + "description": "Slot Type version specific data." + }, + "v1.skill.interactionModel.typeVersion.VersionDataObject": { + "type": "object", + "properties": { + "definition": { + "$ref": "#/definitions/v1.skill.interactionModel.typeVersion.ValueSupplierObject" + }, + "description": { + "type": "string", + "description": "Description string for specific slot type version." + } + }, + "description": "Slot Type version fields with specific data." + }, + "v1.skill.interactionModel.typeVersion.SlotTypeVersionData": { + "type": "object", + "properties": { + "slotType": { + "$ref": "#/definitions/v1.skill.interactionModel.typeVersion.SlotTypeVersionDataObject" + } + }, + "description": "Slot Type version data with metadata." + }, + "v1.skill.interactionModel.typeVersion.SlotTypeVersionDataObject": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Slot type id associated with the slot type version." + }, + "definition": { + "$ref": "#/definitions/v1.skill.interactionModel.typeVersion.ValueSupplierObject" + }, + "description": { + "type": "string", + "description": "Description string for specific slot type version." + }, + "version": { + "type": "string", + "description": "Specific slot type version." + } + }, + "description": "Slot Type version fields with metadata." + }, + "v1.skill.interactionModel.typeVersion.ValueSupplierObject": { + "type": "object", + "properties": { + "valueSupplier": { + "$ref": "#/definitions/v1.skill.interactionModel.ValueSupplier" + } + }, + "description": "Value supplier object for slot definition." + }, + "v1.skill.interactionModel.typeVersion.SlotTypeVersionItem": { + "type": "object", + "properties": { + "version": { + "type": "string", + "description": "Version number of slot type." + }, + "description": { + "type": "string", + "description": "Description string about the slot type version." + }, + "_links": { + "$ref": "#/definitions/v1.Links" + } + }, + "description": "Definition for slot type entity." + }, + "v1.skill.interactionModel.typeVersion.ListSlotTypeVersionResponse": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "slotTypeVersions": { + "type": "array", + "description": "List of slot types.\n", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.typeVersion.SlotTypeVersionItem" + } + }, + "nextToken": { + "type": "string" + } + }, + "description": "List of slot type versions of a skill for the vendor." + }, + "v1.skill.interactionModel.jobs.JobDefinition": { + "type": "object", + "discriminator": "type", + "properties": { + "type": { + "type": "string", + "description": "Polymorphic type of the job", + "x-isDiscriminator": true + }, + "trigger": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.Trigger" + }, + "status": { + "type": "string", + "description": "Current status of the job definition." + } + }, + "description": "Definition for dynamic job." + }, + "v1.skill.interactionModel.jobs.CatalogAutoRefresh": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.JobDefinition" + }, + { + "type": "object", + "properties": { + "trigger": { + "description": "CatalogAutoRefresh can only have CatalogAutoRefresh trigger.", + "$ref": "#/definitions/v1.skill.interactionModel.jobs.Scheduled" + }, + "resource": { + "description": "The resource that the job is act on. Only catalog is allowed.", + "$ref": "#/definitions/v1.skill.interactionModel.jobs.Catalog" + } + } + } + ], + "description": "Definition for CatalogAutoRefresh job.", + "x-discriminator-value": "CatalogAutoRefresh" + }, + "v1.skill.interactionModel.jobs.ReferenceVersionUpdate": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.JobDefinition" + }, + { + "type": "object", + "properties": { + "trigger": { + "description": "Can only have ReferencedResourceJobsComplete trigger.", + "$ref": "#/definitions/v1.skill.interactionModel.jobs.ReferencedResourceJobsComplete" + }, + "resource": { + "description": "The resource that the job is act on. Only slot and interactionModel are allowed.", + "$ref": "#/definitions/v1.skill.interactionModel.jobs.ResourceObject" + }, + "references": { + "type": "array", + "description": "Referenced resources working with ReferencedResourceJobsComplete trigger.", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.ResourceObject" + } + }, + "publishToLive": { + "type": "boolean", + "description": "Whether publish development stage to live after the updates." + } + } + } + ], + "description": "Definition for ReferenceVersionUpdate job.", + "x-discriminator-value": "ReferenceVersionUpdate" + }, + "v1.skill.interactionModel.jobs.ResourceObject": { + "type": "object", + "discriminator": "type", + "properties": { + "type": { + "type": "string", + "description": "Polymorphic type of the ResourceObject.", + "x-isDiscriminator": true + } + }, + "description": "Resource object where the job is applied on." + }, + "v1.skill.interactionModel.jobs.Catalog": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.ResourceObject" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Catalog identifier." + } + } + } + ], + "description": "Catalog the job is applied on.", + "x-discriminator-value": "Catalog" + }, + "v1.skill.interactionModel.jobs.SlotTypeReference": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.ResourceObject" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "SlotTypeReference identifier." + } + } + } + ], + "description": "Slot type reference the job is applied on.", + "x-discriminator-value": "SlotTypeReference" + }, + "v1.skill.interactionModel.jobs.InteractionModel": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.ResourceObject" + }, + { + "type": "object", + "required": [ + "id", + "locales" + ], + "properties": { + "id": { + "type": "string", + "description": "Skill identifier." + }, + "locales": { + "type": "array", + "description": "Locale identifier and default is empty list which means all available locales.", + "items": { + "type": "string" + } + } + } + } + ], + "description": "Interaction model the job is applied on.", + "x-discriminator-value": "InteractionModel" + }, + "v1.skill.interactionModel.jobs.Trigger": { + "type": "object", + "discriminator": "type", + "properties": { + "type": { + "type": "string", + "description": "Polymorphic type of the trigger", + "x-isDiscriminator": true + } + }, + "description": "Condition when jobs will be executed." + }, + "v1.skill.interactionModel.jobs.Scheduled": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.Trigger" + }, + { + "type": "object", + "required": [ + "hour" + ], + "properties": { + "hour": { + "type": "integer", + "description": "The cron-like attribute in UTC time to describe the hour of the day and currently can only be 0,4,8,12,16,20." + }, + "dayOfWeek": { + "type": "integer", + "description": "If not null, this means the scheudule is weekly. the cron-like attribute in UTC time to describe the day of the week (0-6)." + } + } + } + ], + "description": "Time-based condition when jobs will be executed.", + "x-discriminator-value": "Scheduled" + }, + "v1.skill.interactionModel.jobs.ReferencedResourceJobsComplete": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.Trigger" + }, + { + "type": "object" + } + ], + "description": "Dependent job condition when jobs will be executed.", + "x-discriminator-value": "ReferencedResourceJobsComplete" + }, + "v1.skill.interactionModel.jobs.Execution": { + "type": "object", + "properties": { + "executionId": { + "type": "string", + "description": "Identifier of the execution." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "example": "2020-10-25T20:00:02.135Z", + "description": "ISO date-time timestamp when the execution starts." + }, + "errorCode": { + "type": "string", + "description": "ErrorCode to explain what went wrong in case of FAILUREs." + }, + "status": { + "type": "string", + "description": "Current status of the job execution." + }, + "errorDetails": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.JobErrorDetails" + } + }, + "description": "Execution data." + }, + "v1.skill.interactionModel.jobs.JobErrorDetails": { + "type": "object", + "properties": { + "executionMetadata": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.ExecutionMetadata" + } + } + }, + "description": "Optional details if the execution is depending on other executions." + }, + "v1.skill.interactionModel.jobs.JobDefinitionMetadata": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Job identifier." + }, + "type": { + "type": "string", + "description": "Polymorphic type of the job." + }, + "status": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.JobDefinitionStatus", + "x-isEnum": true + } + }, + "description": "Metadata of the job definition." + }, + "v1.skill.interactionModel.jobs.ExecutionMetadata": { + "type": "object", + "properties": { + "jobId": { + "type": "string", + "description": "Identifier of the job." + }, + "errorCode": { + "type": "string", + "description": "ErrorCode to explain what went wrong in case of FAILUREs." + }, + "status": { + "type": "string", + "description": "Current status of the job execution." + } + }, + "description": "ExecutionMetadata for executions." + }, + "v1.skill.interactionModel.jobs.ListJobDefinitionsResponse": { + "type": "object", + "properties": { + "paginationContext": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.JobAPIPaginationContext" + }, + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "jobs": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.JobDefinitionMetadata" + } + } + }, + "description": "The response of list job definitions." + }, + "v1.skill.interactionModel.jobs.CreateJobDefinitionRequest": { + "type": "object", + "properties": { + "vendorId": { + "type": "string", + "description": "ID of the vendor owning the skill." + }, + "jobDefinition": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.JobDefinition" + } + }, + "description": "Request to create job definitions." + }, + "v1.skill.interactionModel.jobs.CreateJobDefinitionResponse": { + "type": "object", + "properties": { + "jobId": { + "type": "string", + "description": "Idenitifier of the job definition." + } + }, + "description": "The response of create job definition." + }, + "v1.skill.interactionModel.jobs.GetExecutionsResponse": { + "type": "object", + "properties": { + "paginationContext": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.JobAPIPaginationContext" + }, + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "executions": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.Execution" + } + } + }, + "description": "The response of get execution history." + }, + "v1.skill.interactionModel.jobs.UpdateJobStatusRequest": { + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.JobDefinitionStatus", + "x-isEnum": true + } + }, + "description": "Update job status." + }, + "v1.skill.interactionModel.jobs.JobAPIPaginationContext": { + "type": "object", + "properties": { + "nextToken": { + "type": "string" + } + } + }, + "v1.skill.interactionModel.jobs.ValidationErrors": { + "type": "object", + "properties": { + "errors": { + "type": "array", + "description": "The list of errors.", + "items": { + "$ref": "#/definitions/v1.skill.interactionModel.jobs.DynamicUpdateError" + } + } + }, + "description": "The list of errors." + }, + "v1.skill.interactionModel.jobs.DynamicUpdateError": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "Dynamic update error code." + }, + "message": { + "type": "string", + "description": "Readable description of error." + } + }, + "description": "Error schema for dynamic update." + }, + "v1.skill.interactionModel.jobs.JobDefinitionStatus": { + "type": "string", + "description": "Current status of the job definition.", + "enum": [ + "DISABLED", + "ENALBED" + ] + }, + "v1.skill.invocations.InvokeSkillRequest": { + "type": "object", + "required": [ + "endpointRegion", + "skillRequest" + ], + "properties": { + "endpointRegion": { + "$ref": "#/definitions/v1.skill.invocations.EndPointRegions", + "x-isEnum": true + }, + "skillRequest": { + "$ref": "#/definitions/v1.skill.invocations.SkillRequest" + } + } + }, + "v1.skill.invocations.EndPointRegions": { + "type": "string", + "description": "Region of endpoint to be called.", + "enum": [ + "NA", + "EU", + "FE" + ] + }, + "v1.skill.invocations.SkillRequest": { + "type": "object", + "required": [ + "body" + ], + "properties": { + "body": { + "type": "object", + "description": "ASK request body schema as defined in the public facing documentation (https://developer.amazon.com/en-US/docs/alexa/custom-skills/request-and-response-json-reference.html#request-body-syntax)\n", + "properties": {} + } + } + }, + "v1.skill.invocations.InvokeSkillResponse": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.invocations.InvocationResponseStatus", + "x-isEnum": true + }, + "result": { + "$ref": "#/definitions/v1.skill.invocations.InvocationResponseResult" + } + } + }, + "v1.skill.invocations.InvocationResponseStatus": { + "type": "string", + "description": "String that specifies the status of skill invocation. Possible values are \"SUCCEEDED\", and \"FAILED\".\n", + "enum": [ + "SUCCEEDED", + "FAILED" + ] + }, + "v1.skill.invocations.InvocationResponseResult": { + "type": "object", + "properties": { + "skillExecutionInfo": { + "$ref": "#/definitions/v1.skill.invocations.SkillExecutionInfo" + }, + "error": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "v1.skill.invocations.SkillExecutionInfo": { + "type": "object", + "properties": { + "invocationRequest": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.invocations.Request" + } + }, + "invocationResponse": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.invocations.Response" + } + }, + "metrics": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.invocations.Metrics" + } + } + } + }, + "v1.skill.invocations.Request": { + "type": "object", + "properties": { + "endpoint": { + "type": "string", + "description": "Skill's Lambda or HTTPS endpoint." + }, + "body": { + "type": "object", + "description": "JSON payload that was sent to the skill's Lambda or HTTPS endpoint.\n", + "properties": {} + } + } + }, + "v1.skill.invocations.Response": { + "type": "object", + "properties": { + "body": { + "type": "object", + "description": "Payload that was returned by the skill's Lambda or HTTPS endpoint.\n", + "properties": {} + } + } + }, + "v1.skill.invocations.Metrics": { + "type": "object", + "properties": { + "skillExecutionTimeInMilliseconds": { + "type": "integer", + "description": "How long, in milliseconds, it took the skill's Lambda or HTTPS endpoint to process the request.\n" + } + } + }, + "v1.skill.Manifest.SkillManifestEnvelope": { + "type": "object", + "properties": { + "manifest": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifest" + } + } + }, + "v1.skill.Manifest.SkillManifest": { + "type": "object", + "properties": { + "manifestVersion": { + "$ref": "#/definitions/v1.skill.Manifest.ManifestVersion", + "x-isEnum": true + }, + "publishingInformation": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifestPublishingInformation" + }, + "privacyAndCompliance": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifestPrivacyAndCompliance" + }, + "events": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifestEvents" + }, + "permissions": { + "type": "array", + "description": "Defines the structure for required permissions information in the skill manifest.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.PermissionItems" + } + }, + "authorizedClients": { + "type": "array", + "description": "Defines a list of clients authorized for a skill.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.AuthorizedClient" + } + }, + "apis": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifestApis" + } + }, + "description": "Defines the structure for a skill's metadata." + }, + "v1.skill.Manifest.ManifestVersion": { + "type": "string", + "description": "Version of the skill manifest.", + "enum": [ + "1.0" + ] + }, + "v1.skill.Manifest.AuthorizedClient": { + "type": "object", + "required": [ + "authenticationProvider" + ], + "properties": { + "authenticationProvider": { + "type": "string" + } + }, + "description": "Defines a client authorized for a skill." + }, + "v1.skill.Manifest.AuthorizedClientLwa": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.AuthorizedClient" + }, + { + "type": "object", + "properties": { + "applications": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.AuthorizedClientLwaApplication" + }, + "minItems": 1 + } + } + } + ], + "description": "Defines client using Login With Amazon authentication provider, corresponds to LWA Security Profile.", + "x-discriminator-value": "LWA" + }, + "v1.skill.Manifest.AuthorizedClientLwaApplication": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string" + } + }, + "description": "Defines an application for LWA security profile." + }, + "v1.skill.Manifest.AuthorizedClientLwaApplicationAndroid": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.AuthorizedClientLwaApplication" + }, + { + "type": "object", + "properties": { + "appStoreAppId": { + "type": "string" + }, + "clientId": { + "type": "string" + } + } + } + ], + "description": "Defines an android application for LWA authentication provider.", + "x-discriminator-value": "LWA_ANDROID" + }, + "v1.skill.Manifest.SkillManifestPublishingInformation": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the skill that is displayed to customers in the Alexa app." + }, + "description": { + "type": "string", + "description": "Description of the skill's purpose and feature and how it works. Should describe any prerequisites like hardware or account requirements and detailed steps for the customer to get started. For Flash Briefing skill list the feeds offered within the skill. Use a conversational tone and correct grammar and punctuation. This description displays to customers on the skill detail card in the Alexa app." + }, + "locales": { + "type": "object", + "description": "Defines the structure for locale specific publishing information in the skill manifest.", + "minProperties": 1, + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifestLocalizedPublishingInformation" + } + }, + "isAvailableWorldwide": { + "type": "boolean", + "description": "True if the skill should be distributed in all countries where Amazon distributes skill false otherwise." + }, + "distributionMode": { + "$ref": "#/definitions/v1.skill.Manifest.DistributionMode", + "x-isEnum": true + }, + "gadgetSupport": { + "$ref": "#/definitions/v1.skill.Manifest.ManifestGadgetSupport" + }, + "testingInstructions": { + "type": "string", + "description": "Special instructions provided by the developer to test the skill.", + "maxLength": 4000 + }, + "category": { + "type": "string", + "description": "Category that best describes a skill. Indicates the filter category for the skill in the Alexa App." + }, + "distributionCountries": { + "type": "array", + "description": "Selected list of countries provided by the skill owner where Amazon can distribute the skill.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.DistributionCountries" + } + }, + "automaticDistribution": { + "$ref": "#/definitions/v1.skill.Manifest.AutomaticDistribution" + }, + "automaticClonedLocale": { + "$ref": "#/definitions/v1.skill.Manifest.AutomaticClonedLocale" + }, + "paidSkillInformation": { + "$ref": "#/definitions/v1.skill.Manifest.PaidSkillInformation" + } + }, + "description": "Defines the structure for publishing information in the skill manifest." + }, + "v1.skill.Manifest.AutomaticClonedLocale": { + "type": "object", + "required": [ + "locales" + ], + "properties": { + "locales": { + "type": "array", + "description": "List of language specific source locale to target locales mapping.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.LocalesByAutomaticClonedLocale" + } + } + }, + "description": "Defines the structure for Sync Locales in the skill manifest. This is an optional property and Sync Locales will be disabled if not set." + }, + "v1.skill.Manifest.LocalesByAutomaticClonedLocale": { + "type": "object", + "required": [ + "source" + ], + "properties": { + "source": { + "type": "string", + "description": "Locale where the metadata and model will be copied from. For example: en-US. This locale must already exist in the skill." + }, + "targets": { + "type": "array", + "description": "Optional. List of locales where the metadata and model will be copied to. All configuration of source locale will be copied, so target locales do not have to exist before. Defaults to all locales with the same language as the sourceLocale.", + "items": { + "type": "string" + } + } + }, + "description": "maps source locale to list of target locales. Source and target locales should be with the same language." + }, + "v1.skill.Manifest.AutomaticDistribution": { + "type": "object", + "required": [ + "isActive" + ], + "properties": { + "isActive": { + "type": "boolean", + "description": "set to true to opt in to Automatic Skill Distribution. If false, then the skill will not be considered for Automatic Skill Distribution. Note that once a skill has gone through the automatic distribution process and this value is later set to false, any locales that were published through this feature will not be reverted. Any published locales will need to be suppressed manually via contacting DAG." + }, + "sourceLocaleForLanguages": { + "type": "array", + "description": "list of items pairing a language with a source locale. Required if isActive is set to true. For each language there must be exactly one source locale.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.SourceLanguageForLocales" + } + } + }, + "description": "optional. Used by developer to opt in to Automatic Skill Distribution, a feature where a skill will automatically be published in new eligible locales from the same language (e.g. from \"en-US\" to \"en-CA\" and \"en-GB\"). Locales that the developer has already created will not be overwritten." + }, + "v1.skill.Manifest.SourceLanguageForLocales": { + "type": "object", + "required": [ + "language", + "sourceLocale" + ], + "properties": { + "language": { + "type": "string", + "description": "two-letter string representing the language to distribute to. There must be at least one locale in publishingInformation.locales which has this language as the prefix." + }, + "sourceLocale": { + "type": "string", + "description": "locale where the metadata and model will be copied from. This locale must already exist in the skill." + } + }, + "description": "maps a language to a locale. During Automatic Skill Distribution, skill metadata and model of the source locale will be copied to other eligible locales of the same language. Eligible destination locales will be determined by the system." + }, + "v1.skill.Manifest.ManifestGadgetSupport": { + "type": "object", + "required": [ + "requirement" + ], + "properties": { + "requirement": { + "$ref": "#/definitions/v1.skill.Manifest.GadgetSupportRequirement", + "x-isEnum": true + }, + "minGadgetButtons": { + "type": "integer", + "description": "Minimum number of gadget buttons required.", + "minimum": 1, + "maximum": 4 + }, + "maxGadgetButtons": { + "type": "integer", + "description": "Maximum number of gadget buttons required.", + "minimum": 1, + "maximum": 4 + }, + "numPlayersMax": { + "type": "integer", + "description": "Maximum number of players in the game.", + "minimum": 1 + }, + "numPlayersMin": { + "type": "integer", + "description": "Minimum number of players in the game.", + "minimum": 1, + "maximum": 16 + } + }, + "description": "Defines the structure for gadget buttons support in the skill manifest." + }, + "v1.skill.Manifest.DistributionMode": { + "type": "string", + "description": "What audience the skill should be distributed to. \"PUBLIC\" - available to all users. Has ASIN and can be enabled. \"PRIVATE\" - available to entitled users. Has ASIN and can be enabled. \"INTERNAL\" - has no ASIN and cannot be enabled by users. Internally managed skills.\n", + "enum": [ + "PRIVATE", + "PUBLIC" + ] + }, + "v1.skill.Manifest.GadgetSupportRequirement": { + "type": "string", + "description": "Specifies if gadget support is required/optional for this skill to work.", + "enum": [ + "REQUIRED", + "OPTIONAL" + ] + }, + "v1.skill.Manifest.SkillManifestLocalizedPublishingInformation": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the skill that is displayed to customers in the Alexa app.", + "minLength": 2 + }, + "smallIconUri": { + "type": "string", + "description": "URL to a small icon for the skill, which is shown in the list of skills (108x108px)." + }, + "largeIconUri": { + "type": "string", + "description": "URL to a large icon that represents this skill (512x512px)." + }, + "summary": { + "type": "string", + "description": "Summary description of the skill, which is shown when viewing the list of skills.", + "maxLength": 160 + }, + "description": { + "type": "string", + "description": "A full description explaining the skill’s core functionality and any prerequisites to using it (such as additional hardware, software, or accounts). For a Flash Briefing skill, you must list the feeds for the skill.", + "maxLength": 4000 + }, + "updatesDescription": { + "type": "string", + "description": "Updates description of the skill's new features and fixes in the version. Should describe changes in the revisions of the skill.", + "maxLength": 4000 + }, + "examplePhrases": { + "type": "array", + "description": "Three example phrases that illustrate how users can invoke your skill. For accuracy, these phrases must come directly from your sample utterances.", + "items": { + "type": "string", + "maxLength": 200 + }, + "maxItems": 4 + }, + "keywords": { + "type": "array", + "description": "Sample keyword phrases that describe the skill.", + "items": { + "type": "string", + "maxLength": 150 + }, + "maxItems": 30 + }, + "customProductPrompts": { + "$ref": "#/definitions/v1.skill.Manifest.CustomProductPrompts" + } + }, + "description": "Defines the structure for locale specific publishing information in the skill manifest." + }, + "v1.skill.Manifest.DistributionCountries": { + "type": "string", + "enum": [ + "AF", + "AX", + "AL", + "DZ", + "AS", + "AD", + "AO", + "AI", + "AQ", + "AG", + "AR", + "AM", + "AW", + "AU", + "AT", + "AZ", + "BS", + "BH", + "BD", + "BB", + "BY", + "BE", + "BZ", + "BJ", + "BM", + "BT", + "BO", + "BA", + "BW", + "BV", + "BR", + "IO", + "BN", + "BG", + "BF", + "BI", + "KH", + "CM", + "CA", + "CV", + "KY", + "CF", + "TD", + "CL", + "CN", + "CX", + "CC", + "CO", + "KM", + "CG", + "CD", + "CK", + "CR", + "HR", + "CY", + "CZ", + "DK", + "DJ", + "DM", + "DO", + "EC", + "EG", + "SV", + "GQ", + "ER", + "EE", + "ET", + "FK", + "FO", + "FJ", + "FI", + "FR", + "GF", + "PF", + "TF", + "GA", + "GM", + "GE", + "DE", + "GH", + "GI", + "GR", + "GL", + "GD", + "GP", + "GU", + "GT", + "GG", + "GN", + "GW", + "GY", + "HT", + "HM", + "VA", + "HN", + "HK", + "HU", + "IS", + "IN", + "ID", + "IQ", + "IE", + "IM", + "IL", + "IT", + "CI", + "JM", + "JP", + "JE", + "JO", + "KZ", + "KE", + "KI", + "KR", + "KW", + "KG", + "LA", + "LV", + "LB", + "LS", + "LR", + "LY", + "LI", + "LT", + "LU", + "MO", + "MK", + "MG", + "MW", + "MY", + "MV", + "ML", + "MT", + "MH", + "MQ", + "MR", + "MU", + "YT", + "MX", + "FM", + "MD", + "MC", + "MN", + "ME", + "MS", + "MA", + "MZ", + "MM", + "NA", + "NR", + "NP", + "NL", + "AN", + "NC", + "NZ", + "NI", + "NE", + "NG", + "NU", + "NF", + "MP", + "NO", + "OM", + "PK", + "PW", + "PS", + "PA", + "PG", + "PY", + "PE", + "PH", + "PN", + "PL", + "PT", + "PR", + "QA", + "RE", + "RO", + "RU", + "RW", + "BL", + "SH", + "KN", + "LC", + "MF", + "PM", + "VC", + "WS", + "SM", + "ST", + "SA", + "SN", + "RS", + "SC", + "SL", + "SG", + "SK", + "SI", + "SB", + "SO", + "ZA", + "GS", + "ES", + "LK", + "SR", + "SJ", + "SZ", + "SE", + "CH", + "TW", + "TJ", + "TZ", + "TH", + "TL", + "TG", + "TK", + "TO", + "TT", + "TN", + "TR", + "TM", + "TC", + "TV", + "UG", + "UA", + "AE", + "GB", + "US", + "UM", + "UY", + "UZ", + "VU", + "VE", + "VN", + "VG", + "VI", + "WF", + "EH", + "YE", + "ZM", + "ZW" + ] + }, + "v1.skill.Manifest.SkillManifestPrivacyAndCompliance": { + "type": "object", + "properties": { + "locales": { + "type": "object", + "description": "Object that contains objects for each supported locale.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifestLocalizedPrivacyAndCompliance" + } + }, + "allowsPurchases": { + "type": "boolean", + "description": "True if the skill allows users to make purchases or spend real money false otherwise." + }, + "usesPersonalInfo": { + "type": "boolean", + "description": "True if the skill collects users' personal information false otherwise." + }, + "isChildDirected": { + "type": "boolean", + "description": "True if the skill is directed to or targets children under the age of 13/16 false otherwise." + }, + "isExportCompliant": { + "type": "boolean", + "description": "True if it is certified that the skill may be imported to and exported from the United States and all other countries and regions in which Amazon operate its program or in which skill owner have authorized sales to end users (without the need for Amazon to obtain any license or clearance or take any other action) and is in full compliance with all applicable laws and regulations governing imports and export including those applicable to software that makes use of encryption technology." + }, + "containsAds": { + "type": "boolean", + "description": "True if the skill contains advertising false otherwise." + }, + "usesHealthInfo": { + "type": "boolean", + "description": "True if the skill developer is a Covered Entity (CE) or Business Associate (BA) as defined by the Health Insurance Portability And Accountability Act (HIPAA) and the skill requires Amazon to process PHI on their behalf, false otherwise. This is an optional property and treated as false if not set." + }, + "shoppingKit": { + "$ref": "#/definitions/v1.skill.Manifest.ShoppingKit" + } + }, + "description": "Defines the structure for privacy & compliance information in the skill manifest." + }, + "v1.skill.Manifest.ShoppingKit": { + "type": "object", + "properties": { + "isShoppingActionsEnabled": { + "type": "boolean", + "description": "True if the skill uses Alexa Shopping Actions, false otherwise." + }, + "isAmazonAssociatesOnAlexaEnabled": { + "type": "boolean", + "description": "True if the skill uses Shopping Actions with Amazon Associates, false otherwise." + } + }, + "description": "Defines the structure for Shopping Kit related information in the skill manifest." + }, + "v1.skill.Manifest.SkillManifestLocalizedPrivacyAndCompliance": { + "type": "object", + "properties": { + "privacyPolicyUrl": { + "type": "string", + "description": "Link to the privacy policy that applies to this skill." + }, + "termsOfUseUrl": { + "type": "string", + "description": "link to the terms of use document for this skill" + } + }, + "description": "Defines the structure for locale specific privacy & compliance information in the skill manifest." + }, + "v1.skill.Manifest.SkillManifestEndpoint": { + "type": "object", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "format": "uri", + "description": "Amazon Resource Name (ARN) of the skill's Lambda function or HTTPS URL." + }, + "sslCertificateType": { + "$ref": "#/definitions/v1.skill.Manifest.SSLCertificateType", + "x-isEnum": true + } + }, + "description": "Defines the structure for endpoint information in the skill manifest." + }, + "v1.skill.Manifest.SSLCertificateType": { + "type": "string", + "description": "The SSL certificate type of the skill's HTTPS endpoint. Only valid for HTTPS endpoint not for AWS Lambda ARN.", + "enum": [ + "SelfSigned", + "Wildcard", + "Trusted" + ] + }, + "v1.skill.Manifest.SkillManifestEvents": { + "type": "object", + "required": [ + "endpoint" + ], + "properties": { + "subscriptions": { + "type": "array", + "description": "Contains an array of eventName object each of which contains the name of a skill event.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.EventName" + } + }, + "publications": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.EventPublications" + } + }, + "regions": { + "type": "object", + "description": "Contains an array of the supported Objects.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.Region" + } + }, + "endpoint": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifestEndpoint" + } + }, + "description": "Defines the structure for subscribed events information in the skill manifest." + }, + "v1.skill.Manifest.EventName": { + "type": "object", + "properties": { + "eventName": { + "$ref": "#/definitions/v1.skill.Manifest.EventNameType", + "x-isEnum": true + } + } + }, + "v1.skill.Manifest.EventNameType": { + "type": "string", + "description": "Name of the event to be subscribed to.", + "enum": [ + "Legacy.AudioPlayerGui.LyricsViewedEvent", + "Legacy.ListModel.DeleteItemRequest", + "Legacy.MediaPlayer.SequenceModified", + "Legacy.PlaybackController.ButtonCommand", + "EffectsController.RequestEffectChangeRequest", + "Legacy.ExternalMediaPlayer.RequestToken", + "ITEMS_UPDATED", + "Alexa.Video.Xray.ShowDetailsSuccessful", + "PlaybackController.NextCommandIssued", + "Legacy.MediaPlayer.PlaybackFinished", + "Alexa.Camera.VideoCaptureController.CaptureFailed", + "SKILL_DISABLED", + "Alexa.Camera.VideoCaptureController.CancelCaptureFailed", + "CustomInterfaceController.EventsReceived", + "Legacy.DeviceNotification.NotificationStarted", + "REMINDER_UPDATED", + "AUDIO_ITEM_PLAYBACK_STOPPED", + "Legacy.AuxController.InputActivityStateChanged", + "LocalApplication.MShopPurchasing.Event", + "Legacy.ExternalMediaPlayer.AuthorizationComplete", + "LocalApplication.HHOPhotos.Event", + "Alexa.Presentation.APL.UserEvent", + "Legacy.AudioPlayer.PlaybackInterrupted", + "Legacy.BluetoothNetwork.DeviceUnpairFailure", + "IN_SKILL_PRODUCT_SUBSCRIPTION_ENDED", + "Alexa.FileManager.UploadController.UploadFailed", + "Legacy.BluetoothNetwork.DeviceConnectedFailure", + "Legacy.AudioPlayer.AudioStutter", + "Alexa.Camera.VideoCaptureController.CaptureStarted", + "Legacy.Speaker.MuteChanged", + "CardRenderer.DisplayContentFinished", + "Legacy.SpeechSynthesizer.SpeechStarted", + "AudioPlayer.PlaybackStopped", + "Legacy.SoftwareUpdate.CheckSoftwareUpdateReport", + "CardRenderer.DisplayContentStarted", + "LocalApplication.NotificationsApp.Event", + "AudioPlayer.PlaybackStarted", + "Legacy.DeviceNotification.NotificationEnteredForground", + "Legacy.DeviceNotification.SetNotificationFailed", + "Legacy.AudioPlayer.PeriodicPlaybackProgressReport", + "Legacy.HomeAutoWifiController.HttpNotified", + "Alexa.Camera.PhotoCaptureController.CancelCaptureFailed", + "SKILL_ACCOUNT_LINKED", + "LIST_UPDATED", + "Legacy.DeviceNotification.NotificationSync", + "Legacy.SconeRemoteControl.VolumeDown", + "Legacy.MediaPlayer.PlaybackPaused", + "Legacy.Presentation.PresentationUserEvent", + "PlaybackController.PlayCommandIssued", + "Legacy.ListModel.UpdateItemRequest", + "Messaging.MessageReceived", + "Legacy.SoftwareUpdate.InitiateSoftwareUpdateReport", + "AUDIO_ITEM_PLAYBACK_FAILED", + "LocalApplication.DeviceMessaging.Event", + "Alexa.Camera.PhotoCaptureController.CaptureFailed", + "Legacy.AudioPlayer.PlaybackIdle", + "Legacy.BluetoothNetwork.EnterPairingModeSuccess", + "Legacy.AudioPlayer.PlaybackError", + "Legacy.ListModel.GetPageByOrdinalRequest", + "Legacy.MediaGrouping.GroupChangeResponseEvent", + "Legacy.BluetoothNetwork.DeviceDisconnectedFailure", + "Legacy.BluetoothNetwork.EnterPairingModeFailure", + "Legacy.SpeechSynthesizer.SpeechInterrupted", + "PlaybackController.PreviousCommandIssued", + "Legacy.AudioPlayer.PlaybackFinished", + "Legacy.System.UserInactivity", + "Display.UserEvent", + "Legacy.PhoneCallController.Event", + "Legacy.DeviceNotification.SetNotificationSucceeded", + "LocalApplication.Photos.Event", + "LocalApplication.VideoExperienceService.Event", + "Legacy.ContentManager.ContentPlaybackTerminated", + "Legacy.PlaybackController.PlayCommand", + "Legacy.PlaylistController.ErrorResponse", + "Legacy.SconeRemoteControl.VolumeUp", + "MessagingController.UpdateConversationsStatus", + "Legacy.BluetoothNetwork.DeviceDisconnectedSuccess", + "LocalApplication.Communications.Event", + "AUDIO_ITEM_PLAYBACK_STARTED", + "Legacy.BluetoothNetwork.DevicePairFailure", + "LIST_DELETED", + "Legacy.PlaybackController.ToggleCommand", + "Legacy.BluetoothNetwork.DevicePairSuccess", + "Legacy.MediaPlayer.PlaybackError", + "AudioPlayer.PlaybackFinished", + "Legacy.DeviceNotification.NotificationStopped", + "Legacy.SipClient.Event", + "Display.ElementSelected", + "LocalApplication.MShop.Event", + "Legacy.ListModel.AddItemRequest", + "Legacy.BluetoothNetwork.ScanDevicesReport", + "Legacy.MediaPlayer.PlaybackStopped", + "Legacy.AudioPlayerGui.ButtonClickedEvent", + "LocalApplication.AlexaVoiceLayer.Event", + "Legacy.PlaybackController.PreviousCommand", + "Legacy.AudioPlayer.InitialPlaybackProgressReport", + "Legacy.BluetoothNetwork.DeviceConnectedSuccess", + "LIST_CREATED", + "Legacy.ActivityManager.ActivityContextRemovedEvent", + "ALL_LISTS_CHANGED", + "Legacy.AudioPlayer.PlaybackNearlyFinished", + "Legacy.MediaGrouping.GroupChangeNotificationEvent", + "LocalApplication.Sentry.Event", + "SKILL_PROACTIVE_SUBSCRIPTION_CHANGED", + "SKILL_NOTIFICATION_SUBSCRIPTION_CHANGED", + "REMINDER_CREATED", + "Alexa.Presentation.HTML.Event", + "FitnessSessionController.FitnessSessionError", + "Legacy.SconeRemoteControl.Next", + "Alexa.Camera.VideoCaptureController.CaptureFinished", + "Legacy.MediaPlayer.SequenceItemsRequested", + "Legacy.PlaybackController.PauseCommand", + "LocalApplication.AlexaVision.Event", + "LocalApplication.Closet.Event", + "Alexa.FileManager.UploadController.CancelUploadFailed", + "Legacy.MediaPlayer.PlaybackResumed", + "SKILL_PERMISSION_ACCEPTED", + "FitnessSessionController.FitnessSessionPaused", + "Legacy.AudioPlayer.PlaybackPaused", + "Alexa.Presentation.HTML.LifecycleStateChanged", + "LocalApplication.SipUserAgent.Event", + "Legacy.MediaPlayer.PlaybackStarted", + "REMINDER_STATUS_CHANGED", + "MessagingController.UploadConversations", + "ITEMS_DELETED", + "Legacy.AuxController.PluggedStateChanged", + "Legacy.AudioPlayer.PlaybackStarted", + "Alexa.FileManager.UploadController.UploadStarted", + "ITEMS_CREATED", + "Legacy.ExternalMediaPlayer.Event", + "LocalApplication.LocalMediaPlayer.Event", + "LocalApplication.KnightContacts.Event", + "LocalApplication.Calendar.Event", + "Legacy.AlertsController.DismissCommand", + "Legacy.AudioPlayer.PlaybackStutterFinished", + "Legacy.SpeechSynthesizer.SpeechFinished", + "Legacy.ExternalMediaPlayer.ReportDiscoveredPlayers", + "LocalApplication.SipClient.Event", + "Legacy.BluetoothNetwork.DeviceUnpairSuccess", + "Legacy.Speaker.VolumeChanged", + "CardRenderer.ReadContentFinished", + "LocalApplication.HomeAutomationMedia.Event", + "Legacy.BluetoothNetwork.CancelPairingMode", + "LocalApplication.DigitalDash.Event", + "CardRenderer.ReadContentStarted", + "Legacy.GameEngine.GameInputEvent", + "LocalApplication.LocalVoiceUI.Event", + "Legacy.Microphone.AudioRecording", + "LocalApplication.AlexaPlatformTestSpeechlet.Event", + "Legacy.HomeAutoWifiController.SsdpServiceDiscovered", + "Alexa.Camera.PhotoCaptureController.CancelCaptureFinished", + "Legacy.HomeAutoWifiController.DeviceReconnected", + "SKILL_ENABLED", + "Alexa.Camera.VideoCaptureController.CancelCaptureFinished", + "MessagingController.UpdateMessagesStatusRequest", + "REMINDER_STARTED", + "CustomInterfaceController.Expired", + "LocalApplication.AvaPhysicalShopping.Event", + "LocalApplication.WebVideoPlayer.Event", + "Legacy.HomeAutoWifiController.SsdpServiceTerminated", + "LocalApplication.FireflyShopping.Event", + "Legacy.PlaybackController.NextCommand", + "LocalApplication.Gallery.Event", + "Alexa.Presentation.PresentationDismissed", + "EffectsController.StateReceiptChangeRequest", + "LocalApplication.Alexa.Translation.LiveTranslation.Event", + "LocalApplication.AlexaNotifications.Event", + "REMINDER_DELETED", + "GameEngine.InputHandlerEvent", + "Legacy.PlaylistController.Response", + "LocalApplication.KnightHome.Event", + "Legacy.ListRenderer.ListItemEvent", + "AudioPlayer.PlaybackFailed", + "LocalApplication.KnightHomeThingsToTry.Event", + "Legacy.BluetoothNetwork.SetDeviceCategoriesFailed", + "Legacy.ExternalMediaPlayer.Logout", + "Alexa.FileManager.UploadController.UploadFinished", + "Legacy.ActivityManager.FocusChanged", + "Legacy.AlertsController.SnoozeCommand", + "Legacy.SpeechRecognizer.WakeWordChanged", + "Legacy.ListRenderer.GetListPageByToken", + "MessagingController.UpdateSendMessageStatusRequest", + "FitnessSessionController.FitnessSessionEnded", + "Alexa.Presentation.APL.RuntimeError", + "Legacy.ListRenderer.GetListPageByOrdinal", + "FitnessSessionController.FitnessSessionResumed", + "IN_SKILL_PRODUCT_SUBSCRIPTION_STARTED", + "Legacy.DeviceNotification.DeleteNotificationSucceeded", + "Legacy.SpeechSynthesizer.SpeechSynthesizerError", + "Alexa.Video.Xray.ShowDetailsFailed", + "Alexa.FileManager.UploadController.CancelUploadFinished", + "Legacy.SconeRemoteControl.PlayPause", + "Legacy.DeviceNotification.NotificationEnteredBackground", + "SKILL_PERMISSION_CHANGED", + "Legacy.AudioPlayer.Metadata", + "Legacy.AudioPlayer.PlaybackStutterStarted", + "AUDIO_ITEM_PLAYBACK_FINISHED", + "EffectsController.RequestGuiChangeRequest", + "FitnessSessionController.FitnessSessionStarted", + "Legacy.PlaybackController.LyricsViewedEvent", + "Legacy.ExternalMediaPlayer.Login", + "PlaybackController.PauseCommandIssued", + "Legacy.MediaPlayer.PlaybackIdle", + "Legacy.SconeRemoteControl.Previous", + "DeviceSetup.SetupCompleted", + "Legacy.MediaPlayer.PlaybackNearlyFinished", + "LocalApplication.todoRenderer.Event", + "Legacy.BluetoothNetwork.SetDeviceCategoriesSucceeded", + "Legacy.BluetoothNetwork.MediaControlSuccess", + "Legacy.HomeAutoWifiController.SsdpDiscoveryFinished", + "Alexa.Presentation.APL.LoadIndexListData", + "IN_SKILL_PRODUCT_SUBSCRIPTION_RENEWED", + "Legacy.BluetoothNetwork.MediaControlFailure", + "Legacy.AuxController.EnabledStateChanged", + "Legacy.FavoritesController.Response", + "Legacy.ListModel.ListStateUpdateRequest", + "Legacy.EqualizerController.EqualizerChanged", + "Legacy.MediaGrouping.GroupSyncEvent", + "Legacy.FavoritesController.Error", + "Legacy.ListModel.GetPageByTokenRequest", + "Legacy.ActivityManager.ActivityInterrupted", + "Legacy.MeetingClientController.Event", + "Legacy.Presentation.PresentationDismissedEvent", + "Legacy.Spotify.Event", + "Legacy.ExternalMediaPlayer.Error", + "Legacy.AuxController.DirectionChanged", + "AudioPlayer.PlaybackNearlyFinished", + "Alexa.Camera.PhotoCaptureController.CaptureFinished", + "Legacy.UDPController.BroadcastResponse", + "Legacy.AudioPlayer.PlaybackResumed", + "Legacy.DeviceNotification.DeleteNotificationFailed" + ] + }, + "v1.skill.Manifest.EventPublications": { + "type": "object", + "properties": { + "eventName": { + "type": "string", + "description": "Name of the event to publish." + } + } + }, + "v1.skill.Manifest.Region": { + "type": "object", + "required": [ + "endpoint" + ], + "properties": { + "endpoint": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifestEndpoint" + } + }, + "description": "Defines the structure for regional information." + }, + "v1.skill.Manifest.PermissionItems": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "$ref": "#/definitions/v1.skill.Manifest.PermissionName", + "x-isEnum": true + } + } + }, + "v1.skill.Manifest.PermissionName": { + "type": "string", + "description": "Name of the required permission.", + "enum": [ + "alexa::device_id:read", + "alexa::personality:explicit:read", + "alexa::authenticate:2:mandatory", + "alexa:devices:all:address:country_and_postal_code:read", + "alexa::profile:mobile_number:read", + "alexa::async_event:write", + "alexa::device_type:read", + "alexa::skill:proactive_enablement", + "alexa::personality:explicit:write", + "alexa::household:lists:read", + "alexa::utterance_id:read", + "alexa::user_experience_guidance:read", + "alexa::devices:all:notifications:write", + "avs::distributed_audio", + "alexa::devices:all:address:full:read", + "alexa::devices:all:notifications:urgent:write", + "payments:autopay_consent", + "alexa::alerts:timers:skill:readwrite", + "alexa::customer_id:read", + "alexa::skill:cds:monetization", + "alexa::music:cast", + "alexa::profile:given_name:read", + "alexa::alerts:reminders:skill:readwrite", + "alexa::household:lists:write", + "alexa::profile:email:read", + "alexa::profile:name:read", + "alexa::devices:all:geolocation:read", + "alexa::raw_person_id:read", + "alexa::authenticate:2:optional", + "alexa::health:profile:write", + "alexa::person_id:read", + "alexa::skill:products:entitlements", + "alexa::energy:devices:state:read", + "alexa::origin_ip_address:read", + "alexa::devices:all:coarse_location:read", + "alexa::devices:all:tokenized_geolocation:read", + "alexa::measurement_system::readwrite", + "dash::vendor:read:endpoints" + ] + }, + "v1.skill.Manifest.SkillManifestApis": { + "type": "object", + "properties": { + "flashBriefing": { + "$ref": "#/definitions/v1.skill.Manifest.FlashBriefingApis" + }, + "custom": { + "$ref": "#/definitions/v1.skill.Manifest.CustomApis" + }, + "knowledge": { + "$ref": "#/definitions/v1.skill.Manifest.KnowledgeApis" + }, + "smartHome": { + "$ref": "#/definitions/v1.skill.Manifest.SmartHomeApis" + }, + "video": { + "$ref": "#/definitions/v1.skill.Manifest.VideoApis" + }, + "alexaForBusiness": { + "$ref": "#/definitions/v1.skill.Manifest.AlexaForBusinessApis" + }, + "householdList": { + "$ref": "#/definitions/v1.skill.Manifest.HouseHoldList" + }, + "music": { + "$ref": "#/definitions/v1.skill.Manifest.MusicApis" + }, + "demandResponse": { + "$ref": "#/definitions/v1.skill.Manifest.DemandResponseApis" + } + }, + "description": "Defines the structure for implemented apis information in the skill manifest." + }, + "v1.skill.Manifest.KnowledgeApis": { + "type": "object", + "properties": { + "enablementChannel": { + "$ref": "#/definitions/v1.skill.Manifest.KnowledgeApisEnablementChannel", + "x-isEnum": true + }, + "locales": { + "type": "object", + "description": "Defines the structure of locale specific knowledge information in the skill manifest.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.LocalizedKnowledgeInformation" + } + } + }, + "description": "defines the structure for the knowledge api of the skill." + }, + "v1.skill.Manifest.KnowledgeApisEnablementChannel": { + "type": "string", + "description": "Defines how the skill can be enabled by developers. values can be set to 'PUBLIC' (in Alexa Skill Store), 'ASP' (A4R/A4H vendor devices), or 'A4B' Public and ASP selections must have \"distributionMode\" = 'PUBLIC' and will only be eligible for distribution on personal or vendor (A4H/A4R or A4B) devices.", + "enum": [ + "PUBLIC", + "ASP", + "A4B" + ] + }, + "v1.skill.Manifest.LocalizedKnowledgeInformation": { + "type": "object", + "properties": { + "answerAttribution": { + "type": "string", + "description": "enables skill developers to prepend a custom message to all of their knowledge skill's answers, which can help inform end-users of the skill and data source answering their question.", + "maxLength": 75 + } + }, + "description": "Defines the structure of localized knowledge information in the skill manifest." + }, + "v1.skill.Manifest.FlashBriefingApis": { + "type": "object", + "required": [ + "locales" + ], + "properties": { + "locales": { + "type": "object", + "description": "Object that contains objects for each supported locale.", + "minProperties": 1, + "maxProperties": 1, + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.LocalizedFlashBriefingInfo" + } + } + }, + "description": "Defines the structure of flash briefing api in the skill manifest." + }, + "v1.skill.Manifest.LocalizedFlashBriefingInfo": { + "type": "object", + "properties": { + "feeds": { + "type": "array", + "description": "Defines the structure for a feed information in the skill manifest.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.LocalizedFlashBriefingInfoItems" + }, + "maxItems": 50 + }, + "customErrorMessage": { + "type": "string", + "description": "Alexa says this to the customer if the skill fails to render the content.", + "minLength": 1, + "maxLength": 100 + } + }, + "description": "Defines the structure of a localized flash briefing information." + }, + "v1.skill.Manifest.LocalizedFlashBriefingInfoItems": { + "type": "object", + "required": [ + "contentType", + "genre", + "isDefault", + "updateFrequency", + "url" + ], + "properties": { + "logicalName": { + "type": "string", + "description": "Logical name of the feed. This is used to signify relation among feeds across different locales. Example If you have \"weather\" feed in multiple locale then consider naming it \"weather_update\" and we will make sure to play the right feed if customer changes the language on device.", + "maxLength": 255 + }, + "name": { + "type": "string", + "description": "Name that identifies this feed.", + "maxLength": 255 + }, + "url": { + "type": "string", + "description": "Url for the feed" + }, + "imageUri": { + "type": "string", + "description": "Uri for the feed image" + }, + "contentType": { + "$ref": "#/definitions/v1.skill.Manifest.FlashBriefingContentType", + "x-isEnum": true + }, + "genre": { + "$ref": "#/definitions/v1.skill.Manifest.FlashBriefingGenre", + "x-isEnum": true + }, + "updateFrequency": { + "$ref": "#/definitions/v1.skill.Manifest.FlashBriefingUpdateFrequency", + "x-isEnum": true + }, + "vuiPreamble": { + "type": "string", + "description": "A short introduction for the feed that Alexa reads to the customer before the feed contents. Should start with \"In\" or \"From\".", + "maxLength": 70 + }, + "isDefault": { + "type": "boolean", + "description": "True if this should be the default feed to be enabled when customer enables the skill false otherwise." + } + } + }, + "v1.skill.Manifest.FlashBriefingGenre": { + "type": "string", + "description": "Type or subject of the content in the feed.", + "enum": [ + "HEADLINE_NEWS", + "BUSINESS", + "POLITICS", + "ENTERTAINMENT", + "TECHNOLOGY", + "HUMOR", + "LIFESTYLE", + "SPORTS", + "SCIENCE", + "HEALTH_AND_FITNESS", + "ARTS_AND_CULTURE", + "PRODUCTIVITY_AND_UTILITIES", + "OTHER" + ] + }, + "v1.skill.Manifest.FlashBriefingContentType": { + "type": "string", + "description": "Format of the feed content.", + "enum": [ + "TEXT", + "AUDIO" + ] + }, + "v1.skill.Manifest.FlashBriefingUpdateFrequency": { + "type": "string", + "description": "Tells how often the feed has new content.", + "enum": [ + "HOURLY", + "DAILY", + "WEEKLY" + ] + }, + "v1.skill.Manifest.CustomApis": { + "type": "object", + "properties": { + "_targetRuntimes": { + "type": "array", + "description": "Defines the set of target runtimes for this skill.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.Custom.TargetRuntime" + }, + "minItems": 1 + }, + "locales": { + "type": "object", + "description": "Object that contains Objects for each supported locale.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.CustomLocalizedInformation" + } + }, + "regions": { + "type": "object", + "description": "Contains an array of the supported Objects.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.Region" + } + }, + "endpoint": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifestEndpoint" + }, + "interfaces": { + "type": "array", + "description": "Defines the structure for interfaces supported by the custom api of the skill.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.Interface" + } + }, + "tasks": { + "type": "array", + "description": "List of provided tasks.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.CustomTask" + }, + "minItems": 1 + }, + "connections": { + "$ref": "#/definitions/v1.skill.Manifest.CustomConnections" + }, + "dialogManagement": { + "$ref": "#/definitions/v1.skill.Manifest.DialogManagement" + }, + "appLink": { + "$ref": "#/definitions/v1.skill.Manifest.AppLink" + } + }, + "description": "Defines the structure for custom api of the skill." + }, + "v1.skill.Manifest.Custom.SuppressedInterface": { + "type": "string", + "enum": [ + "AudioPlayer", + "PlaybackController", + "Display", + "VideoPlayer", + "GameEngine", + "GadgetController", + "CanHandleIntentRequest", + "CanFulfillIntentRequest", + "AlexaPresentationApl", + "AlexaPresentationHtml", + "AlexaDataStore", + "AlexaDataStorePackageManager", + "PhotoCaptureController", + "VideoCaptureController", + "UploadController", + "CustomInterface", + "AlexaAugmentationEffectsController" + ] + }, + "v1.skill.Manifest.CustomLocalizedInformation": { + "type": "object", + "properties": { + "dialogManagement": { + "$ref": "#/definitions/v1.skill.Manifest.CustomLocalizedInformationDialogManagement" + } + }, + "description": "Defines the localized custom api information." + }, + "v1.skill.Manifest.CustomLocalizedInformationDialogManagement": { + "type": "object", + "properties": { + "sessionStartDelegationStrategy": { + "$ref": "#/definitions/v1.skill.Manifest.CustomDialogManagement.SessionStartDelegationStrategy" + } + }, + "description": "Defines locale-specific dialog-management configuration for a skill." + }, + "v1.skill.Manifest.CustomDialogManagement.SessionStartDelegationStrategy": { + "type": "object", + "required": [ + "target" + ], + "properties": { + "target": { + "type": "string" + } + }, + "description": "Specifies the initial dialog manager to field requests when a new skill session starts. If absent, this is assumed to be the default \"skill\" target" + }, + "v1.skill.Manifest.Custom.TargetRuntime": { + "type": "object", + "required": [ + "type" + ], + "discriminator": "type", + "properties": { + "type": { + "type": "string", + "x-isDiscriminator": true + } + }, + "description": "Discriminator for target runtime objects." + }, + "v1.skill.Manifest.Custom.TargetRuntimeType": { + "type": "string", + "enum": [ + "DEVICE" + ] + }, + "v1.skill.Manifest.Custom.TargetRuntimeDevice": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.Custom.TargetRuntime" + } + ], + "description": "The type of target runtime.", + "x-discriminator-value": "DEVICE" + }, + "v1.skill.Manifest.CustomConnections": { + "type": "object", + "properties": { + "requires": { + "type": "array", + "description": "List of required connections.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.Custom.Connection" + }, + "minItems": 1 + }, + "provides": { + "type": "array", + "description": "List of provided connections.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.Custom.Connection" + }, + "minItems": 1 + } + }, + "description": "Supported connections." + }, + "v1.skill.Manifest.Custom.Connection": { + "type": "object", + "required": [ + "name", + "payload" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the connection.", + "minLength": 1 + }, + "payload": { + "$ref": "#/definitions/v1.skill.Manifest.ConnectionsPayload" + } + }, + "description": "Skill connection object." + }, + "v1.skill.Manifest.ConnectionsPayload": { + "type": "object", + "required": [ + "type", + "version" + ], + "properties": { + "type": { + "type": "string", + "description": "Type of the payload.", + "minLength": 1 + }, + "version": { + "type": "string", + "description": "Version of the payload.", + "minLength": 1 + } + }, + "description": "Payload of the connection." + }, + "v1.skill.Manifest.DialogManagement": { + "type": "object", + "required": [ + "dialogManagers" + ], + "properties": { + "dialogManagers": { + "type": "array", + "description": "List of dialog managers configured by the skill", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.DialogManager" + } + }, + "sessionStartDelegationStrategy": { + "$ref": "#/definitions/v1.skill.Manifest.DialogDelegationStrategy" + } + }, + "description": "Defines the dialog management configuration for the skill." + }, + "v1.skill.Manifest.DialogDelegationStrategy": { + "type": "object", + "required": [ + "target" + ], + "properties": { + "target": { + "type": "string" + } + }, + "description": "Specifies the initial dialog manager to field requests when a new skill session starts. If absent this is assumed to be the default \\\"skill\\\" target." + }, + "v1.skill.Manifest.DialogManager": { + "type": "object", + "required": [ + "type" + ], + "discriminator": "type", + "properties": { + "type": { + "type": "string", + "description": "Type of DialogManager.", + "x-isDiscriminator": true + } + }, + "description": "Individual dialog manager defined for the skill." + }, + "v1.skill.Manifest.AMAZONConversationsDialogManager": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.DialogManager" + } + ], + "description": "The type of dialog manager: * AMAZON.Conversations - The Alexa Conversations (Coltrane) model for this skill.", + "x-discriminator-value": "AMAZON.Conversations" + }, + "v1.skill.Manifest.Interface": { + "type": "object", + "required": [ + "type" + ], + "discriminator": "type", + "properties": { + "type": { + "type": "string", + "x-isDiscriminator": true + } + } + }, + "v1.skill.Manifest.InterfaceType": { + "type": "string", + "description": "Name of the interface.", + "enum": [ + "AUDIO_PLAYER", + "VIDEO_APP", + "RENDER_TEMPLATE", + "GAME_ENGINE", + "GADGET_CONTROLLER", + "CAN_FULFILL_INTENT_REQUEST", + "ALEXA_PRESENTATION_APL", + "ALEXA_CAMERA_PHOTO_CAPTURE_CONTROLLER", + "ALEXA_CAMERA_VIDEO_CAPTURE_CONTROLLER", + "ALEXA_FILE_MANAGER_UPLOAD_CONTROLLER", + "CUSTOM_INTERFACE", + "ALEXA_AUGMENTATION_EFFECTS_CONTROLLER", + "APP_LINKS", + "ALEXA_EXTENSION", + "APP_LINKS_V2", + "ALEXA_SEARCH" + ] + }, + "v1.skill.Manifest.AudioInterface": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.Interface" + } + ], + "x-discriminator-value": "AUDIO_PLAYER" + }, + "v1.skill.Manifest.VideoAppInterface": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.Interface" + } + ], + "x-discriminator-value": "VIDEO_APP" + }, + "v1.skill.Manifest.DisplayInterface": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.Interface" + }, + { + "type": "object", + "properties": { + "minimumTemplateVersion": { + "$ref": "#/definitions/v1.skill.Manifest.DisplayInterfaceTemplateVersion" + }, + "minimumApmlVersion": { + "$ref": "#/definitions/v1.skill.Manifest.DisplayInterfaceApmlVersion" + } + } + } + ], + "description": "Used to declare that the skill uses the Display interface. When a skill declares that it uses the Display interface the Display interface will be passed in the supportedInterfaces section of devices which meet any of the required minimum version attributes specified in the manifest. If the device does not meet any of the minimum versions specified in the manifest the Display interface will not be present in the supportedInterfaces section. If neither the minimumTemplateVersion nor the minimumApmlVersion attributes are specified in the manifes then the minimumTemplateVersion is defaulted to 1.0 and apmlVersion is omitted.", + "x-discriminator-value": "RENDER_TEMPLATE" + }, + "v1.skill.Manifest.AppLinkInterface": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.Interface" + } + ], + "x-discriminator-value": "APP_LINKS" + }, + "v1.skill.Manifest.AppLinkV2Interface": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.Interface" + } + ], + "x-discriminator-value": "APP_LINKS_V2" + }, + "v1.skill.Manifest.GameEngineInterface": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.Interface" + } + ], + "x-discriminator-value": "GAME_ENGINE" + }, + "v1.skill.Manifest.GadgetControllerInterface": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.Interface" + } + ], + "description": "Skills using Gadget Controller can send directives to Echo Buttons. This is a legacy interface specific to Echo Buttons.", + "x-discriminator-value": "GADGET_CONTROLLER" + }, + "v1.skill.Manifest.AlexaPresentationAplInterface": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.Interface" + }, + { + "type": "object", + "properties": { + "supportedViewports": { + "type": "array", + "description": "List of supported viewports.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.ViewportSpecification" + } + } + } + } + ], + "description": "Used to declare that the skill uses the Alexa.Presentation.APL interface.", + "x-discriminator-value": "ALEXA_PRESENTATION_APL" + }, + "v1.skill.Manifest.AlexaPresentationHtmlInterface": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.Interface" + } + ], + "description": "Used to declare that the skill uses the Alexa.Presentation.HTML interface.", + "x-discriminator-value": "ALEXA_PRESENTATION_HTML" + }, + "v1.skill.Manifest.ExtensionRequest": { + "type": "object", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "The extension's URI." + } + }, + "description": "Represents a request for a runtime extension. Extensions are optional enhancements to a runtime that provide additional sources of data, commands, and event handlers." + }, + "v1.skill.Manifest.ExtensionInitializationRequest": { + "type": "object", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "The extension's URI." + }, + "settings": { + "type": "object", + "description": "Default initialization extension settings.", + "properties": {}, + "x-jsonSchema-additionalProperties": { + "type": "string" + } + } + }, + "description": "Represents a request to automatically initialize an extension by a runtime." + }, + "v1.skill.Manifest.CustomTask": { + "type": "object", + "required": [ + "name", + "version" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the task.", + "minLength": 1 + }, + "version": { + "type": "string", + "description": "Version of the task.", + "minLength": 1 + } + }, + "description": "Defines the name and version of the task that the skill wants to handle." + }, + "v1.skill.Manifest.DisplayInterfaceTemplateVersion": { + "type": "string", + "description": "The minimum version of pre-defined templates supported by the skill. If a device does not support a version greater than or equal to the version specified her then templateVersion will not be passed inside the Display interface in the ASK request.", + "enum": [ + "1" + ] + }, + "v1.skill.Manifest.DisplayInterfaceApmlVersion": { + "type": "string", + "description": "The minimum version of the APML specification supported by the skill. If a device does not support a version greater than or equal to the version specified her then apmlVersion will not be passed inside the Display interface in the ASK request.", + "enum": [ + "0.2" + ] + }, + "v1.skill.Manifest.ViewportSpecification": { + "type": "object", + "required": [ + "mode", + "shape" + ], + "properties": { + "mode": { + "$ref": "#/definitions/v1.skill.Manifest.ViewportMode", + "x-isEnum": true + }, + "shape": { + "$ref": "#/definitions/v1.skill.Manifest.ViewportShape", + "x-isEnum": true + }, + "minWidth": { + "type": "integer", + "description": "Defines the minimum width of viewport that comply with this specification.", + "minimum": 1 + }, + "maxWidth": { + "type": "integer", + "description": "Defines the maximum width of viewport that comply with this specification.", + "minimum": 1 + }, + "minHeight": { + "type": "integer", + "description": "Defines the minimum height of viewport that comply with this specification.", + "minimum": 1 + }, + "maxHeight": { + "type": "integer", + "description": "Defines the maximum height of viewport that comply with this specification.", + "minimum": 1 + } + }, + "description": "Defines a viewport specification." + }, + "v1.skill.Manifest.ViewportMode": { + "type": "string", + "description": "Defines the mode of viewport that comply with this specification. E.g. HUB TV.", + "enum": [ + "HUB", + "TV", + "MOBILE", + "PC", + "AUTO" + ] + }, + "v1.skill.Manifest.ViewportShape": { + "type": "string", + "description": "Defines the shape of the device's viewport.", + "enum": [ + "RECTANGLE", + "ROUND" + ] + }, + "v1.skill.Manifest.SmartHomeApis": { + "type": "object", + "required": [ + "protocolVersion" + ], + "properties": { + "regions": { + "type": "object", + "description": "Contains an array of the supported Objects.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.LambdaRegion" + } + }, + "endpoint": { + "$ref": "#/definitions/v1.skill.Manifest.LambdaEndpoint" + }, + "protocolVersion": { + "$ref": "#/definitions/v1.skill.Manifest.SmartHomeProtocol", + "x-isEnum": true + }, + "supportedControls": { + "$ref": "#/definitions/v1.skill.Manifest.SupportedControls" + } + }, + "description": "Defines the structure of smart home api of the skill." + }, + "v1.skill.Manifest.SupportedControls": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/v1.skill.Manifest.SupportedControlsType", + "x-isEnum": true + } + }, + "description": "(Optional) Contains the attributes specifying additional functionalities supported by the skill." + }, + "v1.skill.Manifest.SupportedControlsType": { + "type": "string", + "description": "Type of the supported functionality.", + "enum": [ + "REMOTE_VEHICLE_CONTROL" + ] + }, + "v1.skill.Manifest.LambdaEndpoint": { + "type": "object", + "required": [ + "uri" + ], + "properties": { + "uri": { + "type": "string", + "description": "Amazon Resource Name (ARN) of the Lambda function." + }, + "sslCertificateType": { + "$ref": "#/definitions/v1.skill.Manifest.LambdaSSLCertificateType", + "x-isEnum": true + } + }, + "description": "Contains the uri field. This sets the global default endpoint." + }, + "v1.skill.Manifest.AlexaSearch": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.Interface" + } + ], + "x-discriminator-value": "ALEXA_SEARCH" + }, + "v1.skill.Manifest.LambdaSSLCertificateType": { + "type": "string", + "description": "The SSL certificate type of the skill's HTTPS endpoint. Only valid for HTTPS endpoint not for AWS Lambda ARN.", + "enum": [ + "SelfSigned", + "Wildcard", + "Trusted" + ] + }, + "v1.skill.Manifest.LambdaRegion": { + "type": "object", + "required": [ + "endpoint" + ], + "properties": { + "endpoint": { + "$ref": "#/definitions/v1.skill.Manifest.LambdaEndpoint" + } + }, + "description": "Defines the structure of a regional information." + }, + "v1.skill.Manifest.SmartHomeProtocol": { + "type": "string", + "description": "Version of the Smart Home API. Default and recommended value is '3'. You may create a skill with version '2' for testing migration to version '3', but a skill submission using version '2' will not be certified.", + "enum": [ + "2", + "2.0", + "3", + "3.0" + ] + }, + "v1.skill.Manifest.VideoApisLocale": { + "type": "object", + "required": [ + "videoProviderTargetingNames" + ], + "properties": { + "videoProviderTargetingNames": { + "type": "array", + "description": "Defines the video provider's targeting name.", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "videoProviderLogoUri": { + "type": "string" + }, + "fireTvCatalogIngestion": { + "$ref": "#/definitions/v1.skill.Manifest.VideoFireTvCatalogIngestion" + }, + "features": { + "type": "array", + "description": "Defines the array of video features for this skill.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.VideoFeature" + } + }, + "promptNames": { + "type": "array", + "description": "Name to use when Alexa renders the video skill name in a prompt to the user", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.VideoPromptName" + } + } + }, + "description": "Defines the structure for localized video api information." + }, + "v1.skill.Manifest.VideoFeature": { + "type": "object", + "required": [ + "name", + "version" + ], + "discriminator": "name", + "properties": { + "version": { + "type": "string" + }, + "name": { + "type": "string", + "x-isDiscriminator": true + } + }, + "description": "A feature of an Alexa skill." + }, + "v1.skill.Manifest.VoiceProfileFeature": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.Manifest.VideoFeature" + } + ], + "description": "Feature for allowing for querying for available partner voice profiles, linking Alexa Speaker ID profiles to partner speaker profiles, and sending partner speaker profiles in directives.", + "x-discriminator-value": "VIDEO_VOICE_PROFILE" + }, + "v1.skill.Manifest.VideoPromptName": { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "type": { + "$ref": "#/definitions/v1.skill.Manifest.VideoPromptNameType", + "x-isEnum": true + }, + "name": { + "type": "string" + } + } + }, + "v1.skill.Manifest.VideoPromptNameType": { + "type": "string", + "enum": [ + "Default" + ] + }, + "v1.skill.Manifest.VideoFireTvCatalogIngestion": { + "type": "object", + "properties": { + "fireTvCatalogIngestionSourceId": { + "type": "string" + }, + "isFireTvCatalogIngestionEnabled": { + "type": "boolean" + } + } + }, + "v1.skill.Manifest.VideoCatalogInfo": { + "type": "object", + "required": [ + "sourceId" + ], + "properties": { + "sourceId": { + "type": "string" + } + } + }, + "v1.skill.Manifest.VideoApis": { + "type": "object", + "properties": { + "regions": { + "type": "object", + "description": "Defines the structure for region information.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.VideoRegion" + } + }, + "locales": { + "type": "object", + "description": "Defines the structure for the locale specific video api information.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.VideoApisLocale" + } + }, + "endpoint": { + "$ref": "#/definitions/v1.skill.Manifest.LambdaEndpoint" + }, + "countries": { + "type": "object", + "description": "Object that contains Objects for each supported country.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.VideoCountryInfo" + } + } + }, + "description": "Defines the structure for video api of the skill." + }, + "v1.skill.Manifest.VideoRegion": { + "type": "object", + "required": [ + "endpoint" + ], + "properties": { + "endpoint": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifestEndpoint" + }, + "upchannel": { + "type": "array", + "description": "The channel through which the partner skill can communicate to Alexa.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.UpChannelItems" + } + } + }, + "description": "Defines the structure for endpoint information." + }, + "v1.skill.Manifest.UpChannelItems": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "Use \\\"SNS\\\" for this field." + }, + "uri": { + "type": "string", + "description": "SNS Amazon Resource Name (ARN) for video skill through which video partner can send events to Alexa." + } + } + }, + "v1.skill.Manifest.VideoCountryInfo": { + "type": "object", + "properties": { + "catalogInformation": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.VideoCatalogInfo" + } + } + }, + "description": "Defines the structure of per-country video info in the skill manifest." + }, + "v1.skill.Manifest.AlexaForBusinessApis": { + "type": "object", + "properties": { + "regions": { + "type": "object", + "description": "Contains an array of the supported Objects.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.Region" + } + }, + "endpoint": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifestEndpoint" + }, + "interfaces": { + "type": "array", + "description": "Contains the list of supported interfaces.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.AlexaForBusinessInterface" + } + } + }, + "description": "Defines the structure of alexaForBusiness api in the skill manifest." + }, + "v1.skill.Manifest.AlexaForBusinessInterface": { + "type": "object", + "required": [ + "namespace", + "requests", + "version" + ], + "properties": { + "namespace": { + "type": "string", + "description": "Name of the interface." + }, + "version": { + "$ref": "#/definitions/v1.skill.Manifest.Version", + "x-isEnum": true + }, + "requests": { + "type": "array", + "description": "Contains a list of requests/messages that skill can handle.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.AlexaForBusinessInterfaceRequest" + } + } + } + }, + "v1.skill.Manifest.Version": { + "type": "string", + "description": "Version of the interface.", + "enum": [ + "1.0" + ] + }, + "v1.skill.Manifest.AlexaForBusinessInterfaceRequest": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "$ref": "#/definitions/v1.skill.Manifest.AlexaForBusinessInterfaceRequestName", + "x-isEnum": true + } + } + }, + "v1.skill.Manifest.AlexaForBusinessInterfaceRequestName": { + "type": "string", + "description": "Name of the request.", + "enum": [ + "Search", + "Create", + "Update" + ] + }, + "v1.skill.Manifest.HealthInterface": { + "type": "object", + "required": [ + "namespace" + ], + "properties": { + "namespace": { + "type": "string", + "description": "Name of the interface." + }, + "version": { + "type": "string", + "description": "defines the version of skill interface." + } + } + }, + "v1.skill.Manifest.HouseHoldList": { + "type": "object", + "description": "Defines the structure of household list api in the skill manifest." + }, + "v1.skill.Manifest.MusicApis": { + "type": "object", + "properties": { + "regions": { + "type": "object", + "description": "Contains an array of the supported Objects.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.LambdaRegion" + } + }, + "endpoint": { + "$ref": "#/definitions/v1.skill.Manifest.LambdaEndpoint" + }, + "capabilities": { + "type": "array", + "description": "Defines the structure of music capabilities information in the skill manifest.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.MusicCapability" + } + }, + "interfaces": { + "type": "array", + "description": "A list of music skill interfaces that your skill supports.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.MusicInterfaces" + } + }, + "locales": { + "type": "object", + "description": "Defines the structure of locale specific music information in the skill manifest.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.LocalizedMusicInfo" + } + }, + "contentTypes": { + "type": "array", + "description": "List of the type of content to be provided by the music skill.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.MusicContentType" + } + } + }, + "description": "Defines the structure of music api in the skill manifest." + }, + "v1.skill.Manifest.MusicCapability": { + "type": "object", + "properties": { + "namespace": { + "type": "string", + "description": "Namespace of music skill api." + }, + "name": { + "type": "string", + "description": "Name of music skill api." + }, + "version": { + "type": "string", + "description": "Version of music skill api." + } + } + }, + "v1.skill.Manifest.MusicInterfaces": { + "type": "object", + "required": [ + "namespace" + ], + "properties": { + "namespace": { + "type": "string", + "description": "Name of the interface." + }, + "version": { + "type": "string", + "description": "Version of the interface." + }, + "requests": { + "type": "array", + "description": "Contains a list of requests/messages that skill can handle.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.MusicRequest" + } + } + } + }, + "v1.skill.Manifest.MusicRequest": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the request." + } + } + }, + "v1.skill.Manifest.LocalizedMusicInfo": { + "type": "object", + "properties": { + "promptName": { + "type": "string", + "description": "Name to be used when Alexa renders the music skill name." + }, + "aliases": { + "type": "array", + "description": "Defines the structure of the music prompt name information in the skill manifest.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.MusicAlias" + }, + "minItems": 1 + }, + "features": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.MusicFeature" + } + }, + "wordmarkLogos": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.MusicWordmark" + } + } + }, + "description": "Defines the structure of localized music information in the skill manifest." + }, + "v1.skill.Manifest.MusicAlias": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Alias name to be associated with the music skill." + } + } + }, + "v1.skill.Manifest.MusicFeature": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Feature name to be associated with the music skill." + } + } + }, + "v1.skill.Manifest.MusicWordmark": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": "Wordmark logo to be used by devices with displays." + } + } + }, + "v1.skill.Manifest.MusicContentType": { + "type": "object", + "properties": { + "name": { + "$ref": "#/definitions/v1.skill.Manifest.MusicContentName", + "x-isEnum": true + } + }, + "description": "Defines the structure for content that can be provided by a music skill." + }, + "v1.skill.Manifest.MusicContentName": { + "type": "string", + "description": "Name of the content type that's supported for the music skill.", + "enum": [ + "ON_DEMAND", + "RADIO", + "PODCAST" + ] + }, + "v1.skill.Manifest.AppLink": { + "type": "object", + "properties": { + "linkedApplications": { + "type": "array", + "description": "Allows developers to declare their Skill will use Alexa App Links, and list relevant apps. This field is required when using the APP_LINK interface.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.LinkedApplication" + }, + "minItems": 1 + }, + "linkedWebDomains": { + "type": "array", + "description": "Allow developer to decalre their skill to link to the declared web domains.", + "items": { + "type": "string", + "minLength": 1 + }, + "minItems": 1 + }, + "linkedAndroidCommonIntents": { + "type": "array", + "description": "Allow developer to declare their skill to link to the speicified android common intents.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.LinkedAndroidCommonIntent" + }, + "minItems": 1 + }, + "linkedCommonSchemes": { + "$ref": "#/definitions/v1.skill.Manifest.LinkedCommonSchemes" + } + }, + "description": "Details required for app linking use cases." + }, + "v1.skill.Manifest.LinkedApplication": { + "type": "object", + "required": [ + "catalogInfo", + "friendlyName" + ], + "properties": { + "catalogInfo": { + "$ref": "#/definitions/v1.skill.Manifest.CatalogInfo" + }, + "customSchemes": { + "type": "array", + "description": "Supported schemes", + "items": { + "type": "string", + "minLength": 1 + }, + "minItems": 1 + }, + "domains": { + "type": "array", + "description": "Supported domains", + "items": { + "type": "string", + "minLength": 1 + }, + "minItems": 1 + }, + "friendlyName": { + "$ref": "#/definitions/v1.skill.Manifest.FriendlyName" + }, + "androidCustomIntents": { + "type": "array", + "description": "Supported android custom intent", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.AndroidCustomIntent" + }, + "minItems": 1 + } + }, + "description": "Applications associated with the skill." + }, + "v1.skill.Manifest.LinkedCommonSchemes": { + "type": "object", + "properties": { + "IOS_APP_STORE": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.IOSAppStoreCommonSchemeName" + }, + "minItems": 1 + }, + "GOOGLE_PLAY_STORE": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.PlayStoreCommonSchemeName" + }, + "minItems": 1 + } + }, + "description": "Allow developer to declare their skill to link to the speicified common schemes" + }, + "v1.skill.Manifest.IOSAppStoreCommonSchemeName": { + "type": "string", + "description": "supported common schemes for IOS_APP_STORE. MAPS is for \"maps:\" and TEL is for \"tel:\".", + "enum": [ + "MAPS", + "TEL" + ] + }, + "v1.skill.Manifest.PlayStoreCommonSchemeName": { + "type": "string", + "description": "supported common schemes for GOOGLE_PLAY_STORE. MAPS is for \"maps:\" and TEL is for \"tel:\".", + "enum": [ + "MAPS", + "TEL" + ] + }, + "v1.skill.Manifest.LinkedAndroidCommonIntent": { + "type": "object", + "required": [ + "catalogType", + "intentName" + ], + "properties": { + "intentName": { + "$ref": "#/definitions/v1.skill.Manifest.AndroidCommonIntentName", + "x-isEnum": true + }, + "catalogType": { + "$ref": "#/definitions/v1.skill.Manifest.CatalogName", + "x-isEnum": true + } + }, + "description": "Android common intents associated with the skill" + }, + "v1.skill.Manifest.CatalogName": { + "type": "string", + "enum": [ + "IOS_APP_STORE", + "GOOGLE_PLAY_STORE" + ] + }, + "v1.skill.Manifest.AndroidCommonIntentName": { + "type": "string", + "description": "Supported android common intent. Each of the value maps to a common intent defined in https://developer.android.com/guide/components/intents-common.", + "enum": [ + "SHOW_IN_MAP", + "ADD_CALENDAR_EVENT", + "PLAY_MEDIA", + "START_PHONE_CALL", + "OPEN_SETTINGS" + ] + }, + "v1.skill.Manifest.AndroidCustomIntent": { + "type": "object", + "properties": { + "component": { + "type": "string", + "description": "android component name", + "minLength": 1 + }, + "action": { + "type": "string", + "description": "android intent action", + "minLength": 1 + } + }, + "description": "Android custom intent" + }, + "v1.skill.Manifest.CatalogInfo": { + "type": "object", + "required": [ + "identifier", + "type" + ], + "properties": { + "type": { + "$ref": "#/definitions/v1.skill.Manifest.CatalogType", + "x-isEnum": true + }, + "identifier": { + "type": "string", + "description": "Identifier when accessing app in store.", + "minLength": 1 + } + }, + "description": "Details about how the app is listed on app store catalogs." + }, + "v1.skill.Manifest.CatalogType": { + "type": "string", + "description": "Supported catalog", + "enum": [ + "IOS_APP_STORE", + "GOOGLE_PLAY_STORE" + ] + }, + "v1.skill.Manifest.FriendlyName": { + "type": "object", + "required": [ + "default" + ], + "properties": { + "default": { + "type": "string", + "description": "Default app name", + "minLength": 1 + }, + "localizedNames": { + "type": "array", + "description": "Localized app names.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.LocalizedName" + }, + "minItems": 1 + } + }, + "description": "Localized App name" + }, + "v1.skill.Manifest.LocalizedName": { + "type": "object", + "required": [ + "locale", + "name" + ], + "properties": { + "locale": { + "type": "string", + "description": "locale", + "minLength": 1 + }, + "name": { + "type": "string", + "description": "app name", + "minLength": 1 + } + }, + "description": "Localized app name" + }, + "v1.skill.Manifest.DemandResponseApis": { + "type": "object", + "properties": { + "regions": { + "type": "object", + "description": "Contains an array of the supported Objects.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.Manifest.LambdaRegion" + } + }, + "endpoint": { + "$ref": "#/definitions/v1.skill.Manifest.LambdaEndpoint" + }, + "enrollmentUrl": { + "type": "string", + "description": "Defines the url for enrolling into a demand response program." + } + }, + "description": "Defines the structure for demand response api of the skill." + }, + "v1.skill.Manifest.PaidSkillInformation": { + "type": "object", + "required": [ + "pricing", + "taxInformation" + ], + "properties": { + "pricing": { + "type": "object", + "description": "Defines the structure for marketplace specific pricing information in the skill manifest", + "minProperties": 1, + "additionalProperties": { + "type": "array", + "description": "List of paid skill product pricing information.", + "items": { + "$ref": "#/definitions/v1.skill.Manifest.MarketplacePricing" + }, + "maxItems": 1, + "minItems": 1 + } + }, + "taxInformation": { + "$ref": "#/definitions/v1.skill.Manifest.TaxInformation" + } + }, + "description": "Defines the structure of the paid skill information of the skill." + }, + "v1.skill.Manifest.CustomProductPrompts": { + "type": "object", + "required": [ + "purchaseConfirmationDescription", + "purchasePromptDescription" + ], + "properties": { + "purchasePromptDescription": { + "type": "string", + "description": "Description of the paid skill product heard before customer is prompted for purchase." + }, + "purchaseConfirmationDescription": { + "type": "string", + "description": "Description of the paid skill product that displays when the paid skill is purchased." + } + }, + "description": "Custom prompts used for paid skill product purchasing options. Supports Speech Synthesis Markup Language (SSML), which can be used to control pronunciation, intonation, timing, and emotion." + }, + "v1.skill.Manifest.MarketplacePricing": { + "type": "object", + "required": [ + "currency", + "offerType", + "price" + ], + "properties": { + "offerType": { + "$ref": "#/definitions/v1.skill.Manifest.OfferType", + "x-isEnum": true + }, + "price": { + "type": "number", + "description": "Defines the price of a paid skill product. The price should be your suggested price, not including any VAT or similar taxes. Taxes are included in the final price to end users." + }, + "currency": { + "$ref": "#/definitions/v1.skill.Manifest.Currency", + "x-isEnum": true + }, + "freeTrialInformation": { + "$ref": "#/definitions/v1.skill.Manifest.FreeTrialInformation" + }, + "subscriptionInformation": { + "$ref": "#/definitions/v1.skill.Manifest.SubscriptionInformation" + } + }, + "description": "Paid skill product pricing information." + }, + "v1.skill.Manifest.OfferType": { + "type": "string", + "description": "The type of the offer.", + "enum": [ + "SUBSCRIPTION", + "ENTITLEMENT" + ] + }, + "v1.skill.Manifest.Currency": { + "type": "string", + "format": "ISO 4217 format", + "description": "Currency to use for paid skill product.", + "enum": [ + "USD" + ] + }, + "v1.skill.Manifest.TaxInformation": { + "type": "object", + "required": [ + "category" + ], + "properties": { + "category": { + "$ref": "#/definitions/v1.skill.Manifest.TaxInformationCategory", + "x-isEnum": true + } + }, + "description": "Defines the structure for paid skill product tax information." + }, + "v1.skill.Manifest.TaxInformationCategory": { + "type": "string", + "description": "The tax category that best describes the paid skill product.", + "enum": [ + "SOFTWARE", + "STREAMING_AUDIO", + "STREAMING_RADIO", + "INFORMATION_SERVICES", + "VIDEO", + "PERIODICALS", + "NEWSPAPERS" + ] + }, + "v1.skill.Manifest.SubscriptionInformation": { + "type": "object", + "required": [ + "subscriptionPaymentFrequency" + ], + "properties": { + "subscriptionPaymentFrequency": { + "$ref": "#/definitions/v1.skill.Manifest.SubscriptionPaymentFrequency", + "x-isEnum": true + } + }, + "description": "Defines the structure for paid skill product subscription information." + }, + "v1.skill.Manifest.SubscriptionPaymentFrequency": { + "type": "string", + "description": "The frequency in which payments are collected for the subscription.", + "enum": [ + "MONTHLY", + "YEARLY" + ] + }, + "v1.skill.Manifest.FreeTrialInformation": { + "type": "object", + "required": [ + "freeTrialDuration" + ], + "properties": { + "freeTrialDuration": { + "type": "string", + "format": "ISO_8601#Durations format", + "description": "Defines the free trial period for the paid skill product, in ISO_8601#Durations format." + } + }, + "description": "Defines the structure for paid skill product free trial information." + }, + "v1.skill.metrics.GetMetricDataResponse": { + "type": "object", + "required": [ + "metric", + "timestamps", + "values" + ], + "properties": { + "metric": { + "type": "string", + "description": "The name of metric which customer requested." + }, + "timestamps": { + "type": "array", + "description": "The timestamps for the data points.", + "items": { + "type": "string", + "format": "date-time" + } + }, + "values": { + "type": "array", + "description": "The data points for the metric corresponding to Timestamps.", + "items": { + "type": "number" + } + }, + "nextToken": { + "type": "string", + "description": "A token that marks the next batch of returned results." + } + }, + "description": "Response object for the API call which contains metrics data." + }, + "v1.skill.metrics.Period": { + "type": "string", + "description": "The aggregation period to use when retrieving the metric, follows ISO_8601#Durations format.", + "enum": [ + "SINGLE", + "PT15M", + "PT1H", + "P1D" + ] + }, + "v1.skill.metrics.Metric": { + "type": "string", + "description": "A distinct set of logic which predictably returns a set of data.", + "enum": [ + "uniqueCustomers", + "totalEnablements", + "totalUtterances", + "successfulUtterances", + "failedUtterances", + "totalSessions", + "successfulSessions", + "incompleteSessions", + "userEndedSessions", + "skillEndedSessions" + ] + }, + "v1.skill.metrics.stageForMetric": { + "type": "string", + "description": "The stage of the skill (live, development).", + "enum": [ + "live", + "development" + ] + }, + "v1.skill.metrics.SkillType": { + "type": "string", + "description": "The type of the skill (custom, smartHome and flashBriefing).", + "enum": [ + "custom", + "smartHome", + "flashBriefing" + ] + }, + "v1.skill.Private.ListPrivateDistributionAccountsResponse": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "privateDistributionAccounts": { + "type": "array", + "description": "List of PrivateDistributionAccounts.", + "items": { + "$ref": "#/definitions/v1.skill.Private.PrivateDistributionAccount" + } + }, + "nextToken": { + "type": "string" + } + }, + "description": "Response of ListPrivateDistributionAccounts." + }, + "v1.skill.Private.PrivateDistributionAccount": { + "type": "object", + "properties": { + "principal": { + "type": "string", + "description": "12-digit numerical account ID for AWS account holders." + }, + "acceptStatus": { + "$ref": "#/definitions/v1.skill.Private.AcceptStatus", + "x-isEnum": true + } + }, + "description": "Contains information of the private distribution account with given id." + }, + "v1.skill.Private.AcceptStatus": { + "type": "string", + "description": "Enterprise IT administrators' action on the private distribution.", + "enum": [ + "ACCEPTED", + "PENDING" + ] + }, + "v1.skill.publication.PublishSkillRequest": { + "type": "object", + "properties": { + "publishesAtDate": { + "type": "string", + "format": "date-time", + "description": "Used to determine when the skill Publishing should start. It takes the request timestamp as default value. The date range can be a maximum of upto 6 months from the current time stamp. The format should be the RFC 3399 variant of ISO 8601. e.g 2019-04-12T23:20:50.52Z" + } + } + }, + "v1.skill.publication.SkillPublicationResponse": { + "type": "object", + "properties": { + "publishesAtDate": { + "type": "string", + "format": "date-time", + "description": "Used to determine when the skill Publishing should start." + }, + "status": { + "$ref": "#/definitions/v1.skill.publication.SkillPublicationStatus", + "x-isEnum": true + } + } + }, + "v1.skill.publication.SkillPublicationStatus": { + "type": "string", + "description": "Status of publishing", + "enum": [ + "IN_PROGRESS", + "SUCCEEDED", + "FAILED", + "CANCELLED", + "SCHEDULED" + ] + }, + "v1.skill.simulations.SimulationsApiRequest": { + "type": "object", + "required": [ + "device", + "input" + ], + "properties": { + "input": { + "$ref": "#/definitions/v1.skill.simulations.Input" + }, + "device": { + "$ref": "#/definitions/v1.skill.simulations.Device" + }, + "session": { + "$ref": "#/definitions/v1.skill.simulations.Session" + }, + "simulation": { + "$ref": "#/definitions/v1.skill.simulations.Simulation" + } + } + }, + "v1.skill.simulations.Device": { + "type": "object", + "required": [ + "locale" + ], + "properties": { + "locale": { + "type": "string", + "description": "A valid locale (e.g \"en-US\") for the virtual device used in simulation.\n" + } + }, + "description": "Model of a virtual device used for simulation. This device object emulates attributes associated with a real Alexa enabled device.\n" + }, + "v1.skill.simulations.Input": { + "type": "object", + "required": [ + "content" + ], + "properties": { + "content": { + "type": "string", + "description": "A string corresponding to the utterance text of what a customer would say to Alexa.\n" + } + } + }, + "v1.skill.simulations.Session": { + "type": "object", + "properties": { + "mode": { + "$ref": "#/definitions/v1.skill.simulations.SessionMode", + "x-isEnum": true + } + }, + "description": "Session settings for running current simulation.\n" + }, + "v1.skill.simulations.SessionMode": { + "type": "string", + "description": "Indicate the session mode of the current simulation is using.\n", + "enum": [ + "DEFAULT", + "FORCE_NEW_SESSION" + ] + }, + "v1.skill.simulations.Simulation": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/v1.skill.simulations.SimulationType", + "x-isEnum": true + } + }, + "description": "Simulation settings for the current simulation request.\n" + }, + "v1.skill.simulations.SimulationType": { + "type": "string", + "description": "String indicating the type of simulation request. Possible values are \"DEFAULT\" and \"NFI_ISOLATED_SIMULATION\". \"NFI_ISOLATED_SIMULATION\" is used to test the NFI(Name Free Interaction) enabled skills in isolation. This field is reserved for testing Name Free Interactions(NFI). Skills that are eligible to add NFI can only use this field. To learn more, visit https://developer.amazon.com/en-US/docs/alexa/custom-skills/understand-name-free-interaction-for-custom-skills.html\n", + "enum": [ + "DEFAULT", + "NFI_ISOLATED_SIMULATION" + ] + }, + "v1.skill.simulations.SimulationsApiResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Id of the simulation resource." + }, + "status": { + "$ref": "#/definitions/v1.skill.simulations.SimulationsApiResponseStatus", + "x-isEnum": true + }, + "result": { + "$ref": "#/definitions/v1.skill.simulations.SimulationResult" + } + } + }, + "v1.skill.simulations.SimulationsApiResponseStatus": { + "type": "string", + "description": "String that specifies the current status of the simulation. Possible values are \"IN_PROGRESS\", \"SUCCESSFUL\", and \"FAILED\".\n", + "enum": [ + "IN_PROGRESS", + "SUCCESSFUL", + "FAILED" + ] + }, + "v1.skill.simulations.SimulationResult": { + "type": "object", + "properties": { + "alexaExecutionInfo": { + "$ref": "#/definitions/v1.skill.simulations.AlexaExecutionInfo" + }, + "skillExecutionInfo": { + "$ref": "#/definitions/v1.skill.simulations.Invocation" + }, + "error": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "v1.skill.simulations.AlexaExecutionInfo": { + "type": "object", + "properties": { + "alexaResponses": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.simulations.AlexaResponse" + } + } + } + }, + "v1.skill.simulations.AlexaResponse": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of Alexa response" + }, + "content": { + "description": "The detail information needs to exposed in this type of Alexa response.\n", + "$ref": "#/definitions/v1.skill.simulations.AlexaResponseContent" + } + } + }, + "v1.skill.simulations.AlexaResponseContent": { + "type": "object", + "properties": { + "caption": { + "type": "string", + "description": "The plain text get from Alexa speech response" + } + } + }, + "v1.skill.simulations.Invocation": { + "type": "object", + "properties": { + "invocationRequest": { + "$ref": "#/definitions/v1.skill.simulations.InvocationRequest" + }, + "invocationResponse": { + "$ref": "#/definitions/v1.skill.simulations.InvocationResponse" + }, + "metrics": { + "$ref": "#/definitions/v1.skill.simulations.Metrics" + } + } + }, + "v1.skill.simulations.InvocationRequest": { + "type": "object", + "properties": { + "endpoint": { + "type": "string", + "description": "Skill's Lambda or HTTPS endpoint." + }, + "body": { + "type": "object", + "description": "JSON payload that was sent to the skill's Lambda or HTTPS endpoint.\n", + "additionalProperties": { + "type": "object", + "properties": {} + } + } + } + }, + "v1.skill.simulations.InvocationResponse": { + "type": "object", + "properties": { + "body": { + "type": "object", + "description": "Payload that was returned by the skill's Lambda or HTTPS endpoint.\n", + "additionalProperties": { + "type": "object", + "properties": {} + } + } + } + }, + "v1.skill.simulations.Metrics": { + "type": "object", + "properties": { + "skillExecutionTimeInMilliseconds": { + "type": "integer", + "description": "How long, in milliseconds, it took the skill's Lambda or HTTPS endpoint to process the request.\n" + } + } + }, + "v1.skill.validations.ValidationsApiRequest": { + "type": "object", + "required": [ + "locales" + ], + "properties": { + "locales": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "v1.skill.validations.ValidationsApiResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Id of the validation resource." + }, + "status": { + "$ref": "#/definitions/v1.skill.validations.ValidationsApiResponseStatus", + "x-isEnum": true + }, + "result": { + "$ref": "#/definitions/v1.skill.validations.ValidationsApiResponseResult" + } + } + }, + "v1.skill.validations.ValidationsApiResponseStatus": { + "type": "string", + "description": "String that specifies the current status of validation execution. Possible values are \"IN_PROGRESS\", \"SUCCESSFUL\", and \"FAILED\".\n", + "enum": [ + "IN_PROGRESS", + "SUCCESSFUL", + "FAILED" + ] + }, + "v1.skill.validations.ValidationsApiResponseResult": { + "type": "object", + "properties": { + "validations": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.validations.ResponseValidation" + } + }, + "error": { + "$ref": "#/definitions/v1.Error" + } + } + }, + "v1.skill.validations.ResponseValidation": { + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Short, human readable title of the validation performed.\n" + }, + "description": { + "type": "string", + "description": "Human readable description of the validation performed. May include instructions to address validation failure.\n" + }, + "category": { + "type": "string", + "description": "Dot-delimited category.\n" + }, + "locale": { + "type": "string", + "description": "Locale of the validation.\n" + }, + "importance": { + "$ref": "#/definitions/v1.skill.validations.ResponseValidationImportance", + "x-isEnum": true + }, + "status": { + "$ref": "#/definitions/v1.skill.validations.ResponseValidationStatus", + "x-isEnum": true + } + } + }, + "v1.skill.validations.ResponseValidationImportance": { + "type": "string", + "description": "String that specifies importance of the validation. Possible values are \"REQUIRED\" and \"RECOMMENDED\"\n", + "enum": [ + "REQUIRED", + "RECOMMENDED" + ] + }, + "v1.skill.validations.ResponseValidationStatus": { + "type": "string", + "description": "String that specifies status of the validation. Possible values are \"SUCCESSFUL\" and \"FAILED\"\n", + "enum": [ + "SUCCESSFUL", + "FAILED" + ] + }, + "v1.skill.createSkillRequest": { + "type": "object", + "properties": { + "vendorId": { + "type": "string", + "description": "ID of the vendor owning the skill." + }, + "manifest": { + "$ref": "#/definitions/v1.skill.Manifest.SkillManifest" + }, + "hosting": { + "$ref": "#/definitions/v1.skill.AlexaHosted.HostingConfiguration" + } + } + }, + "v1.skill.ListSkillResponse": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "skills": { + "type": "array", + "description": "List of skill summaries. List might contain either one, two or three entries for a given skillId depending on the skill's publication history and the publication method.\n`Skill containing certified stage`\n* If a skill was never published to live, this list will contain two entries `:` one with stage 'development' and another with stage 'certified'. Both of these summaries will have same skillId.\n* For any skill that has been published to 'live', this list will contain three entries `:` one with stage 'development', one with stage `certified` and one with stage 'live'. All of these summaries will have same skillId.\n`Skill without certified stage`\n* If a skill was never published to live, this list will contain only one entry for the skill with stage as 'development'.\n* For any skill that has been published to 'live', this list will contain two entries `:` one with stage 'development' and another with stage 'live'. Both of these summaries will have same skillId.\n", + "items": { + "$ref": "#/definitions/v1.skill.SkillSummary" + } + }, + "isTruncated": { + "type": "boolean" + }, + "nextToken": { + "type": "string" + } + }, + "description": "List of skills for the vendor." + }, + "v1.skill.ListSkillVersionsResponse": { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "skillVersions": { + "type": "array", + "description": "Skill version metadata", + "items": { + "$ref": "#/definitions/v1.skill.SkillVersion" + } + }, + "isTruncated": { + "type": "boolean" + }, + "nextToken": { + "type": "string" + } + }, + "description": "List of all skill versions" + }, + "v1.skill.SkillVersion": { + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "message": { + "type": "string", + "description": "Description of the version (limited to 300 characters).\n", + "minLength": 1, + "maxLength": 300 + }, + "creationTime": { + "type": "string", + "format": "date-time" + }, + "submissions": { + "type": "array", + "description": "List of submissions for the skill version\n", + "items": { + "$ref": "#/definitions/v1.skill.VersionSubmission" + } + } + }, + "description": "Information about the skill version" + }, + "v1.skill.VersionSubmission": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.VersionSubmissionStatus", + "x-isEnum": true + }, + "submissionTime": { + "type": "string", + "format": "date-time" + } + }, + "description": "Submission for a skill version\n" + }, + "v1.skill.VersionSubmissionStatus": { + "type": "string", + "description": "The lifecycle status of the skill version submission.\n* `LIVE` - The skill version is in the live stage\n* `CERTIFIED` - The skill version has gone through the certification review process and has been certified.\n* `IN_REVIEW` - The skill version is currently under review for certification and publication. During this time, you cannot edit the configuration.\n* `FAILED_CERTIFICATION` - The skill version has been submitted for certification, however it has failed certification review. Please submit a new version for certification.\n* `HIDDEN` - The skill version has been published but is no longer available to new users for activation. Existing users can still invoke this skill if it is the most recent version.\n* `REMOVED` - The skill version has been published but removed for use, due to Amazon's policy violation. You can update your skill and publish a new version to live to address the policy violation.\n* `WITHDRAWN_FROM_CERTIFICATION` - The skill version was submitted for certification but was withdrawn from review.\n", + "enum": [ + "LIVE", + "CERTIFIED", + "IN_REVIEW", + "FAILED_CERTIFICATION", + "HIDDEN", + "REMOVED", + "WITHDRAWN_FROM_CERTIFICATION" + ] + }, + "v1.skill.SkillSummary": { + "type": "object", + "properties": { + "skillId": { + "type": "string" + }, + "stage": { + "$ref": "#/definitions/v1.StageV2Type", + "x-isEnum": true + }, + "apis": { + "type": "array", + "description": "List of APIs currently implemented by the skill.", + "items": { + "$ref": "#/definitions/v1.skill.SkillSummaryApis" + } + }, + "publicationStatus": { + "$ref": "#/definitions/v1.skill.PublicationStatus", + "x-isEnum": true + }, + "lastUpdated": { + "type": "string", + "format": "date-time" + }, + "nameByLocale": { + "type": "object", + "description": "Name of the skill in skill locales (keys are locale names (e.g. 'en-US') whereas values are name of the\nskill in that locale.\n", + "additionalProperties": { + "type": "string" + } + }, + "asin": { + "type": "string", + "description": "Amazon Standard Identification Number (ASIN) is unique blocks of 10 letters and/or numbers that identify items. More info about ASIN can be found here: https://www.amazon.com/gp/seller/asin-upc-isbn-info.html\nASIN is available for those skills only, that have been published, at least once.\n" + }, + "_links": { + "$ref": "#/definitions/v1.Links" + } + }, + "description": "Information about the skills." + }, + "v1.skill.PublicationStatus": { + "type": "string", + "description": "Publication status of the skill.\nIt is associated with the skill's stage. Skill in 'development' stage can have publication status as 'DEVELOPMENT' or 'CERTIFICATION'. Skill in 'certified' stage can have publication status as 'CERTIFIED'. 'Skill in 'live' stage can have publication status as 'PUBLISHED', 'HIDDEN' or 'REMOVED'.\n* `DEVELOPMENT` - The skill is available only to you. If you have enabled it for testing, you can test it on devices registered to your developer account.\n* `CERTIFICATION` - Amazon is currently reviewing the skill for publication. During this time, you cannot edit the configuration.\n* `CERTIFIED` - The skill has been certified and ready to be published. Skill can be either published immediately or an future release date can be set for the skill. You cannot edit the configuration for the certified skills. To start development, make your changes on the development version.\n* `PUBLISHED` - The skill has been published and is available to users. You cannot edit the configuration for live skills. To start development on an updated version, make your changes on the development version instead.\n* `HIDDEN` - The skill has been published but is no longer available to new users for activation. Existing users can still invoke this skill.\n* `REMOVED` - The skill has been published but removed for use, due to Amazon's policy violation. You can update your skill and publish a new version to live to address the policy violation.\n", + "enum": [ + "DEVELOPMENT", + "CERTIFICATION", + "CERTIFIED", + "PUBLISHED", + "HIDDEN", + "REMOVED" + ] + }, + "v1.skill.SkillSummaryApis": { + "type": "string", + "enum": [ + "custom", + "smartHome", + "flashBriefing", + "video", + "music", + "householdList", + "health", + "alexaForBusiness", + "demandResponse" + ] + }, + "v1.skill.CreateSkillResponse": { + "type": "object", + "properties": { + "skillId": { + "type": "string", + "description": "ID of the skill created." + } + }, + "description": "SkillId information." + }, + "v1.skill.SSLCertificatePayload": { + "type": "object", + "properties": { + "sslCertificate": { + "type": "string", + "description": "The default ssl certificate for the skill. If a request is made for a region without an explicit ssl certificate, this certificate will be used." + }, + "regions": { + "type": "object", + "description": "A map of region to ssl certificate. Keys are string region codes (https://developer.amazon.com/docs/smapi/skill-manifest.html#regions), values are regional ssl certificate objects which contain the ssl certificate blobs as strings.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.RegionalSSLCertificate" + } + } + } + }, + "v1.skill.RegionalSSLCertificate": { + "type": "object", + "properties": { + "sslCertificate": { + "type": "string" + } + } + }, + "v1.skill.SkillStatus": { + "type": "object", + "properties": { + "manifest": { + "$ref": "#/definitions/v1.skill.ManifestStatus" + }, + "interactionModel": { + "type": "object", + "description": "Status for available interaction models, keyed by locale.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.SkillInteractionModelStatus" + } + }, + "hostedSkillDeployment": { + "$ref": "#/definitions/v1.skill.HostedSkillDeploymentStatus" + }, + "hostedSkillProvisioning": { + "$ref": "#/definitions/v1.skill.HostedSkillProvisioningStatus" + } + }, + "description": "Defines the structure for skill status response." + }, + "v1.skill.skillResourcesEnum": { + "type": "object", + "enum": [ + "manifest", + "interactionModel", + "hostedSkillDeployment", + "hostedSkillProvisioning" + ] + }, + "v1.skill.ManifestStatus": { + "type": "object", + "properties": { + "lastUpdateRequest": { + "$ref": "#/definitions/v1.skill.ManifestLastUpdateRequest" + }, + "eTag": { + "type": "string", + "description": "An opaque identifier for last successfully updated resource." + } + }, + "description": "Defines the structure for a resource status." + }, + "v1.skill.ManifestLastUpdateRequest": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.Status", + "x-isEnum": true + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "warnings": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "version": { + "type": "string", + "description": "on success, this field indicates the created version." + } + }, + "description": "Contains attributes related to last modification (create/update) request of a resource." + }, + "v1.skill.SkillInteractionModelStatus": { + "type": "object", + "properties": { + "lastUpdateRequest": { + "$ref": "#/definitions/v1.skill.InteractionModelLastUpdateRequest" + }, + "eTag": { + "type": "string", + "description": "An opaque identifier for last successfully updated resource." + }, + "version": { + "type": "string", + "description": "Version for last successfully built model." + } + }, + "description": "Defines the structure for interaction model build status." + }, + "v1.skill.InteractionModelLastUpdateRequest": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.Status", + "x-isEnum": true + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "warnings": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "buildDetails": { + "$ref": "#/definitions/v1.skill.BuildDetails" + } + }, + "description": "Contains attributes related to last modification (create/update) request of a resource." + }, + "v1.skill.HostedSkillDeploymentStatus": { + "type": "object", + "properties": { + "lastUpdateRequest": { + "$ref": "#/definitions/v1.skill.HostedSkillDeploymentStatusLastUpdateRequest" + } + }, + "description": "Defines the most recent deployment status for the Alexa hosted skill." + }, + "v1.skill.HostedSkillDeploymentStatusLastUpdateRequest": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.Status", + "x-isEnum": true + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "warnings": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "deploymentDetails": { + "$ref": "#/definitions/v1.skill.HostedSkillDeploymentDetails" + } + }, + "description": "Contains attributes related to last modification request of a hosted skill deployment resource." + }, + "v1.skill.HostedSkillDeploymentDetails": { + "type": "object", + "properties": { + "commitId": { + "type": "string" + }, + "logUrl": { + "type": "string" + } + }, + "description": "Details about hosted skill deployment." + }, + "v1.skill.HostedSkillProvisioningStatus": { + "type": "object", + "properties": { + "lastUpdateRequest": { + "$ref": "#/definitions/v1.skill.HostedSkillProvisioningLastUpdateRequest" + } + }, + "description": "Defines the provisioning status for hosted skill." + }, + "v1.skill.HostedSkillProvisioningLastUpdateRequest": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.Status", + "x-isEnum": true + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "warnings": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "description": "Contains attributes related to last modification request of a hosted skill provisioning resource." + }, + "v1.skill.BuildDetails": { + "type": "object", + "properties": { + "steps": { + "type": "array", + "description": "An array where each element represents a build step.", + "items": { + "$ref": "#/definitions/v1.skill.BuildStep" + } + } + }, + "description": "Contains array which describes steps involved in a build. Elements (or build steps) are added\nto this array as they become IN_PROGRESS.\n" + }, + "v1.skill.BuildStep": { + "type": "object", + "properties": { + "name": { + "$ref": "#/definitions/v1.skill.BuildStepName", + "x-isEnum": true + }, + "status": { + "$ref": "#/definitions/v1.skill.Status", + "x-isEnum": true + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "description": "Describes the status of a build step." + }, + "v1.skill.BuildStepName": { + "type": "string", + "description": "Name of the build step. Possible values -\n* `DIALOG_MODEL_BUILD` - Build status for dialog model.\n* `LANGUAGE_MODEL_QUICK_BUILD` - Build status for FST model.\n* `LANGUAGE_MODEL_FULL_BUILD` - Build status for statistical model.\n* `ALEXA_CONVERSATIONS_QUICK_BUILD` - AlexaConversations LowFidelity model build status.\n* `ALEXA_CONVERSATIONS_FULL_BUILD` - AlexaConversations HighFidelity model build status.\n", + "enum": [ + "DIALOG_MODEL_BUILD", + "LANGUAGE_MODEL_QUICK_BUILD", + "LANGUAGE_MODEL_FULL_BUILD", + "ALEXA_CONVERSATIONS_QUICK_BUILD", + "ALEXA_CONVERSATIONS_FULL_BUILD" + ] + }, + "v1.skill.Status": { + "type": "string", + "description": "Status of a resource.", + "enum": [ + "FAILED", + "IN_PROGRESS", + "SUCCEEDED" + ] + }, + "v1.skill.SkillCredentials": { + "type": "object", + "properties": { + "skillMessagingCredentials": { + "$ref": "#/definitions/v1.skill.SkillMessagingCredentials" + } + }, + "description": "Structure for skill credentials response." + }, + "v1.skill.SkillMessagingCredentials": { + "type": "object", + "properties": { + "clientId": { + "type": "string", + "description": "The client id for the security profile." + }, + "clientSecret": { + "type": "string", + "description": "The client secret for the security profile." + } + }, + "description": "Defines the structure for skill messaging credentials." + }, + "v1.skill.SubmitSkillForCertificationRequest": { + "type": "object", + "properties": { + "publicationMethod": { + "$ref": "#/definitions/v1.skill.PublicationMethod", + "x-isEnum": true + }, + "versionMessage": { + "type": "string", + "description": "Description of the version (limited to 300 characters)." + } + } + }, + "v1.skill.PublicationMethod": { + "type": "string", + "description": "Determines if the skill should be submitted only for certification and manually publish later or publish immediately after the skill is certified. Omitting the publication method will default to auto publishing.", + "enum": [ + "MANUAL_PUBLISHING", + "AUTO_PUBLISHING" + ] + }, + "v1.skill.WithdrawRequest": { + "type": "object", + "required": [ + "reason" + ], + "properties": { + "reason": { + "$ref": "#/definitions/v1.skill.Reason", + "x-isEnum": true + }, + "message": { + "type": "string", + "description": "The message only in case the reason in OTHER." + } + }, + "description": "The payload for the withdraw operation." + }, + "v1.skill.Reason": { + "type": "string", + "description": "The reason to withdraw.", + "enum": [ + "TEST_SKILL", + "MORE_FEATURES", + "DISCOVERED_ISSUE", + "NOT_RECEIVED_CERTIFICATION_FEEDBACK", + "NOT_INTEND_TO_PUBLISH", + "OTHER" + ] + }, + "v1.skill.createSkillWithPackageRequest": { + "type": "object", + "required": [ + "location" + ], + "properties": { + "vendorId": { + "type": "string", + "description": "ID of the vendor owning the skill.", + "minLength": 1, + "maxLength": 255 + }, + "location": { + "type": "string", + "format": "uri", + "description": "The URL for the skill package." + } + } + }, + "v1.skill.updateSkillWithPackageRequest": { + "type": "object", + "required": [ + "location" + ], + "properties": { + "location": { + "type": "string", + "format": "uri", + "description": "The URL for the skill package." + } + } + }, + "v1.skill.ImportResponse": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.ResponseStatus", + "x-isEnum": true + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "warnings": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "skill": { + "$ref": "#/definitions/v1.skill.ImportResponseSkill" + } + } + }, + "v1.skill.ResponseStatus": { + "type": "string", + "description": "Status for a Response resource.", + "enum": [ + "FAILED", + "IN_PROGRESS", + "SUCCEEDED", + "ROLLBACK_SUCCEEDED", + "ROLLBACK_FAILED", + "SKIPPED" + ] + }, + "v1.skill.ImportResponseSkill": { + "type": "object", + "required": [ + "resources" + ], + "properties": { + "skillId": { + "type": "string" + }, + "eTag": { + "type": "string" + }, + "resources": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.ResourceImportStatus" + } + } + } + }, + "v1.skill.ResourceImportStatus": { + "type": "object", + "required": [ + "status" + ], + "properties": { + "name": { + "type": "string", + "description": "Resource name. eg. manifest, interactionModels.en_US and so on." + }, + "status": { + "$ref": "#/definitions/v1.skill.ResponseStatus", + "x-isEnum": true + }, + "action": { + "$ref": "#/definitions/v1.skill.Action", + "x-isEnum": true + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "warnings": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "description": "Defines the structure for a resource deployment status." + }, + "v1.skill.Action": { + "type": "string", + "description": "Action of a resource.", + "enum": [ + "CREATE", + "UPDATE", + "ASSOCIATE", + "DISASSOCIATE" + ] + }, + "v1.skill.UploadResponse": { + "type": "object", + "properties": { + "uploadUrl": { + "type": "string", + "description": "The upload URL to upload a skill package." + }, + "expiresAt": { + "type": "string", + "format": "date-time", + "description": "The expiration time of the URL" + } + }, + "description": "Defines the structure for skill upload response." + }, + "v1.skill.ExportResponse": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.ResponseStatus", + "x-isEnum": true + }, + "skill": { + "$ref": "#/definitions/v1.skill.ExportResponseSkill" + } + } + }, + "v1.skill.ExportResponseSkill": { + "type": "object", + "properties": { + "eTag": { + "type": "string" + }, + "location": { + "type": "string", + "format": "uri" + }, + "expiresAt": { + "type": "string", + "description": "ExpiresAt timestamp in milliseconds." + } + }, + "description": "Defines the structure of the GetExport response." + }, + "v1.skill.StandardizedError": { + "type": "object", + "properties": { + "validationDetails": { + "description": "Standardized, machine readable structure that wraps all the information about a specific occurrence of an error of the type specified by the code.", + "$ref": "#/definitions/v1.skill.validationDetails" + } + }, + "description": "Standardized structure which wraps machine parsable and human readable information about an error.", + "x-inheritsFrom": "v1.Error" + }, + "v1.skill.validationDetails": { + "type": "object", + "properties": { + "actualImageAttributes": { + "description": "Set of properties of the image provided by the customer.", + "$ref": "#/definitions/v1.skill.imageAttributes" + }, + "actualNumberOfItems": { + "type": "integer", + "description": "Number of items in an array provided by the customer." + }, + "actualStringLength": { + "type": "integer", + "description": "Number of characters in a string provided by the customer." + }, + "allowedContentTypes": { + "type": "array", + "description": "List of allowed content types for a resource.", + "items": { + "type": "string", + "description": "Allowed content type in IANA media type format." + } + }, + "allowedDataTypes": { + "type": "array", + "description": "List of allowed data types for an instance.", + "items": { + "description": "Allowed data type.", + "$ref": "#/definitions/v1.skill.ValidationDataTypes" + } + }, + "allowedImageAttributes": { + "type": "array", + "description": "List of set of properties representing all possible allowed images.", + "items": { + "description": "Set of properties of the image provided by the customer.", + "$ref": "#/definitions/v1.skill.imageAttributes" + } + }, + "conflictingInstance": { + "description": "Instance conflicting with another instance.", + "$ref": "#/definitions/v1.skill.Instance" + }, + "expectedFormat": { + "description": "Format in which instance value is expected in.", + "$ref": "#/definitions/v1.skill.Format", + "x-isEnum": true + }, + "expectedInstance": { + "description": "Instance that is expected by a related instance.", + "$ref": "#/definitions/v1.skill.Instance" + }, + "expectedRegexPattern": { + "type": "string", + "description": "Regular expression that a string instance is expected to match." + }, + "agreementType": { + "description": "Type of the agreement that the customer must be compliant to.", + "$ref": "#/definitions/v1.skill.AgreementType", + "x-isEnum": true + }, + "feature": { + "description": "Properties of a publicly known feature that has restricted access.", + "$ref": "#/definitions/v1.skill.ValidationFeature" + }, + "inconsistentEndpoint": { + "description": "Endpoint which has a different value for property named type when compared to original endpoint.", + "$ref": "#/definitions/v1.skill.ValidationEndpoint" + }, + "minimumIntegerValue": { + "type": "integer", + "description": "Minimum allowed value of an integer instance." + }, + "minimumNumberOfItems": { + "type": "integer", + "description": "Minimum allowed number of items in an array." + }, + "minimumStringLength": { + "type": "integer", + "description": "Minimum allowed number of characters in a string." + }, + "maximumIntegerValue": { + "type": "integer", + "description": "Maximum allowed value of an integer instance." + }, + "maximumNumberOfItems": { + "type": "integer", + "description": "Maximum allowed number of items in an array." + }, + "maximumStringLength": { + "type": "integer", + "description": "Maximum allowed number of characters in a string." + }, + "originalEndpoint": { + "description": "An Endpoint instance", + "$ref": "#/definitions/v1.skill.ValidationEndpoint" + }, + "originalInstance": { + "description": "An Instance", + "$ref": "#/definitions/v1.skill.Instance" + }, + "reason": { + "description": "Represents what is wrong in the request.", + "$ref": "#/definitions/v1.skill.ValidationFailureReason" + }, + "requiredProperty": { + "type": "string", + "description": "Property required but missing in the object." + }, + "unexpectedProperty": { + "type": "string", + "description": "Property not expected but present in the object." + } + }, + "description": "Standardized, machine readable structure that wraps all the information about a specific occurrence of an error of the type specified by the code." + }, + "v1.skill.imageAttributes": { + "type": "object", + "properties": { + "dimension": { + "$ref": "#/definitions/v1.skill.ImageDimension" + }, + "size": { + "$ref": "#/definitions/v1.skill.ImageSize" + }, + "maximumSize": { + "$ref": "#/definitions/v1.skill.ImageSize" + } + }, + "description": "Set of properties of the image provided by the customer." + }, + "v1.skill.ImageDimension": { + "type": "object", + "properties": { + "widthInPixels": { + "type": "integer", + "description": "Width of the image in pixels." + }, + "heightInPixels": { + "type": "integer", + "description": "Height of the image in pixels." + } + }, + "description": "Dimensions of an image." + }, + "v1.skill.ImageSize": { + "type": "object", + "properties": { + "value": { + "type": "number", + "description": "Value measuring the size of the image." + }, + "unit": { + "$ref": "#/definitions/v1.skill.ImageSizeUnit", + "x-isEnum": true + } + }, + "description": "On disk storage size of image." + }, + "v1.skill.ImageSizeUnit": { + "type": "string", + "description": "Unit of measurement for size of image.", + "enum": [ + "MB" + ] + }, + "v1.skill.ValidationDataTypes": { + "type": "string", + "enum": [ + "object", + "boolean", + "integer", + "array", + "string", + "null" + ] + }, + "v1.skill.Instance": { + "type": "object", + "properties": { + "propertyPath": { + "type": "string", + "description": "Path that uniquely identifies the instance in the resource." + }, + "dataType": { + "$ref": "#/definitions/v1.skill.ValidationDataTypes", + "x-isEnum": true + }, + "value": { + "type": "string", + "description": "String value of the instance. Incase of null, object or array the value field would be null or not present. Incase of string, boolean or integer dataType it will be the corresponding String value." + } + }, + "description": "Structure representing properties of an instance of data. Definition will be either one of a booleanInstance, stringInstance, integerInstance, or compoundInstance." + }, + "v1.skill.AgreementType": { + "type": "string", + "description": "Type of the agreement that the customer must be compliant to.", + "enum": [ + "EXPORT_COMPLIANCE" + ] + }, + "v1.skill.ValidationFeature": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the feature." + }, + "contact": { + "type": "string", + "description": "Contact URL or email for the feature." + } + }, + "description": "Structure representing a public feature." + }, + "v1.skill.ValidationEndpoint": { + "type": "object", + "properties": { + "propertyPath": { + "type": "string", + "description": "Path to the endpoint URI in the resource." + }, + "type": { + "type": "string", + "description": "Type of the endpoint (https, http, arn etc)." + }, + "value": { + "type": "string", + "description": "Full URI of the endpoint." + } + }, + "description": "Structure representing an endpoint." + }, + "v1.skill.Format": { + "type": "string", + "description": "Format in which instance value is expected in.", + "enum": [ + "URI" + ] + }, + "v1.skill.ValidationFailureReason": { + "type": "object", + "properties": { + "type": { + "description": "Enum for type of validation failure in the request.", + "$ref": "#/definitions/v1.skill.ValidationFailureType", + "x-isEnum": true + } + }, + "description": "Object representing what is wrong in the request." + }, + "v1.skill.ValidationFailureType": { + "type": "string", + "description": "Enum for type of validation failure in the request.", + "enum": [ + "RESOURCE_DOES_NOT_EXIST", + "RESOURCE_VERSION_DOES_NOT_MATCH", + "MALFORMED_INPUT", + "EXPECTED_NOT_EMPTY_VALUE", + "INVALID_NUMBER_OF_OCCURENCES", + "INVALID_NUMBER_OF_PROPERTIES", + "EXPECTED_ATLEAST_ONE_RELATED_INSTANCE", + "EXPECTED_EXACTLY_ONE_RELATED_INSTANCE", + "RESOURCE_LOCKED", + "UNEXPECTED_RESOURCE_STAGE", + "UNEXPECTED_RESOURCE_PROPERTY", + "MISSING_RESOURCE_PROPERTY" + ] + }, + "v1.skill.CreateRollbackRequest": { + "type": "object", + "required": [ + "targetVersion" + ], + "properties": { + "targetVersion": { + "type": "string", + "description": "The target skill version to rollback to." + } + }, + "description": "Defines the request body to create a rollback request" + }, + "v1.skill.CreateRollbackResponse": { + "type": "object", + "properties": { + "rollbackRequestId": { + "type": "string", + "description": "Defines the identifier for a rollback request." + } + }, + "description": "Defines the response body when a rollback request is created" + }, + "v1.skill.RollbackRequestStatus": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "rollback request id" + }, + "targetVersion": { + "type": "string", + "description": "The target skill version to rollback to." + }, + "submissionTime": { + "type": "string", + "format": "date-time" + }, + "status": { + "$ref": "#/definitions/v1.skill.RollbackRequestStatusTypes", + "x-isEnum": true + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "description": "Rollback request for a skill" + }, + "v1.skill.RollbackRequestStatusTypes": { + "type": "string", + "description": "The rollback status of the rollback request.\n* `FAILED` - The rollback has failed. Please retry the rollback.\n* `INELIGIBLE` - The target version is ineligible for rollback.\n* `IN_PROGRESS` - The rollback is in progress.\n* `SUCCEEDED` - The rollback has succeeded.\n", + "enum": [ + "FAILED", + "INELIGIBLE", + "IN_PROGRESS", + "SUCCEEDED" + ] + }, + "v1.skill.CloneLocaleStatusResponse": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.CloneLocaleRequestStatus", + "x-isEnum": true + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + }, + "sourceLocale": { + "type": "string", + "description": "Source locale which is cloned to target locales." + }, + "targetLocales": { + "type": "object", + "description": "Mapping of statuses per locale.", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.CloneLocaleResourceStatus" + } + } + }, + "description": "A mapping of statuses per locale detailing progress of resource or error if encountered." + }, + "v1.skill.CloneLocaleResourceStatus": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.CloneLocaleStatus", + "x-isEnum": true + }, + "errors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.StandardizedError" + } + } + }, + "description": "an object detailing the status of a locale clone request and if applicable the errors occurred when saving/building resources during clone process." + }, + "v1.skill.CloneLocaleStatus": { + "type": "string", + "description": "Status for a locale clone on a particular target locale\n * `IN_PROGRESS` status would indicate the clone is still in progress to the target locale.\n * `SUCCEEDED` status would indicate the source locale was cloned successfully to the target locale.\n * `INELIGIBLE` status would indicate the source locale was ineligible to be cloned the target locale.\n * `FAILED` status would indicate the source locale was not cloned the target locale successfully.\n * `ROLLBACK_SUCCEEDED` status would indicate the locale was rolled back to the previous state in case any failure.\n * `ROLLBACK_FAILED` status would indicate that in case of failure, the rollback to the previous state of the locale was attempted, but it failed.\n", + "enum": [ + "FAILED", + "INELIGIBLE", + "IN_PROGRESS", + "ROLLBACK_FAILED", + "ROLLBACK_SUCCEEDED", + "SUCCEEDED" + ] + }, + "v1.skill.CloneLocaleRequestStatus": { + "type": "string", + "description": "Status for a locale clone request\nCloneLocale API initiates cloning from a source locale to all target locales.\n * `IN_PROGRESS` status would indicate the clone is still in progress.\n * `SUCCEEDED` status would indicate the source locale was cloned successfully to all target locales.\n * `INELIGIBLE` status would indicate the source locale was ineligible to be cloned to all target locales.\n * `MIXED` status would indicate the different status of clone on different locales, and individual target locale statues should be checked.\n * `FAILED` status would indicate the source locale was not cloned all target locales successfully despite the request being eligible due to internal service issues.\n * `ROLLBACK_SUCCEEDED` status would indicate the skill was rolled back to the previous state in case any failure.\n * `ROLLBACK_FAILED` status would indicate that in case of failure, the rollback to the previous state of the skill was attempted, but it failed.\n", + "enum": [ + "FAILED", + "INELIGIBLE", + "IN_PROGRESS", + "MIXED", + "ROLLBACK_FAILED", + "ROLLBACK_SUCCEEDED", + "SUCCEEDED" + ] + }, + "v1.skill.CloneLocaleRequest": { + "type": "object", + "required": [ + "sourceLocale", + "targetLocales" + ], + "properties": { + "sourceLocale": { + "type": "string", + "description": "Locale with the assets that will be cloned." + }, + "targetLocales": { + "type": "array", + "description": "A list of locale(s) where the assets will be copied to.", + "items": { + "type": "string" + } + }, + "overwriteMode": { + "description": "Can locale of skill be overwritten. Default value is DO_NOT_OVERWRITE.", + "$ref": "#/definitions/v1.skill.OverwriteMode", + "x-isEnum": true + } + }, + "description": "Defines the request body for the cloneLocale API." + }, + "v1.skill.OverwriteMode": { + "type": "string", + "description": "Can locale of skill be overwritten. Default value is DO_NOT_OVERWRITE.", + "enum": [ + "DO_NOT_OVERWRITE", + "OVERWRITE" + ] + }, + "v1.skill.CloneLocaleStageType": { + "type": "string", + "enum": [ + "development" + ] + }, + "v1.vendorManagement.Vendors": { + "type": "object", + "properties": { + "vendors": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.vendorManagement.Vendor" + } + } + }, + "description": "List of Vendors." + }, + "v1.vendorManagement.Vendor": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of vendor." + }, + "id": { + "type": "string", + "description": "Unique identifier of vendor associated with the API caller account." + }, + "roles": { + "type": "array", + "description": "Roles that user has for this vendor.", + "items": { + "type": "string" + } + } + }, + "description": "Vendor Response Object." + }, + "v1.auditLogs.RequestFilters": { + "type": "object", + "properties": { + "clients": { + "type": "array", + "description": "List of Client IDs for filtering.", + "items": { + "$ref": "#/definitions/v1.auditLogs.ClientFilter" + } + }, + "operations": { + "type": "array", + "description": "Filters for a list of operation names and versions.", + "items": { + "$ref": "#/definitions/v1.auditLogs.OperationFilter" + } + }, + "resources": { + "type": "array", + "description": "Filters for a list of resources and/or their types. See documentation for allowed types.", + "items": { + "$ref": "#/definitions/v1.auditLogs.ResourceFilter" + } + }, + "requesters": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.auditLogs.RequesterFilter" + } + }, + "startTime": { + "type": "string", + "format": "date-time", + "description": "Sets the start time for this search. Any audit logs with timestamps after this time (inclusive) will be included in the response." + }, + "endTime": { + "type": "string", + "format": "date-time", + "description": "Sets the end time for this search. Any audit logs with timestamps before this time (exclusive) will be included in the result." + }, + "httpResponseCodes": { + "type": "array", + "description": "Filters for HTTP response codes. For example, '200' or '503'", + "items": { + "type": "string" + } + } + }, + "description": "Request Filters for filtering audit logs." + }, + "v1.auditLogs.ClientFilter": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "UUID" + } + }, + "description": "Identifier for the application the developer used to manage their skills and skill-related resources. For OAuth applications, this is the OAuth Client Id." + }, + "v1.auditLogs.OperationFilter": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "description": "Name and version of the operation that the developer performed. For example, 'deleteSkill' and 'v1'. This is the same name used in the SMAPI SDK." + }, + "v1.auditLogs.ResourceFilter": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "UUID" + }, + "type": { + "$ref": "#/definitions/v1.auditLogs.ResourceTypeEnum", + "x-isEnum": true + } + }, + "description": "Resource that the developer operated on. Both do not need to be provided." + }, + "v1.auditLogs.ResourceTypeEnum": { + "type": "string", + "enum": [ + "Skill", + "SkillCatalog", + "InSkillProduct", + "Import", + "Export" + ] + }, + "v1.auditLogs.RequesterFilter": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "LoginWithAmazon User ID." + } + }, + "description": "Filter for the requester of the operation." + }, + "v1.auditLogs.SortDirection": { + "type": "string", + "description": "Sets the sorting direction of the result items. When set to 'ASC' these items are returned in ascending order of sortField value and when set to 'DESC' these items are returned in descending order of sortField value.", + "enum": [ + "ASC", + "DESC" + ], + "default": "DESC" + }, + "v1.auditLogs.SortField": { + "type": "string", + "description": "Sets the field on which the sorting would be applied.", + "enum": [ + "timestamp", + "operation", + "resource.id", + "resource.type", + "requester.userId", + "client.id", + "httpResponseCode" + ], + "default": "timestamp" + }, + "v1.auditLogs.RequestPaginationContext": { + "type": "object", + "properties": { + "nextToken": { + "type": "string", + "description": "When the response to this API call is truncated, the response includes the nextToken element. The value of nextToken can be used in the next request as the continuation-token to list the next set of objects. The continuation token is an opaque value that this API understands. Token has expiry of 1 hour.", + "minLength": 1, + "maxLength": 2047 + }, + "maxResults": { + "type": "integer", + "description": "Sets the maximum number of results returned in the response body. If you want to retrieve more or less than the default of 50 results, you can add this parameter to your request. maxResults can exceed the upper limit of 250 but we will not return more items than that. The response might contain fewer results than maxResults for purpose of keeping SLA or because there are not enough items, but it will never contain more.", + "minimum": 1, + "maximum": 200 + } + }, + "description": "This object includes nextToken and maxResults." + }, + "v1.auditLogs.AuditLogsResponse": { + "type": "object", + "properties": { + "paginationContext": { + "$ref": "#/definitions/v1.auditLogs.ResponsePaginationContext" + }, + "_links": { + "$ref": "#/definitions/v1.Links" + }, + "auditLogs": { + "type": "array", + "description": "List of audit logs for the vendor.", + "items": { + "$ref": "#/definitions/v1.auditLogs.AuditLog" + } + } + }, + "description": "Response to the Query Audit Logs API. It contains the collection of audit logs for the vendor, nextToken and other metadata related to the search query." + }, + "v1.auditLogs.ResponsePaginationContext": { + "type": "object", + "properties": { + "nextToken": { + "type": "string", + "description": "This token can be used to load the next page of the result.", + "minLength": 1, + "maxLength": 2047 + } + }, + "description": "This object contains the next token used to load the next page of the result." + }, + "v1.auditLogs.AuditLog": { + "type": "object", + "properties": { + "xAmznRequestId": { + "type": "string", + "format": "UUID", + "description": "UUID that identifies a specific request." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Date-Time when the request was made." + }, + "client": { + "$ref": "#/definitions/v1.auditLogs.Client" + }, + "operation": { + "$ref": "#/definitions/v1.auditLogs.Operation" + }, + "resources": { + "type": "array", + "description": "Contains information about the resources affected in this request.", + "items": { + "$ref": "#/definitions/v1.auditLogs.Resource" + } + }, + "requester": { + "$ref": "#/definitions/v1.auditLogs.Requester" + }, + "httpResponseCode": { + "type": "integer", + "description": "HTTP Status Code returned by this request." + } + } + }, + "v1.auditLogs.Client": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "description": "Contains information about the Client that this request was performed by." + }, + "v1.auditLogs.Operation": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "description": "Object containing name and version." + }, + "v1.auditLogs.Resource": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "UUID" + }, + "type": { + "type": "string" + } + }, + "description": "Resource that the developer operated on. This includes both the type and ID of the resource." + }, + "v1.auditLogs.Requester": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "LWA User ID. https://developer.amazon.com/docs/login-with-amazon/obtain-customer-profile.html" + } + }, + "description": "The user that performed the operation." + }, + "v1.auditLogs.AuditLogsRequest": { + "type": "object", + "required": [ + "vendorId" + ], + "properties": { + "vendorId": { + "type": "string", + "description": "Vendor Id. See developer.amazon.com/mycid.html.", + "minLength": 1, + "maxLength": 255 + }, + "requestFilters": { + "$ref": "#/definitions/v1.auditLogs.RequestFilters" + }, + "sortDirection": { + "$ref": "#/definitions/v1.auditLogs.SortDirection", + "x-isEnum": true + }, + "sortField": { + "$ref": "#/definitions/v1.auditLogs.SortField", + "x-isEnum": true + }, + "paginationContext": { + "$ref": "#/definitions/v1.auditLogs.RequestPaginationContext" + } + } + }, + "v1.skill.nlu.evaluations.EvaluateNLURequest": { + "type": "object", + "required": [ + "locale", + "source", + "stage" + ], + "properties": { + "stage": { + "type": "string", + "enum": [ + "development", + "live" + ] + }, + "locale": { + "type": "string" + }, + "source": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.Source" + } + } + }, + "v1.skill.nlu.evaluations.EvaluateResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Id used to retrieve the evaluation later." + } + } + }, + "v1.skill.nlu.evaluations.ListNLUEvaluationsResponse": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.nlu.evaluations.PagedResponse" + }, + { + "type": "object", + "properties": { + "evaluations": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.Evaluation" + } + } + } + } + ], + "description": "response body for a list evaluation API" + }, + "v1.skill.nlu.evaluations.GetNLUEvaluationResponse": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.nlu.evaluations.EvaluationEntity" + }, + { + "type": "object", + "properties": { + "_links": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.GetNLUEvaluationResponseLinks" + } + } + } + ] + }, + "v1.skill.nlu.evaluations.GetNLUEvaluationResultsResponse": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.nlu.evaluations.PagedResultsResponse" + }, + { + "type": "object", + "properties": { + "totalFailed": { + "type": "number", + "description": "count of tests failed. A test fails when the expected intent and expected slots are not identical.\n" + }, + "testCases": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.TestCase" + } + } + } + } + ] + }, + "v1.skill.nlu.evaluations.EvaluationInputs": { + "type": "object", + "properties": { + "locale": { + "type": "string" + }, + "stage": { + "type": "object", + "properties": {} + }, + "source": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.Source" + } + } + }, + "v1.skill.nlu.evaluations.Source": { + "type": "object", + "properties": { + "annotationId": { + "type": "string", + "description": "ID of the annotation set" + } + }, + "description": "Use Annotation Set as evaluation source\n" + }, + "v1.skill.nlu.evaluations.PagedResponse": { + "type": "object", + "properties": { + "paginationContext": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.PaginationContext" + }, + "_links": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.Links" + } + } + }, + "v1.skill.nlu.evaluations.PagedResultsResponse": { + "type": "object", + "properties": { + "paginationContext": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.PagedResultsResponsePaginationContext" + }, + "_links": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.Links" + } + } + }, + "v1.skill.nlu.evaluations.EvaluationEntity": { + "type": "object", + "properties": { + "startTimestamp": { + "type": "string", + "format": "date-time" + }, + "endTimestamp": { + "type": "string", + "format": "date-time" + }, + "status": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.Status", + "x-isEnum": true + }, + "errorMessage": { + "type": "string", + "description": "Error message when evaluation job fails" + }, + "inputs": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.EvaluationInputs" + } + } + }, + "v1.skill.nlu.evaluations.ConfirmationStatus": { + "type": "string", + "description": "An enumeration indicating whether the user has explicitly confirmed or denied the entire intent/slot. Possible values: 'NONE', 'CONFIRMED', 'DENIED'.\n", + "enum": [ + "NONE", + "CONFIRMED", + "DENIED" + ] + }, + "v1.skill.nlu.evaluations.Status": { + "type": "string", + "enum": [ + "PASSED", + "FAILED", + "IN_PROGRESS", + "ERROR" + ] + }, + "v1.skill.nlu.evaluations.ResultsStatus": { + "type": "string", + "enum": [ + "PASSED", + "FAILED" + ] + }, + "v1.skill.nlu.evaluations.Evaluation": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.nlu.evaluations.EvaluationEntity" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "id of the job" + } + } + } + ] + }, + "v1.skill.nlu.evaluations.GetNLUEvaluationResponseLinks": { + "type": "object", + "properties": { + "results": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.Results" + } + } + }, + "v1.skill.nlu.evaluations.TestCase": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.ResultsStatus", + "x-isEnum": true + }, + "inputs": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.Inputs" + }, + "actual": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.Actual" + }, + "expected": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.Expected" + } + } + } + }, + "v1.skill.nlu.evaluations.PaginationContext": { + "type": "object", + "properties": { + "nextToken": { + "type": "string", + "description": "opaque token returned if there are more results for the given inputs than `maxResults` from the request." + } + } + }, + "v1.skill.nlu.evaluations.PagedResultsResponsePaginationContext": { + "type": "object", + "properties": { + "nextToken": { + "type": "string", + "description": "opaque token returned if there are more results for the given inputs than `maxResults` from the request." + }, + "totalCount": { + "type": "string", + "description": "Total available results for the given query." + } + } + }, + "v1.skill.nlu.evaluations.Results": { + "type": "object", + "properties": { + "href": { + "type": "string", + "description": "url to get the test case result details Example: /v1/skills/{skillId}/nluEvaluations/{evaluationId}/results\n" + } + } + }, + "v1.skill.nlu.evaluations.Inputs": { + "type": "object", + "properties": { + "utterance": { + "type": "string" + }, + "referenceTimestamp": { + "type": "string", + "format": "date-time", + "example": "2018-10-25T23:50:02.135Z", + "description": "Datetime to use to base date operations on." + } + } + }, + "v1.skill.nlu.evaluations.Actual": { + "type": "object", + "properties": { + "domain": { + "type": "string" + }, + "intent": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.Intent" + } + } + }, + "v1.skill.nlu.evaluations.Expected": { + "type": "object", + "properties": { + "domain": { + "type": "string" + }, + "intent": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.ExpectedIntent" + } + } + }, + "v1.skill.nlu.evaluations.Intent": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "confirmationStatus": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.ConfirmationStatus", + "x-isEnum": true + }, + "slots": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.SlotsProps" + } + } + } + }, + "v1.skill.nlu.evaluations.ExpectedIntent": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "slots": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.ExpectedIntentSlotsProps" + } + } + } + }, + "v1.skill.nlu.evaluations.SlotsProps": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "confirmationStatus": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.ConfirmationStatus", + "x-isEnum": true + }, + "resolutions": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.Resolutions" + } + } + }, + "v1.skill.nlu.evaluations.ExpectedIntentSlotsProps": { + "type": "object", + "properties": { + "value": { + "type": "string" + } + } + }, + "v1.skill.nlu.evaluations.Resolutions": { + "type": "object", + "properties": { + "resolutionsPerAuthority": { + "type": "array", + "description": "An array of objects representing each possible authority for entity resolution. An authority represents the source for the data provided for the slot. For a custom slot type, the authority is the slot type you defined.\n", + "items": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.ResolutionsPerAuthority" + } + } + } + }, + "description": "A resolutions object representing the results of resolving the words captured from the user's utterance.\n" + }, + "v1.skill.nlu.evaluations.ResolutionsPerAuthority": { + "type": "object", + "properties": { + "authority": { + "type": "string", + "description": "The name of the authority for the slot values. For custom slot types, this authority label incorporates your skill ID and the slot type name.\n" + }, + "status": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.ResolutionsPerAuthorityStatus" + }, + "values": { + "type": "array", + "description": "An array of resolved values for the slot.", + "items": { + "$ref": "#/definitions/v1.skill.nlu.evaluations.ResolutionsPerAuthorityValue" + } + } + } + }, + "v1.skill.nlu.evaluations.ResolutionsPerAuthorityStatus": { + "type": "object", + "properties": { + "code": { + "description": "A code indicating the results of attempting to resolve the user utterance against the defined slot types. This can be one of the following:\nER_SUCCESS_MATCH: The spoken value matched a value or synonym explicitly defined in your custom slot type. ER_SUCCESS_NO_MATCH: The spoken value did not match any values or synonyms explicitly defined in your custom slot type. ER_ERROR_TIMEOUT: An error occurred due to a timeout. ER_ERROR_EXCEPTION: An error occurred due to an exception during processing.\n", + "$ref": "#/definitions/v1.skill.nlu.evaluations.ResolutionsPerAuthorityStatusCode", + "x-isEnum": true + } + } + }, + "v1.skill.nlu.evaluations.ResolutionsPerAuthorityStatusCode": { + "type": "string", + "description": "A code indicating the results of attempting to resolve the user utterance against the defined slot types. This can be one of the following:\nER_SUCCESS_MATCH: The spoken value matched a value or synonym explicitly defined in your custom slot type. ER_SUCCESS_NO_MATCH: The spoken value did not match any values or synonyms explicitly defined in your custom slot type. ER_ERROR_TIMEOUT: An error occurred due to a timeout. ER_ERROR_EXCEPTION: An error occurred due to an exception during processing.\n", + "enum": [ + "ER_SUCCESS_MATCH", + "ER_SUCCESS_NO_MATCH", + "ER_ERROR_TIMEOUT", + "ER_ERROR_EXCEPTION" + ] + }, + "v1.skill.nlu.evaluations.ResolutionsPerAuthorityValue": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The string for the resolved slot value." + }, + "id": { + "type": "string", + "description": "The unique ID defined for the resolved slot value. This is based on the IDs defined in the slot type definition.\n" + } + } + }, + "v1.skill.nlu.evaluations.Links": { + "type": "object", + "properties": { + "self": { + "$ref": "#/definitions/v1.Link" + }, + "next": { + "$ref": "#/definitions/v1.Link" + } + }, + "description": "Links for the API navigation." + }, + "v1.skill.nlu.annotationSets.CreateNLUAnnotationSetRequest": { + "type": "object", + "required": [ + "locale", + "name" + ], + "properties": { + "locale": { + "type": "string", + "description": "The locale of the NLU annotation set" + }, + "name": { + "type": "string", + "description": "The name of NLU annotation set provided by customer" + } + } + }, + "v1.skill.nlu.annotationSets.CreateNLUAnnotationSetResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Id used to retrieve the NLU annotation set." + } + } + }, + "v1.skill.nlu.annotationSets.ListNLUAnnotationSetsResponse": { + "type": "object", + "properties": { + "annotationSets": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.nlu.annotationSets.AnnotationSet" + } + }, + "paginationContext": { + "$ref": "#/definitions/v1.skill.nlu.annotationSets.PaginationContext" + }, + "_links": { + "$ref": "#/definitions/v1.skill.nlu.annotationSets.Links" + } + } + }, + "v1.skill.nlu.annotationSets.UpdateNLUAnnotationSetPropertiesRequest": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of NLU annotation set provided by customer" + } + } + }, + "v1.skill.nlu.annotationSets.UpdateNLUAnnotationSetAnnotationsRequest": { + "type": "object", + "example": { + "application/json": { + "data": [ + { + "inputs": { + "utterance": "i want to travel from seattle", + "referenceTimestamp": "2018-10-25T23:50:02.135Z" + }, + "expected": [ + { + "intent": { + "name": "TravelIntent", + "slots": { + "fromCity": { + "value": "seattle" + } + } + } + } + ] + } + ] + }, + "text/csv": "utterance,referenceTimestamp,intent,slot[fromCity] i want to travel from seattle,2018-10-25T23:50:02.135Z,TravelIntent,seattle\n" + } + }, + "v1.skill.nlu.annotationSets.GetNLUAnnotationSetPropertiesResponse": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.nlu.annotationSets.AnnotationSetEntity" + } + ] + }, + "v1.skill.nlu.annotationSets.AnnotationSetEntity": { + "type": "object", + "properties": { + "locale": { + "type": "string" + }, + "name": { + "type": "string", + "description": "Name of the NLU annotation set" + }, + "numberOfEntries": { + "type": "integer", + "description": "Number of entries which represents number of utterances in each NLU annotation set content" + }, + "updatedTimestamp": { + "type": "string", + "format": "date-time", + "example": "2018-10-25T23:50:02.135Z", + "description": "The lastest updated timestamp for the NLU annotation set" + } + } + }, + "v1.skill.nlu.annotationSets.AnnotationSet": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.nlu.annotationSets.AnnotationSetEntity" + }, + { + "type": "object", + "properties": { + "annotationId": { + "type": "string", + "description": "Identifier of the NLU annotation set." + } + } + } + ] + }, + "v1.skill.nlu.annotationSets.PaginationContext": { + "type": "object", + "properties": { + "nextToken": { + "type": "string", + "description": "Opaque token returned if there are more results for the given inputs than `maxResults` from the request." + } + } + }, + "v1.skill.nlu.annotationSets.Links": { + "type": "object", + "properties": { + "self": { + "$ref": "#/definitions/v1.Link" + }, + "next": { + "$ref": "#/definitions/v1.Link" + } + }, + "description": "Links for the API navigation." + }, + "v1.skill.asr.annotationSets.CreateAsrAnnotationSetRequestObject": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of ASR annotation set. The length of the name cannot exceed 170 chars. Only alphanumeric characters are accepted." + } + } + }, + "v1.skill.asr.annotationSets.CreateAsrAnnotationSetResponse": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "description": "ID used to retrieve the ASR annotation set." + } + } + }, + "v1.skill.asr.annotationSets.ListASRAnnotationSetsResponse": { + "type": "object", + "required": [ + "annotationSets" + ], + "properties": { + "annotationSets": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.asr.annotationSets.AnnotationSetItems" + } + }, + "paginationContext": { + "$ref": "#/definitions/v1.skill.asr.annotationSets.PaginationContext" + } + } + }, + "v1.skill.asr.annotationSets.AnnotationSetItems": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.asr.annotationSets.AnnotationSetMetadata" + }, + { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "description": "The Annotation set id" + } + } + } + ] + }, + "v1.skill.asr.annotationSets.UpdateAsrAnnotationSetPropertiesRequestObject": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of ASR annotation set. The length of the name cannot exceed 170 chars. Only alphanumeric characters are accepted." + } + } + }, + "v1.skill.asr.annotationSets.UpdateAsrAnnotationSetContentsPayload": { + "type": "object", + "required": [ + "annotations" + ], + "properties": { + "annotations": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.asr.annotationSets.Annotation" + } + } + }, + "description": "This is the payload shema for updating asr annotation set contents. Note for text/csv content type, the csv header definitions need to follow the properties of '#/definitions/Annotaion'\n" + }, + "v1.skill.asr.annotationSets.GetAsrAnnotationSetAnnotationsResponse": { + "type": "object", + "required": [ + "annotations" + ], + "properties": { + "annotations": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.skill.asr.annotationSets.AnnotationWithAudioAsset" + } + }, + "paginationContext": { + "$ref": "#/definitions/v1.skill.asr.annotationSets.PaginationContext" + } + }, + "description": "This is the payload schema for annotation set contents. Note that when uploadId and filePathInUpload is present, and the payload content type is 'application/json', audioAsset is included in the returned annotation set content payload. For 'text/csv' annotation set content type, audioAssetDownloadUrl and audioAssetDownloadUrlExpiryTime are included in the csv headers for representing the audio download url and the expiry time of the presigned audio download.\n" + }, + "v1.skill.asr.annotationSets.AudioAsset": { + "type": "object", + "required": [ + "downloadUrl", + "expiryTime" + ], + "properties": { + "downloadUrl": { + "type": "string", + "description": "S3 presigned download url for downloading the audio file" + }, + "expiryTime": { + "type": "string", + "description": "Timestamp when the audio download url expire in ISO 8601 format" + } + }, + "description": "Object containing information about downloading audio file" + }, + "v1.skill.asr.annotationSets.AnnotationWithAudioAsset": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.asr.annotationSets.Annotation" + }, + { + "type": "object", + "properties": { + "audioAsset": { + "$ref": "#/definitions/v1.skill.asr.annotationSets.AudioAsset" + } + } + } + ], + "description": "Object containing annotation content and audio file download information." + }, + "v1.skill.asr.annotationSets.Annotation": { + "type": "object", + "properties": { + "uploadId": { + "type": "string", + "description": "Upload id obtained when developer creates an upload using catalog API. Required to be present when expectedTranscription is missing. When uploadId is present, filePathInUpload must also be present." + }, + "filePathInUpload": { + "type": "string", + "description": "File path in the uploaded zip file. For example, a zip containing a folder named 'a' and there is an audio b.mp3 in that folder. The file path is a/b.mp3. Notice that forward slash ('/') should be used to concatenate directories. Required to be present when expectedTranscription is missing. When filePathInUpload is present, uploadId must also be present." + }, + "evaluationWeight": { + "type": "number", + "description": "Weight of the test case in an evaluation, the value would be used for calculating metrics such as overall error rate. The acceptable values are from 1 - 1000. 1 means least significant, 1000 means mot significant. Here is how weight impact the `OVERALL_ERROR_RATE` calculation: For example, an annotation set consists of 3 annotations and they have weight of 8, 1, 1. The evaluation results show that only the first annotation test case passed while the rest of the test cases failed. In this case, the overall error rate is (8 / (8 + 1 + 1)) = 0.8\n", + "minimum": 1, + "maximum": 1000 + }, + "expectedTranscription": { + "type": "string", + "description": "Expected transcription text for the input audio. The acceptable length of the string is between 1 and 500 Unicode characters. Required to be present when uploadId and filePathInUpload are missing." + } + }, + "description": "A single test case that describes the audio reference, expected transcriptions, test case weight etc. Each annotation object must have at least expectedTranscription or, uploadId and filePathInUpload in pair. In any case, filePathInUpload and uploadId must be present or missing in pair." + }, + "v1.skill.asr.annotationSets.GetASRAnnotationSetsPropertiesResponse": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.asr.annotationSets.AnnotationSetMetadata" + } + ] + }, + "v1.skill.asr.annotationSets.PaginationContext": { + "type": "object", + "required": [ + "nextToken" + ], + "properties": { + "nextToken": { + "type": "string", + "description": "The page token, this should be passed as a `nextToken` query parameter to the API to retrieve more items. If this field is not present the end of all of the items was reached. If a `maxResults` query parameter was specified then no more than `maxResults` items are returned.\n" + } + }, + "description": "This holds all data needed to control pagination from the user.\n" + }, + "v1.skill.asr.annotationSets.AnnotationSetMetadata": { + "type": "object", + "required": [ + "annotationCount", + "lastUpdatedTimestamp", + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the ASR annotation set" + }, + "annotationCount": { + "type": "integer", + "description": "Number of annotations within an annotation set" + }, + "lastUpdatedTimestamp": { + "type": "string", + "format": "date-time", + "description": "The timestamp for the most recent update of ASR annotation set" + }, + "eligibleForEvaluation": { + "type": "boolean", + "description": "Indicates if the annotation set is eligible for evaluation. A set is not eligible for evaluation if any annotation within the set has a missing uploadId, filePathInUpload, expectedTranscription, or evaluationWeight." + } + } + }, + "v1.skill.asr.evaluations.PostAsrEvaluationsRequestObject": { + "type": "object", + "required": [ + "annotationSetId", + "skill" + ], + "properties": { + "skill": { + "$ref": "#/definitions/v1.skill.asr.evaluations.Skill" + }, + "annotationSetId": { + "type": "string", + "description": "ID for annotation set" + } + } + }, + "v1.skill.asr.evaluations.Skill": { + "type": "object", + "required": [ + "locale", + "stage" + ], + "properties": { + "stage": { + "$ref": "#/definitions/v1.StageType", + "x-isEnum": true + }, + "locale": { + "type": "string", + "description": "skill locale in bcp 47 format" + } + } + }, + "v1.skill.asr.evaluations.PostAsrEvaluationsResponseObject": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "description": "ID used to retrieve the evaluation status/results later." + } + } + }, + "v1.skill.asr.evaluations.GetAsrEvaluationStatusResponseObject": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.asr.evaluations.EvaluationMetadata" + } + ] + }, + "v1.skill.asr.evaluations.ListAsrEvaluationsResponse": { + "type": "object", + "required": [ + "evaluations" + ], + "properties": { + "evaluations": { + "type": "array", + "description": "an array containing all evaluations that have ever run by developers based on the filter criteria defined in the request", + "items": { + "$ref": "#/definitions/v1.skill.asr.evaluations.EvaluationItems" + } + }, + "paginationContext": { + "$ref": "#/definitions/v1.skill.asr.evaluations.PaginationContext" + } + }, + "description": "response body for a list evaluation API" + }, + "v1.skill.asr.evaluations.EvaluationItems": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.asr.evaluations.EvaluationMetadata" + }, + { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string", + "description": "evaluation id" + } + } + } + ] + }, + "v1.skill.asr.evaluations.EvaluationResult": { + "type": "object", + "required": [ + "annotation", + "status" + ], + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.asr.evaluations.EvaluationResultStatus", + "x-isEnum": true + }, + "annotation": { + "$ref": "#/definitions/v1.skill.asr.evaluations.AnnotationWithAudioAsset" + }, + "output": { + "$ref": "#/definitions/v1.skill.asr.evaluations.EvaluationResultOutput" + }, + "error": { + "$ref": "#/definitions/v1.skill.asr.evaluations.ErrorObject" + } + }, + "description": "evaluation detailed result" + }, + "v1.skill.asr.evaluations.AnnotationWithAudioAsset": { + "allOf": [ + { + "$ref": "#/definitions/v1.skill.asr.evaluations.Annotation" + }, + { + "type": "object", + "required": [ + "audioAsset" + ], + "properties": { + "audioAsset": { + "$ref": "#/definitions/v1.skill.asr.evaluations.AudioAsset" + } + } + } + ], + "description": "object containing annotation content and audio file download information." + }, + "v1.skill.asr.evaluations.Annotation": { + "type": "object", + "required": [ + "evaluationWeight", + "expectedTranscription", + "filePathInUpload", + "uploadId" + ], + "properties": { + "uploadId": { + "type": "string", + "description": "upload id obtained when developer creates an upload using catalog API" + }, + "filePathInUpload": { + "type": "string", + "description": "file path in the uploaded zip file. For example, a zip containing a folder named 'a' and there is an audio b.mp3 in that folder. The file path is a/b.mp3. Notice that forward slash ('/') should be used to concatenate directories." + }, + "evaluationWeight": { + "type": "number", + "description": "weight of the test case in an evaluation, the value would be used for calculating metrics such as overall error rate. The acceptable values are from 1 - 1000. 1 means least significant, 1000 means mot significant. Here is how weight impact the `OVERALL_ERROR_RATE` calculation: For example, an annotation set consists of 3 annotations and they have weight of 8, 1, 1. The evaluation results show that only the first annotation test case passed while the rest of the test cases failed. In this case, the overall error rate is (8 / (8 + 1 + 1)) = 0.8\n", + "minimum": 1, + "maximum": 1000 + }, + "expectedTranscription": { + "type": "string", + "description": "expected transcription text for the input audio. The acceptable length of the string is between 1 and 500 Unicode characters" + } + } + }, + "v1.skill.asr.evaluations.AudioAsset": { + "type": "object", + "required": [ + "downloadUrl", + "expiryTime" + ], + "properties": { + "downloadUrl": { + "type": "string", + "description": "S3 presigned download url for downloading the audio file" + }, + "expiryTime": { + "type": "string", + "description": "timestamp when the audio download url expire in ISO 8601 format" + } + }, + "description": "Object containing information about downloading audio file" + }, + "v1.skill.asr.evaluations.EvaluationResultOutput": { + "type": "object", + "required": [ + "transcription" + ], + "properties": { + "transcription": { + "type": "string", + "description": "actual transcription returned from ASR for the audio" + } + } + }, + "v1.skill.asr.evaluations.GetAsrEvaluationsResultsResponse": { + "type": "object", + "required": [ + "results" + ], + "properties": { + "results": { + "type": "array", + "description": "array containing all evaluation results.", + "items": { + "$ref": "#/definitions/v1.skill.asr.evaluations.EvaluationResult" + } + }, + "paginationContext": { + "$ref": "#/definitions/v1.skill.asr.evaluations.PaginationContext" + } + }, + "description": "response for GetAsrEvaluationsResults" + }, + "v1.skill.asr.evaluations.PaginationContext": { + "type": "object", + "required": [ + "nextToken" + ], + "properties": { + "nextToken": { + "type": "string", + "description": "The page token, this should be passed as a `nextToken` query parameter to the API to retrieve more items. If this field is not present the end of all of the items was reached. If a `maxResults` query parameter was specified then no more than `maxResults` items are returned.\n" + } + }, + "description": "This holds all data needed to control pagination from the user.\n" + }, + "v1.skill.asr.evaluations.EvaluationStatus": { + "type": "string", + "description": "Evaluation status:\n * `IN_PROGRESS` - indicate the evaluation is in progress.\n * `COMPLETED` - indicate the evaluation has been completed.\n * `FAILED` - indicate the evaluation has run into an error.\n", + "enum": [ + "IN_PROGRESS", + "COMPLETED", + "FAILED" + ] + }, + "v1.skill.asr.evaluations.ErrorObject": { + "type": "object", + "required": [ + "code", + "message" + ], + "properties": { + "message": { + "type": "string", + "description": "human-readable error message" + }, + "code": { + "type": "string", + "description": "machine-readable error code" + } + }, + "description": "Object containing information about the error occurred during an evaluation run. This filed would present if an unexpected error occurred during an evaluatin run.\n" + }, + "v1.skill.asr.evaluations.EvaluationMetadata": { + "type": "object", + "required": [ + "completedEvaluationCount", + "request", + "startTimestamp", + "status", + "totalEvaluationCount" + ], + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.asr.evaluations.EvaluationStatus", + "x-isEnum": true + }, + "totalEvaluationCount": { + "type": "number", + "description": "indicate the total number of evaluations that are supposed to be run in the evaluation request" + }, + "completedEvaluationCount": { + "type": "number", + "description": "indicate the number of completed evaluations" + }, + "startTimestamp": { + "type": "string", + "format": "date-time", + "description": "indicate the start time stamp of the ASR evaluation job. ISO-8601 Format." + }, + "request": { + "$ref": "#/definitions/v1.skill.asr.evaluations.PostAsrEvaluationsRequestObject" + }, + "error": { + "$ref": "#/definitions/v1.skill.asr.evaluations.ErrorObject" + }, + "result": { + "$ref": "#/definitions/v1.skill.asr.evaluations.EvaluationMetadataResult" + } + }, + "description": "response body for GetAsrEvaluationsStatus API" + }, + "v1.skill.asr.evaluations.EvaluationMetadataResult": { + "type": "object", + "required": [ + "metrics", + "status" + ], + "properties": { + "status": { + "$ref": "#/definitions/v1.skill.asr.evaluations.EvaluationResultStatus", + "x-isEnum": true + }, + "metrics": { + "$ref": "#/definitions/v1.skill.asr.evaluations.Metrics" + } + }, + "description": "indicate the result of the evaluation. This field would be present if the evaluation status is `COMPLETED`" + }, + "v1.skill.asr.evaluations.Metrics": { + "type": "object", + "required": [ + "overallErrorRate" + ], + "properties": { + "overallErrorRate": { + "type": "number", + "description": "overall error rate for the ASR evaluation run" + } + } + }, + "v1.skill.asr.evaluations.EvaluationResultStatus": { + "type": "string", + "description": "enum indicating the evaluation result status.\n * `PASSED` - evaluation result is considered passed\n * `FAILED` - evaluation result is considered failed\n", + "enum": [ + "PASSED", + "FAILED" + ] + }, + "v1.skill.resourceSchema.getResourceSchemaResponse": { + "type": "object", + "properties": { + "schemaLocationUrl": { + "type": "string", + "description": "S3 presigned URL to schema location." + }, + "expiryTime": { + "type": "string", + "format": "date-time", + "example": "2020-10-19T23:50:02.135Z", + "description": "Timestamp when the schema location url expires in ISO 8601 format." + } + } + }, + "v1.smartHomeEvaluation.EvaluationObject": { + "type": "object", + "properties": { + "endTimestamp": { + "type": "string", + "format": "date-time" + }, + "startTimestamp": { + "type": "string", + "format": "date-time" + }, + "status": { + "$ref": "#/definitions/v1.smartHomeEvaluation.EvaluationEntityStatus", + "x-isEnum": true + }, + "endpointId": { + "type": "string" + }, + "id": { + "type": "string" + }, + "sourceTestPlanIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "testPlanId": { + "type": "string" + } + } + }, + "v1.smartHomeEvaluation.paginationContextToken": { + "type": "object", + "properties": { + "nextToken": { + "type": "string" + } + } + }, + "v1.smartHomeEvaluation.ListSHCapabilityEvaluationsResponse": { + "type": "object", + "properties": { + "paginationContextToken": { + "$ref": "#/definitions/v1.smartHomeEvaluation.paginationContextToken" + }, + "evaluations": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.smartHomeEvaluation.EvaluationObject" + } + } + } + }, + "v1.smartHomeEvaluation.EvaluationEntityStatus": { + "type": "string", + "enum": [ + "PASSED", + "FAILED", + "IN_PROGRESS", + "ERROR" + ] + }, + "v1.smartHomeEvaluation.EvaluateSHCapabilityResponse": { + "allOf": [ + { + "$ref": "#/definitions/v1.smartHomeEvaluation.EvaluateSHCapabilityRequest" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + } + ] + }, + "v1.smartHomeEvaluation.EvaluateSHCapabilityRequest": { + "type": "object", + "required": [ + "capabilityTestPlan", + "endpoint", + "stage" + ], + "properties": { + "capabilityTestPlan": { + "$ref": "#/definitions/v1.smartHomeEvaluation.CapabilityTestPlan" + }, + "endpoint": { + "$ref": "#/definitions/v1.smartHomeEvaluation.Endpoint" + }, + "stage": { + "$ref": "#/definitions/v1.smartHomeEvaluation.Stage", + "x-isEnum": true + } + } + }, + "v1.smartHomeEvaluation.CapabilityTestPlan": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + "v1.smartHomeEvaluation.Endpoint": { + "type": "object", + "properties": { + "endpointId": { + "type": "string" + } + } + }, + "v1.smartHomeEvaluation.Stage": { + "type": "string", + "enum": [ + "development", + "live" + ] + }, + "v1.smartHomeEvaluation.SHEvaluationResultsMetric": { + "type": "object", + "properties": { + "errorTestCases": { + "type": "integer" + }, + "failedTestCases": { + "type": "integer" + }, + "passedTestCases": { + "type": "integer" + }, + "totalTestCases": { + "type": "integer" + } + } + }, + "v1.smartHomeEvaluation.GetSHCapabilityEvaluationResponse": { + "type": "object", + "properties": { + "endTimestamp": { + "type": "string", + "format": "date-time" + }, + "startTimestamp": { + "type": "string", + "format": "date-time" + }, + "status": { + "$ref": "#/definitions/v1.smartHomeEvaluation.EvaluationEntityStatus", + "x-isEnum": true + }, + "error": { + "$ref": "#/definitions/v1.smartHomeEvaluation.SHCapabilityError" + }, + "input": { + "$ref": "#/definitions/v1.smartHomeEvaluation.EvaluateSHCapabilityRequest" + }, + "metrics": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/v1.smartHomeEvaluation.SHEvaluationResultsMetric" + } + } + } + }, + "v1.smartHomeEvaluation.ListSHTestPlanItem": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + } + }, + "v1.smartHomeEvaluation.paginationContext": { + "type": "object", + "properties": { + "nextToken": { + "type": "string" + }, + "totalCount": { + "type": "integer", + "format": "int64" + } + } + }, + "v1.smartHomeEvaluation.PagedResponse": { + "type": "object", + "properties": { + "paginationContext": { + "$ref": "#/definitions/v1.smartHomeEvaluation.paginationContext" + } + } + }, + "v1.smartHomeEvaluation.ListSHCapabilityTestPlansResponse": { + "allOf": [ + { + "$ref": "#/definitions/v1.smartHomeEvaluation.PagedResponse" + }, + { + "type": "object", + "properties": { + "testPlans": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.smartHomeEvaluation.ListSHTestPlanItem" + } + } + } + } + ] + }, + "v1.smartHomeEvaluation.TestCaseResultStatus": { + "type": "string", + "enum": [ + "PASSED", + "FAILED", + "ERROR" + ] + }, + "v1.smartHomeEvaluation.TestCaseResult": { + "type": "object", + "properties": { + "actualCapabilityStates": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.smartHomeEvaluation.SHCapabilityState" + } + }, + "actualResponse": { + "$ref": "#/definitions/v1.smartHomeEvaluation.SHCapabilityResponse" + }, + "directive": { + "$ref": "#/definitions/v1.smartHomeEvaluation.SHCapabilityDirective" + }, + "error": { + "$ref": "#/definitions/v1.smartHomeEvaluation.SHCapabilityError" + }, + "expectedCapabilityStates": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.smartHomeEvaluation.SHCapabilityState" + } + }, + "expectedResponse": { + "$ref": "#/definitions/v1.smartHomeEvaluation.SHCapabilityResponse" + }, + "name": { + "type": "string" + }, + "status": { + "$ref": "#/definitions/v1.smartHomeEvaluation.TestCaseResultStatus", + "x-isEnum": true + } + } + }, + "v1.smartHomeEvaluation.GetSHCapabilityEvaluationResultsResponse": { + "allOf": [ + { + "$ref": "#/definitions/v1.smartHomeEvaluation.PagedResponse" + }, + { + "type": "object", + "properties": { + "testCaseResults": { + "type": "array", + "items": { + "$ref": "#/definitions/v1.smartHomeEvaluation.TestCaseResult" + } + } + } + } + ] + }, + "v1.smartHomeEvaluation.SHCapabilityState": { + "type": "object" + }, + "v1.smartHomeEvaluation.SHCapabilityResponse": { + "type": "object" + }, + "v1.smartHomeEvaluation.SHCapabilityDirective": { + "type": "object" + }, + "v1.smartHomeEvaluation.SHCapabilityError": { + "type": "object", + "properties": { + "code": { + "$ref": "#/definitions/v1.smartHomeEvaluation.SHCapabilityErrorCode", + "x-isEnum": true + }, + "message": { + "type": "string" + } + } + }, + "v1.smartHomeEvaluation.SHCapabilityErrorCode": { + "type": "string", + "enum": [ + "NO_SUCH_ENDPOINT", + "NO_SUCH_SKILL_STAGE", + "NO_SUCH_TEST_PLAN", + "MULTIPLE_MATCHED_ENDPOINTS", + "MULTIPLE_MATCHED_TEST_PLANS", + "CAPABILITY_NOT_SUPPORTED", + "DISCOVERY_FAILED", + "TEST_CASE_TIME_OUT" + ] + }, + "v2.skill.Invocation": { + "type": "object", + "properties": { + "invocationRequest": { + "$ref": "#/definitions/v2.skill.InvocationRequest" + }, + "invocationResponse": { + "$ref": "#/definitions/v2.skill.InvocationResponse" + }, + "metrics": { + "$ref": "#/definitions/v2.skill.Metrics" + } + } + }, + "v2.skill.InvocationRequest": { + "type": "object", + "properties": { + "endpoint": { + "type": "string", + "description": "Skill's Lambda or HTTPS endpoint." + }, + "body": { + "type": "object", + "description": "JSON payload that was sent to the skill's Lambda or HTTPS endpoint.\n", + "additionalProperties": { + "type": "object", + "properties": {} + } + } + } + }, + "v2.skill.InvocationResponse": { + "type": "object", + "properties": { + "body": { + "type": "object", + "description": "Payload that was returned by the skill's Lambda or HTTPS endpoint.\n", + "additionalProperties": { + "type": "object", + "properties": {} + } + } + } + }, + "v2.skill.Metrics": { + "type": "object", + "properties": { + "skillExecutionTimeInMilliseconds": { + "type": "integer", + "description": "How long, in milliseconds, it took the skill's Lambda or HTTPS endpoint to process the request.\n" + } + } + }, + "v2.skill.simulations.SimulationsApiRequest": { + "type": "object", + "required": [ + "device", + "input" + ], + "properties": { + "input": { + "$ref": "#/definitions/v2.skill.simulations.Input" + }, + "device": { + "$ref": "#/definitions/v2.skill.simulations.Device" + }, + "session": { + "$ref": "#/definitions/v2.skill.simulations.Session" + }, + "simulation": { + "$ref": "#/definitions/v2.skill.simulations.Simulation" + } + } + }, + "v2.skill.simulations.Input": { + "type": "object", + "required": [ + "content" + ], + "properties": { + "content": { + "type": "string", + "description": "A string corresponding to the utterance text of what a customer would say to Alexa.\n" + } + } + }, + "v2.skill.simulations.Device": { + "type": "object", + "required": [ + "locale" + ], + "properties": { + "locale": { + "type": "string", + "description": "A valid locale (e.g \"en-US\") for the virtual device used in simulation.\n" + } + }, + "description": "Model of a virtual device used for simulation. This device object emulates attributes associated with a real Alexa enabled device.\n" + }, + "v2.skill.simulations.Session": { + "type": "object", + "properties": { + "mode": { + "$ref": "#/definitions/v2.skill.simulations.SessionMode", + "x-isEnum": true + } + }, + "description": "Session settings for running current simulation.\n" + }, + "v2.skill.simulations.SessionMode": { + "type": "string", + "description": "Indicate the session mode of the current simulation is using.\n", + "enum": [ + "DEFAULT", + "FORCE_NEW_SESSION" + ] + }, + "v2.skill.simulations.Simulation": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/v2.skill.simulations.SimulationType", + "x-isEnum": true + } + }, + "description": "Simulation settings for the current simulation request.\n" + }, + "v2.skill.simulations.SimulationType": { + "type": "string", + "description": "String indicating the type of simulation request. Possible values are \"DEFAULT\" and \"NFI_ISOLATED_SIMULATION\". \"NFI_ISOLATED_SIMULATION\" is used to test the NFI(Name Free Interaction) enabled skills in isolation. This field is reserved for testing Name Free Interactions(NFI). Skills that are eligible to add NFI can only use this field. To learn more, visit https://developer.amazon.com/en-US/docs/alexa/custom-skills/understand-name-free-interaction-for-custom-skills.html\n", + "enum": [ + "DEFAULT", + "NFI_ISOLATED_SIMULATION" + ] + }, + "v2.skill.simulations.SimulationsApiResponse": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Id of the simulation resource." + }, + "status": { + "$ref": "#/definitions/v2.skill.simulations.SimulationsApiResponseStatus", + "x-isEnum": true + }, + "result": { + "$ref": "#/definitions/v2.skill.simulations.SimulationResult" + } + } + }, + "v2.skill.simulations.SimulationsApiResponseStatus": { + "type": "string", + "description": "String that specifies the current status of the simulation. Possible values are \"IN_PROGRESS\", \"SUCCESSFUL\", and \"FAILED\".\n", + "enum": [ + "IN_PROGRESS", + "SUCCESSFUL", + "FAILED" + ] + }, + "v2.skill.simulations.SimulationResult": { + "type": "object", + "properties": { + "alexaExecutionInfo": { + "$ref": "#/definitions/v2.skill.simulations.AlexaExecutionInfo" + }, + "skillExecutionInfo": { + "$ref": "#/definitions/v2.skill.simulations.SkillExecutionInfo" + }, + "error": { + "$ref": "#/definitions/v2.Error" + } + } + }, + "v2.skill.simulations.SkillExecutionInfo": { + "type": "object", + "properties": { + "invocations": { + "type": "array", + "items": { + "$ref": "#/definitions/v2.skill.Invocation" + } + } + } + }, + "v2.skill.simulations.AlexaExecutionInfo": { + "type": "object", + "properties": { + "alexaResponses": { + "type": "array", + "items": { + "$ref": "#/definitions/v2.skill.simulations.AlexaResponse" + } + }, + "consideredIntents": { + "type": "array", + "items": { + "$ref": "#/definitions/v2.skill.simulations.Intent" + } + } + } + }, + "v2.skill.simulations.AlexaResponse": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of Alexa response" + }, + "content": { + "description": "The detail information needs to exposed in this type of Alexa response.\n", + "$ref": "#/definitions/v2.skill.simulations.AlexaResponseContent" + } + } + }, + "v2.skill.simulations.AlexaResponseContent": { + "type": "object", + "properties": { + "caption": { + "type": "string", + "description": "The plain text from Alexa speech response." + } + } + }, + "v2.skill.simulations.Intent": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "confirmationStatus": { + "$ref": "#/definitions/v2.skill.simulations.ConfirmationStatusType", + "x-isEnum": true + }, + "slots": { + "type": "object", + "description": "A map of key-value pairs that further describes what the user meant based on a predefined intent schema. The map can be empty.\n", + "additionalProperties": { + "$ref": "#/definitions/v2.skill.simulations.Slot" + } + } + } + }, + "v2.skill.simulations.ConfirmationStatusType": { + "type": "string", + "description": "An enumeration indicating whether the user has explicitly confirmed or denied the entire intent. Possible values: \"NONE\", \"CONFIRMED\", \"DENIED\".\n", + "enum": [ + "NONE", + "CONFIRMED", + "DENIED" + ] + }, + "v2.skill.simulations.Slot": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "confirmationStatus": { + "$ref": "#/definitions/v2.skill.simulations.ConfirmationStatusType", + "x-isEnum": true + }, + "resolutions": { + "$ref": "#/definitions/v2.skill.simulations.SlotResolutions" + } + } + }, + "v2.skill.simulations.SlotResolutions": { + "type": "object", + "properties": { + "resolutionsPerAuthority": { + "type": "array", + "description": "An array of objects representing each possible authority for entity resolution. An authority represents the source for the data provided for the slot. For a custom slot type, the authority is the slot type you defined.\n", + "items": { + "$ref": "#/definitions/v2.skill.simulations.ResolutionsPerAuthorityItems" + } + } + }, + "description": "A resolutions object representing the results of resolving the words captured from the user's utterance.\n" + }, + "v2.skill.simulations.ResolutionsPerAuthorityItems": { + "type": "object", + "properties": { + "authority": { + "type": "string", + "description": "The name of the authority for the slot values. For custom slot types, this authority label incorporates your skill ID and the slot type name.\n" + }, + "status": { + "$ref": "#/definitions/v2.skill.simulations.ResolutionsPerAuthorityStatus" + }, + "values": { + "type": "array", + "description": "An array of resolved values for the slot.", + "items": { + "$ref": "#/definitions/v2.skill.simulations.ResolutionsPerAuthorityValueItems" + } + } + } + }, + "v2.skill.simulations.ResolutionsPerAuthorityStatus": { + "type": "object", + "properties": { + "code": { + "$ref": "#/definitions/v2.skill.simulations.ResolutionsPerAuthorityStatusCode", + "x-isEnum": true + } + }, + "description": "An object representing the status of entity resolution for the slot." + }, + "v2.skill.simulations.ResolutionsPerAuthorityStatusCode": { + "type": "string", + "description": "A code indicating the results of attempting to resolve the user utterance against the defined slot types. This can be one of the following:\nER_SUCCESS_MATCH: The spoken value matched a value or synonym explicitly defined in your custom slot type. ER_SUCCESS_NO_MATCH: The spoken value did not match any values or synonyms explicitly defined in your custom slot type. ER_ERROR_TIMEOUT: An error occurred due to a timeout. ER_ERROR_EXCEPTION: An error occurred due to an exception during processing.\n", + "enum": [ + "ER_SUCCESS_MATCH", + "ER_SUCCESS_NO_MATCH", + "ER_ERROR_TIMEOUT", + "ER_ERROR_EXCEPTION" + ] + }, + "v2.skill.simulations.ResolutionsPerAuthorityValueItems": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The string for the resolved slot value." + }, + "id": { + "type": "string", + "description": "The unique ID defined for the resolved slot value. This is based on the IDs defined in the slot type definition.\n" + } + }, + "description": "An object representing the resolved value for the slot, based on the user's utterance and the slot type definition.\n" + }, + "v2.skill.invocations.invocationsApiRequest": { + "type": "object", + "required": [ + "endpointRegion", + "skillRequest" + ], + "properties": { + "endpointRegion": { + "$ref": "#/definitions/v2.skill.invocations.EndPointRegions", + "x-isEnum": true + }, + "skillRequest": { + "$ref": "#/definitions/v2.skill.invocations.SkillRequest" + } + } + }, + "v2.skill.invocations.EndPointRegions": { + "type": "string", + "description": "Region of endpoint to be called.", + "enum": [ + "NA", + "EU", + "FE", + "default" + ] + }, + "v2.skill.invocations.SkillRequest": { + "type": "object", + "required": [ + "body" + ], + "properties": { + "body": { + "type": "object", + "description": "ASK request body schema as defined in the public facing documentation (https://developer.amazon.com/en-US/docs/alexa/custom-skills/request-and-response-json-reference.html#request-body-syntax)\n", + "properties": {} + } + } + }, + "v2.skill.invocations.InvocationsApiResponse": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/v2.skill.invocations.InvocationResponseStatus", + "x-isEnum": true + }, + "result": { + "$ref": "#/definitions/v2.skill.invocations.InvocationResponseResult" + } + } + }, + "v2.skill.invocations.InvocationResponseStatus": { + "type": "string", + "description": "String that specifies the status of skill invocation. Possible values are \"SUCCESSFUL\", and \"FAILED\".\n", + "enum": [ + "SUCCESSFUL", + "FAILED" + ] + }, + "v2.skill.invocations.InvocationResponseResult": { + "type": "object", + "properties": { + "skillExecutionInfo": { + "$ref": "#/definitions/v2.skill.Invocation" + }, + "error": { + "$ref": "#/definitions/v2.Error" + } + } + } + } +} \ No newline at end of file diff --git a/test/test-utils.js b/test/test-utils.js index 8f0c7881..5f058a36 100644 --- a/test/test-utils.js +++ b/test/test-utils.js @@ -101,7 +101,7 @@ const _startMockServer = async (port, swaggerSpecPath) => { return run("npm", args, options); }; -const startMockSmapiServer = () => _startMockServer(MockServerPort.SMAPI, "node_modules/ask-smapi-model/spec.json"); +const startMockSmapiServer = () => _startMockServer(MockServerPort.SMAPI, "test/integration/fixtures/smapi_spec.json"); const startMockLwaServer = () => _startMockServer(MockServerPort.LWA, "test/integration/fixtures/lwa-swagger.json"); module.exports = { diff --git a/test/unit/builtins/cfn-deployer/helper-test.js b/test/unit/builtins/cfn-deployer/helper-test.js index af8c0bb0..97b2e165 100644 --- a/test/unit/builtins/cfn-deployer/helper-test.js +++ b/test/unit/builtins/cfn-deployer/helper-test.js @@ -1,13 +1,12 @@ -const aws = require("aws-sdk"); const {expect} = require("chai"); const fs = require("fs"); const sinon = require("sinon"); +const proxyquire = require("proxyquire"); const CliCFNDeployerError = require("../../../../lib/exceptions/cli-cfn-deployer-error"); -const Helper = require("../../../../lib/builtins/deploy-delegates/cfn-deployer/helper"); describe("Builtins test - cfn-deployer helper test", () => { - const profile = 'default'; + const profile = "default"; const doDebug = false; const awsProfile = "test"; const awsRegion = "test-region"; @@ -19,221 +18,229 @@ describe("Builtins test - cfn-deployer helper test", () => { const endpointUri = "some-endpoint"; const parameters = [{ParameterKey: "SkillId", ParameterValue: "some id"}]; const capabilities = []; - let helper; - let reporter; - let updateStatusStub; - let headBucketStub; - let createBucketStub; - let waitForStub; - let getBucketVersioningStub; - let putBucketVersioningStub; - let putObjectStub; - let describeStacksStub; - let updateStackStub; - let createStackStub; - let describeStackEventsStub; + let sleepStub, updateStatusStub, reporter, helper; beforeEach(() => { - createBucketStub = sinon.stub().returns({promise: sinon.stub().resolves()}); - headBucketStub = sinon.stub(); - waitForStub = sinon.stub().returns({promise: sinon.stub().resolves()}); - getBucketVersioningStub = sinon.stub(); - putBucketVersioningStub = sinon.stub().returns({promise: sinon.stub().resolves()}); - putObjectStub = sinon.stub().returns({promise: sinon.stub().resolves()}); - - sinon.stub(aws, "S3").returns({ - headBucket: headBucketStub, - createBucket: createBucketStub, - waitFor: waitForStub, - getBucketVersioning: getBucketVersioningStub, - putBucketVersioning: putBucketVersioningStub, - putObject: putObjectStub, - }); - - describeStacksStub = sinon.stub(); - updateStackStub = sinon.stub().returns({promise: sinon.stub().resolves()}); - createStackStub = sinon.stub().returns({promise: sinon.stub().resolves()}); - describeStackEventsStub = sinon.stub(); - - sinon.stub(aws, "CloudFormation").returns({ - describeStacks: describeStacksStub, - updateStack: updateStackStub, - createStack: createStackStub, - describeStackEvents: describeStackEventsStub, - }); + sleepStub = sinon.stub(); updateStatusStub = sinon.stub(); - reporter = { updateStatus: updateStatusStub, }; - + const Helper = proxyquire("../../../../lib/builtins/deploy-delegates/cfn-deployer/helper", { + util: { + promisify: sinon.stub().withArgs(setTimeout).returns(sleepStub), + }, + }); helper = new Helper(profile, doDebug, awsProfile, awsRegion, reporter); - sinon.stub(helper, "sleep").resolves(); - }); - - it("should not create s3 bucket when the bucket already exists", async () => { - headBucketStub.returns({promise: sinon.stub().resolves()}); - - await helper.createS3BucketIfNotExists(bucketName); - - expect(headBucketStub.callCount).eq(1); - expect(createBucketStub.callCount).eq(0); - }); - - it("should create s3 bucket when the bucket does not exist in us-east-1", async () => { - headBucketStub.returns({promise: sinon.stub().rejects()}); - - helper = new Helper(profile, doDebug, awsProfile, 'us-east-1', reporter); - await helper.createS3BucketIfNotExists(bucketName); - - expect(headBucketStub.callCount).eq(1); - expect(createBucketStub.callCount).eq(1); - expect(createBucketStub.args[0][0].Bucket).eq(bucketName); - expect(waitForStub.callCount).eq(1); }); - it("should create s3 bucket when the bucket does not exist in non us-east-1", async () => { - headBucketStub.returns({promise: sinon.stub().rejects()}); - - await helper.createS3BucketIfNotExists(bucketName); - - expect(headBucketStub.callCount).eq(1); - expect(createBucketStub.callCount).eq(1); - expect(createBucketStub.args[0][0].Bucket).eq(bucketName); - expect(createBucketStub.args[0][0].CreateBucketConfiguration.LocationConstraint).eq(awsRegion); - expect(waitForStub.callCount).eq(1); - }); - - it("should not enable s3 bucket versioning when the versioning already enabled", async () => { - getBucketVersioningStub.returns({promise: sinon.stub().resolves(versioningConfiguration)}); - - await helper.enableS3BucketVersioningIfNotEnabled(bucketName); - - expect(putBucketVersioningStub.callCount).eq(0); - }); - - it("should enable s3 bucket versioning when the versioning is not enabled", async () => { - getBucketVersioningStub.returns({promise: sinon.stub().resolves({})}); - - await helper.enableS3BucketVersioningIfNotEnabled(bucketName); - - expect(putBucketVersioningStub.callCount).eq(1); - expect(putBucketVersioningStub.args[0][0]).eql({Bucket: bucketName, VersioningConfiguration: versioningConfiguration}); + afterEach(() => { + sinon.restore(); }); - it("should upload to s3", async () => { - const objectBody = "some body"; - sinon.stub(fs, "readFileSync").returns(objectBody); + describe("# function uploadToS3 tests", () => { const bucketKey = "someKey"; const filePath = "some-path"; + const objectBody = "some body"; + let bucketExitsStub, createBucketStub, waitForBucketStub, getBucketVersioningStub, enableBucketVersioningStub, putObjectStub; + + beforeEach(() => { + bucketExitsStub = sinon.stub(helper.s3Client, "bucketExits"); + createBucketStub = sinon.stub(helper.s3Client, "createBucket"); + waitForBucketStub = sinon.stub(helper.s3Client, "waitForBucketExists"); + getBucketVersioningStub = sinon.stub(helper.s3Client, "getBucketVersioning"); + enableBucketVersioningStub = sinon.stub(helper.s3Client, "enableBucketVersioning"); + putObjectStub = sinon.stub(helper.s3Client, "putObject"); + sinon.stub(fs, "readFileSync").returns(objectBody); + }); - await helper.uploadToS3(bucketName, bucketKey, filePath); - - expect(putObjectStub.callCount).eq(1); - expect(putObjectStub.args[0][0]).eql({Bucket: bucketName, Key: bucketKey, Body: objectBody}); - expect(updateStatusStub.callCount).eq(1); - expect(updateStatusStub.args[0][0]).eq(`Uploading code artifact to s3://${bucketName}/${bucketKey}`); - }); - - it("should create new cloud formation stack when stack does not exist", async () => { - describeStacksStub.returns({promise: sinon.stub().rejects({})}); - - await helper.deployStack(stackId, stackName, templateBody, parameters, capabilities); - - expect(updateStatusStub.args[0][0]).contains("No stack exists or stack has been deleted. Creating cloudformation stack"); - expect(createStackStub.callCount).eq(1); - expect(createStackStub.args[0][0]).eql({StackName: stackName, Capabilities: [], TemplateBody: templateBody, Parameters: parameters}); - }); - - it("should create new cloud formation stack when stack id is undefined", async () => { - await helper.deployStack(undefined, stackName, templateBody, parameters, capabilities); - - expect(updateStatusStub.args[0][0]).contains("No stack exists or stack has been deleted. Creating cloudformation stack"); - expect(createStackStub.callCount).eq(1); - expect(createStackStub.args[0][0]).eql({StackName: stackName, Capabilities: [], TemplateBody: templateBody, Parameters: parameters}); - }); - - it("should update cloud formation stack when stack exists", async () => { - describeStacksStub.returns({promise: sinon.stub().resolves({Stacks: [{StackStatus: "CREATE_COMPLETE"}]})}); - - await helper.deployStack(stackId, stackName, templateBody, parameters, capabilities); - - expect(updateStatusStub.args[0][0]).contains(`Updating stack (${stackId})...`); - expect(updateStackStub.callCount).eq(1); - expect(updateStackStub.args[0][0]).eql({StackName: stackId, Capabilities: [], TemplateBody: templateBody, Parameters: parameters}); - }); - - it("should wait for cloud formation stack deploy and return endpoint uri", async () => { - const stackInfo1 = {StackStatus: "CREATE_IN_PROGRESS", StackStatusReason: "User initiated"}; - const stackInfo2 = {StackStatus: "CREATE_COMPLETE", Outputs: [{OutputKey: "SkillEndpoint", OutputValue: endpointUri}]}; - - describeStacksStub.onCall(0).returns({promise: sinon.stub().resolves({Stacks: [stackInfo1]})}); - describeStacksStub.onCall(1).returns({promise: sinon.stub().resolves({Stacks: [stackInfo2]})}); + it("should upload file but not create s3 bucket or enable versioning when the bucket already exists and versioning already enabled", async () => { + // setup + bucketExitsStub.resolves(true); + getBucketVersioningStub.resolves(versioningConfiguration); + // call + await helper.uploadToS3(bucketName, bucketKey, filePath); + // verify + expect(bucketExitsStub.args[0][0]).eq(bucketName); + expect(createBucketStub.called).to.be.false; + expect(waitForBucketStub.called).to.be.false; + expect(getBucketVersioningStub.args[0][0]).eq(bucketName); + expect(enableBucketVersioningStub.called).to.be.false; + expect(putObjectStub.args[0]).deep.equal([bucketName, bucketKey, objectBody]); + }); - const response = await helper.waitForStackDeploy(stackId); + it("should enable versioning and upload file but not create s3 bucket when the bucket already exists and versioning not enabled", async () => { + // setup + bucketExitsStub.resolves(true); + getBucketVersioningStub.resolves({}); + // call + await helper.uploadToS3(bucketName, bucketKey, filePath); + // verify + expect(bucketExitsStub.args[0][0]).eq(bucketName); + expect(createBucketStub.called).to.be.false; + expect(waitForBucketStub.called).to.be.false; + expect(getBucketVersioningStub.args[0][0]).eq(bucketName); + expect(enableBucketVersioningStub.args[0][0]).eq(bucketName); + expect(putObjectStub.args[0]).deep.equal([bucketName, bucketKey, objectBody]); + }); - expect(response).eql({stackInfo: stackInfo2, endpointUri}); - expect(updateStatusStub.args[0][0]).eq( - `Current stack status: ${stackInfo1.StackStatus}... Status reason: ${stackInfo1.StackStatusReason}.`, - ); - expect(updateStatusStub.args[1][0]).eq(`Current stack status: ${stackInfo2.StackStatus}... `); + it("should create s3 bucket, enable versioning and upload file when the bucket does not exist", async () => { + // setup + bucketExitsStub.resolves(false); + getBucketVersioningStub.resolves({}); + // call + await helper.uploadToS3(bucketName, bucketKey, filePath); + // verify + expect(bucketExitsStub.args[0][0]).eq(bucketName); + expect(createBucketStub.args[0][0]).eq(bucketName); + expect(createBucketStub.args[0][1]).eq(awsRegion); + expect(waitForBucketStub.args[0][0]).eq(bucketName); + expect(getBucketVersioningStub.args[0][0]).eq(bucketName); + expect(enableBucketVersioningStub.args[0][0]).eq(bucketName); + expect(putObjectStub.args[0]).deep.equal([bucketName, bucketKey, objectBody]); + }); }); - it("should wait for cloud formation stack deploy and throw a deploy error", async () => { - const stackInfo = {StackStatus: "ROLLBACK_COMPLETE", Outputs: [{OutputKey: "SkillEndpoint", OutputValue: endpointUri}]}; - describeStacksStub.returns({promise: sinon.stub().resolves({Stacks: [stackInfo]})}); + describe("# function deployStack tests", () => { + let stackExistsStub, createStackStub, updateStackStub, getStackStub, getStackEventsStub; - const failureReason = "some failure reason"; - const stackEvent = { - ResourceStatus: "CREATE_FAILED", - LogicalResourceId: "some resource id", - ResourceType: "some resource type", - ResourceStatusReason: failureReason, - }; - describeStackEventsStub.returns({ - promise: sinon.stub().resolves({StackEvents: [{ResourceStatus: "reason 1"}, stackEvent, {ResourceStatus: "reason 2"}]}), + beforeEach(() => { + stackExistsStub = sinon.stub(helper.cloudformationClient, "stackExists"); + createStackStub = sinon.stub(helper.cloudformationClient, "createStack"); + updateStackStub = sinon.stub(helper.cloudformationClient, "updateStack"); + getStackStub = sinon.stub(helper.cloudformationClient, "getStack"); + getStackEventsStub = sinon.stub(helper.cloudformationClient, "getStackEvents"); }); - return helper.waitForStackDeploy(stackId).catch((err) => { - expect(err).instanceOf(CliCFNDeployerError); - expect(err.message).includes(failureReason); + it("should create new cloud formation stack when stack does not exist and return endpoint uri", async () => { + // setup + stackExistsStub.resolves(false); + createStackStub.resolves(stackId); + const stackInfo1 = {StackStatus: "CREATE_IN_PROGRESS", StackStatusReason: "User initiated"}; + const stackInfo2 = {StackStatus: "CREATE_COMPLETE", Outputs: [{OutputKey: "SkillEndpoint", OutputValue: endpointUri}]}; + getStackStub.onCall(0).resolves(stackInfo1); + getStackStub.onCall(1).resolves(stackInfo2); + // call + const res = await helper.deployStack(undefined, stackName, templateBody, parameters, capabilities); + // verify + expect(res).deep.equal({stackId, stackInfo: stackInfo2, endpointUri}); + expect(stackExistsStub.args[0][0]).equal(undefined); + expect(createStackStub.args[0]).deep.equal([stackName, templateBody, parameters, capabilities]); + expect(updateStackStub.called).to.be.false; + expect(getStackStub.callCount).equal(2); + expect(getStackEventsStub.callCount).equal(0); + expect(sleepStub.callCount).equal(1); + expect(updateStatusStub.args).deep.equals([ + [`No stack exists or stack has been deleted. Creating cloudformation stack "${stackName}"...`], + [`Current stack status: ${stackInfo1.StackStatus}... Status reason: ${stackInfo1.StackStatusReason}.`], + [`Current stack status: ${stackInfo2.StackStatus}... `], + ]); }); - }); - it("should wait for cloud formation stack deploy and throw a default error", async () => { - const stackInfo = {StackStatus: "ROLLBACK_COMPLETE", Outputs: [{OutputKey: "SkillEndpoint", OutputValue: endpointUri}]}; - describeStacksStub.returns({promise: sinon.stub().resolves({Stacks: [stackInfo]})}); + it("should update cloud formation stack when stack exists and return endpoint uri", async () => { + // setup + stackExistsStub.resolves(true); + updateStackStub.resolves(stackId); + const stackInfo1 = {StackStatus: "UPDATE_IN_PROGRESS", StackStatusReason: "User initiated"}; + const stackInfo2 = {StackStatus: "UPDATE_COMPLETE", Outputs: [{OutputKey: "SkillEndpoint", OutputValue: endpointUri}]}; + getStackStub.onCall(0).resolves(stackInfo1); + getStackStub.onCall(1).resolves(stackInfo2); + // call + const res = await helper.deployStack(stackId, stackName, templateBody, parameters, capabilities); + // verify + expect(res).deep.equal({stackId, stackInfo: stackInfo2, endpointUri}); + expect(stackExistsStub.args[0][0]).equal(stackId); + expect(createStackStub.called).to.be.false; + expect(updateStackStub.args[0]).deep.equal([stackId, templateBody, parameters, capabilities]); + expect(getStackStub.callCount).equal(2); + expect(getStackEventsStub.callCount).equal(0); + expect(sleepStub.callCount).equal(1); + expect(updateStatusStub.args).deep.equals([ + [`Updating stack (${stackId})...`], + [`Current stack status: ${stackInfo1.StackStatus}... Status reason: ${stackInfo1.StackStatusReason}.`], + [`Current stack status: ${stackInfo2.StackStatus}... `], + ]); + }); - describeStackEventsStub.returns({ - promise: sinon.stub().resolves({StackEvents: [{ResourceStatus: "reason 1"}, {ResourceStatus: "reason 2"}]}), + it("should fail to create new cloud formation stack and throw a specific deploy error", (done) => { + // setup + stackExistsStub.resolves(false); + createStackStub.resolves(stackId); + const stackInfo = {StackStatus: "ROLLBACK_COMPLETE", Outputs: [{OutputKey: "SkillEndpoint", OutputValue: endpointUri}]}; + getStackStub.resolves(stackInfo); + const stackEvent = { + ResourceStatus: "CREATE_FAILED", + LogicalResourceId: "some resource id", + ResourceType: "some resource type", + ResourceStatusReason: "some failure reason", + }; + getStackEventsStub.resolves([{ResourceStatus: "reason 1"}, stackEvent, {ResourceStatus: "reason 2"}]); + // call + helper.deployStack(stackId, stackName, templateBody, parameters, capabilities).catch((err) => { + // verify + expect(err).instanceOf(CliCFNDeployerError); + expect(err.message).includes(stackEvent.ResourceStatusReason); + expect(createStackStub.args[0]).deep.equal([stackName, templateBody, parameters, capabilities]); + expect(updateStackStub.called).to.be.false; + expect(getStackStub.callCount).equal(1); + expect(getStackEventsStub.callCount).equal(1); + expect(sleepStub.callCount).equal(0); + expect(updateStatusStub.args).deep.equals([ + [`No stack exists or stack has been deleted. Creating cloudformation stack "${stackName}"...`], + [`Current stack status: ${stackInfo.StackStatus}... `], + ]); + done(); + }); }); - return helper.waitForStackDeploy(stackId).catch((err) => { - expect(err).instanceOf(CliCFNDeployerError); - expect(err.message).includes("We could not find details for deploy error"); + it("should fail to update cloud formation stack and throw a generic deploy error", (done) => { + // setup + stackExistsStub.resolves(true); + updateStackStub.resolves(stackId); + const stackInfo = {StackStatus: "UPDATE_ROLLBACK_COMPLETE", Outputs: [{OutputKey: "SkillEndpoint", OutputValue: endpointUri}]}; + getStackStub.resolves(stackInfo); + getStackEventsStub.resolves([{ResourceStatus: "reason 1"}, {ResourceStatus: "reason 2"}]); + // call + helper.deployStack(stackId, stackName, templateBody, parameters, capabilities).catch((err) => { + // verify + expect(err).instanceOf(CliCFNDeployerError); + expect(err.message).includes("We could not find details for deploy error"); + expect(createStackStub.called).to.be.false; + expect(updateStackStub.args[0]).deep.equal([stackId, templateBody, parameters, capabilities]); + expect(getStackStub.callCount).equal(1); + expect(getStackEventsStub.callCount).equal(1); + expect(sleepStub.callCount).equal(0); + expect(updateStatusStub.args).deep.equals([ + [`Updating stack (${stackId})...`], + [`Current stack status: ${stackInfo.StackStatus}... `], + ]); + done(); + }); }); }); - it("should get skill credentials successful", async () => { - const credentials = {clientId: "id", clientSecret: "secret"}; - const response = { body: { skillMessagingCredentials: credentials } }; - sinon.stub(helper.smapiClient.skill, "getSkillCredentials").yields(null, response); - - const result = await helper.getSkillCredentials("skill-id"); - - expect(result).eql(credentials); -}); - -it("should get skill credentials failure", async () => { - const error = "some failure reason"; - sinon.stub(helper.smapiClient.skill, "getSkillCredentials").yields(error); - - return helper.getSkillCredentials("skill-id").catch(err => { - expect(err).eql(error); + describe("# function getSkillCredentials tests", () => { + it("should get skill credentials successful", async () => { + // setup + const credentials = {clientId: "id", clientSecret: "secret"}; + const response = {body: {skillMessagingCredentials: credentials}}; + sinon.stub(helper.smapiClient.skill, "getSkillCredentials").yields(null, response); + // call + const result = await helper.getSkillCredentials("skill-id"); + // verify + expect(result).equal(credentials); }); -}); - afterEach(() => { - sinon.restore(); + it("should get skill credentials failure", (done) => { + // setup + const error = "some failure reason"; + sinon.stub(helper.smapiClient.skill, "getSkillCredentials").yields(error); + // call + helper.getSkillCredentials("skill-id").catch((err) => { + // verify + expect(err).equal(error); + done(); + }); + }); }); }); diff --git a/test/unit/builtins/cfn-deployer/index-test.js b/test/unit/builtins/cfn-deployer/index-test.js index d2d07183..c44b8357 100644 --- a/test/unit/builtins/cfn-deployer/index-test.js +++ b/test/unit/builtins/cfn-deployer/index-test.js @@ -22,9 +22,7 @@ describe("Builtins test - cfn-deployer index test", () => { const endpointUri = "some endpoint uri"; const userDefinedParamKey = "someKey"; const userDefinedParamValue = "someValue"; - let waitForStackDeployStub; - let getAWSProfileStub; - let deployStackStub; + let deployStackStub, getAWSProfileStub, uploadToS3Stub; describe("bootstrap", () => { const bootstrapOptions = { @@ -63,9 +61,7 @@ describe("Builtins test - cfn-deployer index test", () => { }); describe("deploy", () => { - let deployOptions; - let expectedOutput; - let expectedErrorOutput; + let deployOptions, expectedOutput, expectedErrorOutput; beforeEach(() => { expectedOutput = { @@ -122,15 +118,12 @@ describe("Builtins test - cfn-deployer index test", () => { }; getAWSProfileStub = sinon.stub(awsUtil, "getAWSProfile").returns("some profile"); sinon.stub(Helper.prototype, "getSkillCredentials").resolves({clientId: "id", clientSecret: "secret"}); - sinon.stub(Helper.prototype, "createS3BucketIfNotExists").resolves(); - sinon.stub(Helper.prototype, "enableS3BucketVersioningIfNotEnabled").resolves(); - sinon.stub(Helper.prototype, "uploadToS3").resolves({VersionId: s3VersionId}); - deployStackStub = sinon.stub(Helper.prototype, "deployStack").resolves({StackId: stackId}); - waitForStackDeployStub = sinon.stub(Helper.prototype, "waitForStackDeploy"); + uploadToS3Stub = sinon.stub(Helper.prototype, "uploadToS3").resolves({VersionId: s3VersionId}); + deployStackStub = sinon.stub(Helper.prototype, "deployStack"); }); it("should deploy", (done) => { - waitForStackDeployStub.resolves({endpointUri, stackInfo: {Outputs: []}}); + deployStackStub.resolves({stackId, stackInfo: {Outputs: []}, endpointUri}); Deployer.invoke({}, deployOptions, (err, result) => { expect(err).eql(null); @@ -141,7 +134,7 @@ describe("Builtins test - cfn-deployer index test", () => { it("should deploy with skill credentials", (done) => { sinon.stub(fs, "readFileSync").withArgs(templatePath, "utf-8").returns("SkillClientId SkillClientSecret"); - waitForStackDeployStub.resolves({endpointUri, stackInfo: {Outputs: []}}); + deployStackStub.resolves({stackId, stackInfo: {Outputs: []}, endpointUri}); Deployer.invoke({}, deployOptions, (err, result) => { expect(err).eql(null); @@ -151,7 +144,7 @@ describe("Builtins test - cfn-deployer index test", () => { }); it("should deploy without initial state", (done) => { - waitForStackDeployStub.resolves({endpointUri, stackInfo: {Outputs: []}}); + deployStackStub.resolves({stackId, stackInfo: {Outputs: []}, endpointUri}); deployOptions.deployState = undefined; Deployer.invoke({}, deployOptions, (err, result) => { @@ -162,7 +155,7 @@ describe("Builtins test - cfn-deployer index test", () => { }); it("should always deploy with CAPABILITY_IAM capabilities", (done) => { - waitForStackDeployStub.resolves({endpointUri, stackInfo: {Outputs: []}}); + deployStackStub.resolves({stackId, stackInfo: {Outputs: []}, endpointUri}); deployOptions.userConfig.cfn.capabilities = undefined; Deployer.invoke({}, deployOptions, (err, result) => { @@ -174,7 +167,7 @@ describe("Builtins test - cfn-deployer index test", () => { }); it("should deploy without user defined cf parameters", (done) => { - waitForStackDeployStub.resolves({endpointUri, stackInfo: {Outputs: []}}); + deployStackStub.resolves({stackId, stackInfo: {Outputs: []}, endpointUri}); delete deployOptions.userConfig.cfn.parameters; Deployer.invoke({}, deployOptions, (err, result) => { @@ -187,7 +180,7 @@ describe("Builtins test - cfn-deployer index test", () => { it("should invoke deploy and catch deploy error", (done) => { const errorMessage = "some error"; - waitForStackDeployStub.rejects(new CliCFNDeployerError(errorMessage)); + deployStackStub.rejects(new CliCFNDeployerError(errorMessage)); Deployer.invoke({}, deployOptions, (err, result) => { expectedErrorOutput.isCodeDeployed = true; @@ -221,7 +214,7 @@ describe("Builtins test - cfn-deployer index test", () => { it("should not skip deploy when region is not primary deploy region but has different deploy state", (done) => { const deployRegion = "default"; const currentRegion = "NA"; - waitForStackDeployStub.resolves({endpointUri, stackInfo: {Outputs: []}}); + deployStackStub.resolves({stackId, stackInfo: {Outputs: []}, endpointUri}); deployOptions.alexaRegion = currentRegion; deployOptions.deployRegions[currentRegion] = deployOptions.deployRegions[deployRegion]; deployOptions.deployState[currentRegion] = {...deployOptions.deployState[deployRegion], stackId: "different stack id"}; @@ -234,13 +227,26 @@ describe("Builtins test - cfn-deployer index test", () => { }); }); + it("should throw error when failed to upload to s3", (done) => { + const errorMessage = "some error"; + uploadToS3Stub.rejects(new Error(errorMessage)); + + Deployer.invoke({}, deployOptions, (err, result) => { + expectedErrorOutput.resultMessage = + `The CloudFormation deploy failed for Alexa region "${alexaRegion}": Failed to upload code build to S3: ${errorMessage}`; + expect(err).eql(null); + expect(result).eql(expectedErrorOutput); + done(); + }); + }); + it("should throw error when reserved parameter is used", (done) => { deployOptions.userConfig.cfn.parameters.SkillId = "reserved parameter value"; Deployer.invoke({}, deployOptions, (err, result) => { expectedErrorOutput.resultMessage = `The CloudFormation deploy failed for Alexa region "${alexaRegion}": ` + - 'Cloud Formation parameter "SkillId" is reserved. Please use a different name.'; + 'CloudFormation parameter "SkillId" is reserved. Please use a different name.'; expect(err).eql(null); expect(result).eql(expectedErrorOutput); done(); @@ -252,7 +258,7 @@ describe("Builtins test - cfn-deployer index test", () => { Deployer.invoke({}, deployOptions, (err, result) => { expectedErrorOutput.resultMessage = - `The CloudFormation deploy failed for Alexa region "${alexaRegion}": ` + "The template path in userConfig must be provided."; + `The CloudFormation deploy failed for Alexa region "${alexaRegion}": The template path in userConfig must be provided.`; expect(err).eql(null); expect(result).eql(expectedErrorOutput); done(); diff --git a/test/unit/builtins/lambda-deployer/helper-test.js b/test/unit/builtins/lambda-deployer/helper-test.js index ad82dc9f..efebb7a6 100644 --- a/test/unit/builtins/lambda-deployer/helper-test.js +++ b/test/unit/builtins/lambda-deployer/helper-test.js @@ -1,16 +1,25 @@ -const aws = require("aws-sdk"); const {expect} = require("chai"); const fs = require("fs"); const path = require("path"); const sinon = require("sinon"); const helper = require("../../../../lib/builtins/deploy-delegates/lambda-deployer/helper"); -const IAMClient = require("../../../../lib/clients/aws-client/iam-client"); -const LambdaClient = require("../../../../lib/clients/aws-client/lambda-client"); +const IAMClient = require("../../../../lib/clients/aws-client/iam-client").default; +const LambdaClient = require("../../../../lib/clients/aws-client/lambda-client").default; const Manifest = require("../../../../lib/model/manifest"); const ResourcesConfig = require("../../../../lib/model/resources-config"); +const CONSTANTS = require("../../../../lib/utils/constants"); describe("Builtins test - lambda-deployer helper.js test", () => { + const FIXTURE_RESOURCES_CONFIG_FILE_PATH = path.join( + process.cwd(), + "test", + "unit", + "fixture", + "model", + "regular-proj", + "ask-resources.json", + ); const FIXTURE_MANIFEST_FILE_PATH = path.join(process.cwd(), "test", "unit", "fixture", "model", "manifest.json"); const TEST_PROFILE = "default"; // test file uses 'default' profile const TEST_IGNORE_HASH = false; @@ -22,16 +31,11 @@ describe("Builtins test - lambda-deployer helper.js test", () => { const TEST_SKILL_ID = "skill_id"; const TEST_IAM_ROLE_ARN = "iam_role_arn"; const TEST_LAMBDA_ARN = "iam_lambda_arn"; - const TEST_NO_SUCH_ENTITY_ERROR = { - code: "NoSuchEntity", - }; const REPORTER = { updateStatus: () => {}, }; const TEST_ROLE_DATA = { - Role: { - Arn: TEST_IAM_ROLE_ARN, - }, + Arn: TEST_IAM_ROLE_ARN, }; describe("# test class method: loadLambdaInformation", () => { @@ -106,8 +110,8 @@ describe("Builtins test - lambda-deployer helper.js test", () => { it("| an existing lambda arn found in deployState, getFunction request fails, expect an error return", (done) => { // setup - const TEST_GET_FUNCTION_ERROR = "get_function_error"; - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, TEST_GET_FUNCTION_ERROR); + const TEST_GET_FUNCTION_ERROR = new Error("get_function_error"); + sinon.stub(LambdaClient.prototype, "getFunction").rejects(TEST_GET_FUNCTION_ERROR); // call helper.loadLambdaInformation(REPORTER, TEST_LOAD_LAMBDA_OPTION_WITH_LAMBDA_STATE, (err) => { // verify @@ -129,7 +133,7 @@ describe("Builtins test - lambda-deployer helper.js test", () => { }; const TEST_IAM_ROLE_ERROR = `The IAM role for Lambda ARN (${TEST_LAMBDA_ARN}) should be "${TEST_REMOTE_IAM_ROLE}", \ but found "${TEST_LOCAL_IAM_ROLE}". Please solve this IAM role mismatch and re-deploy again. To ignore this error run "ask deploy --ignore-hash".`; - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, null, TEST_REMOTE_DEPLOY_STATE); + sinon.stub(LambdaClient.prototype, "getFunction").resolves(TEST_REMOTE_DEPLOY_STATE); // call helper.loadLambdaInformation(REPORTER, TEST_LOAD_LAMBDA_OPTION_WITH_LAMBDA_STATE, (err) => { // verify @@ -153,7 +157,7 @@ but found "${TEST_LOCAL_IAM_ROLE}". Please solve this IAM role mismatch and re-d const TEST_REVISION_ID_ERROR = `The current revisionId (The revision ID for Lambda ARN (${TEST_LAMBDA_ARN}) should be \ ${TEST_REMOTE_REVISION_ID}, but found ${TEST_LOCAL_REVISION_ID}. \ Please solve this revision mismatch and re-deploy again. To ignore this error run "ask deploy --ignore-hash".`; - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, null, TEST_REMOTE_DEPLOY_STATE); + sinon.stub(LambdaClient.prototype, "getFunction").resolves(TEST_REMOTE_DEPLOY_STATE); // call helper.loadLambdaInformation(REPORTER, TEST_LOAD_LAMBDA_OPTION_WITH_LAMBDA_STATE, (err) => { // verify @@ -174,7 +178,7 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru RevisionId: TEST_REMOTE_REVISION_ID, }, }; - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, null, TEST_REMOTE_DEPLOY_STATE); + sinon.stub(LambdaClient.prototype, "getFunction").resolves(TEST_REMOTE_DEPLOY_STATE); // call helper.loadLambdaInformation(REPORTER, TEST_LOAD_LAMBDA_OPTION_WITH_LAMBDA_STATE_IGNORE_HASH, (err, data) => { // verify @@ -192,7 +196,7 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru RevisionId: TEST_LOCAL_REVISION_ID, }, }; - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, null, TEST_REMOTE_DEPLOY_STATE); + sinon.stub(LambdaClient.prototype, "getFunction").resolves(TEST_REMOTE_DEPLOY_STATE); // call helper.loadLambdaInformation(REPORTER, TEST_LOAD_LAMBDA_OPTION_WITH_LAMBDA_STATE, (err, data) => { // verify @@ -204,8 +208,8 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru it("| using Lambda arn from sourceLambda, getFunction return error, expect error called back", (done) => { // setup - const GET_FUNC_ERR = "get func err"; - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, GET_FUNC_ERR); + const GET_FUNC_ERR = new Error("get func err"); + sinon.stub(LambdaClient.prototype, "getFunction").rejects(GET_FUNC_ERR); // call helper.loadLambdaInformation(REPORTER, TEST_LOAD_LAMBDA_OPTION_WITH_SOURCELAMBDA, (err, data) => { // verify @@ -223,7 +227,7 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru RevisionId: TEST_REMOTE_REVISION_ID, }, }; - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, null, TEST_REMOTE_DEPLOY_STATE); + sinon.stub(LambdaClient.prototype, "getFunction").resolves(TEST_REMOTE_DEPLOY_STATE); // call helper.loadLambdaInformation(REPORTER, TEST_LOAD_LAMBDA_OPTION_WITH_SOURCELAMBDA, (err, data) => { // verify @@ -259,33 +263,41 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru sinon.restore(); }); - it("| an existing IAM role found, get IAM Role fails, expect an error return", (done) => { + it("| an existing IAM role found, get IAM Role bad request error, expect an error return", (done) => { // setup - const TEST_ERROR = "getRole error message"; - sinon.stub(IAMClient.prototype, "getIAMRole").callsArgWith(1, TEST_ERROR); + const TEST_IAM_ERROR = { + $metadata: { + httpStatusCode: 400, + }, + }; + sinon.stub(IAMClient.prototype, "getIAMRole").rejects(TEST_IAM_ERROR); // call helper.deployIAMRole(REPORTER, TEST_IAM_CONFIG, (err) => { // verify - expect(err).equal(`Failed to retrieve IAM role (${TEST_IAM_ROLE_ARN}) for Lambda. ${TEST_ERROR}`); + expect(err).equal(`Failed to retrieve IAM role (${TEST_IAM_ROLE_ARN}) for Lambda. ${TEST_IAM_ERROR}`); done(); }); }); - it('| an existing IAM role found, get IAM Role throw "NoSuchEntity" error, expect an error return', (done) => { + it("| an existing IAM role found, get IAM Role not found error, expect an error return", (done) => { // setup - const TEST_GET_ROLE_ERROR = `The IAM role is not found. Please check if your IAM role from region ${TEST_ALEXA_REGION} is valid.`; - sinon.stub(IAMClient.prototype, "getIAMRole").callsArgWith(1, TEST_NO_SUCH_ENTITY_ERROR); + const TEST_IAM_ERROR = { + $metadata: { + httpStatusCode: 404, + }, + }; + sinon.stub(IAMClient.prototype, "getIAMRole").rejects(TEST_IAM_ERROR); // call helper.deployIAMRole(REPORTER, TEST_IAM_CONFIG, (err) => { // verify - expect(err).equal(TEST_GET_ROLE_ERROR); + expect(err).equal(`The IAM role is not found. Please check if your IAM role from region ${TEST_ALEXA_REGION} is valid.`); done(); }); }); it("| an existing IAM role found, get IAM Role passes, expect correct data return", (done) => { // setup - sinon.stub(IAMClient.prototype, "getIAMRole").callsArgWith(1, null, TEST_ROLE_DATA); + sinon.stub(IAMClient.prototype, "getIAMRole").resolves(TEST_ROLE_DATA); // call helper.deployIAMRole(REPORTER, TEST_IAM_CONFIG, (err, res) => { // verify @@ -296,8 +308,8 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru it("| no IAM role found, create IAM role fails, expect an error return", (done) => { // setup - const TEST_CREATE_ROLE_ERROR = "createIAMRole error message"; - sinon.stub(IAMClient.prototype, "createBasicLambdaRole").callsArgWith(1, TEST_CREATE_ROLE_ERROR); + const TEST_CREATE_ROLE_ERROR = new Error("createIAMRole error message"); + sinon.stub(IAMClient.prototype, "createBasicLambdaRole").rejects(TEST_CREATE_ROLE_ERROR); // call helper.deployIAMRole(REPORTER, TEST_IAM_CONFIG_NO_ROLE, (err) => { // verify @@ -308,9 +320,9 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru it("| no IAM role found, create IAM role passes, attach role policy fails, expect an error return", (done) => { // setup - const TEST_POLICY_ERROR = "attachRolePolicy error message"; - sinon.stub(IAMClient.prototype, "createBasicLambdaRole").callsArgWith(1, null, TEST_ROLE_DATA); - sinon.stub(IAMClient.prototype, "attachBasicLambdaRolePolicy").callsArgWith(1, TEST_POLICY_ERROR); + const TEST_POLICY_ERROR = new Error("attachRolePolicy error message"); + sinon.stub(IAMClient.prototype, "createBasicLambdaRole").resolves(TEST_ROLE_DATA); + sinon.stub(IAMClient.prototype, "attachBasicLambdaRolePolicy").rejects(TEST_POLICY_ERROR); // call helper.deployIAMRole(REPORTER, TEST_IAM_CONFIG_NO_ROLE, (err) => { // verify @@ -321,8 +333,8 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru it("| no IAM role found, create IAM role and attach role policy passes, expect a IAM role arn return.", (done) => { // setup - sinon.stub(IAMClient.prototype, "createBasicLambdaRole").callsArgWith(1, null, TEST_ROLE_DATA); - sinon.stub(IAMClient.prototype, "attachBasicLambdaRolePolicy").callsArgWith(1, null, TEST_IAM_ROLE_ARN); + sinon.stub(IAMClient.prototype, "createBasicLambdaRole").resolves(TEST_ROLE_DATA); + sinon.stub(IAMClient.prototype, "attachBasicLambdaRolePolicy").resolves(TEST_IAM_ROLE_ARN); // call helper.deployIAMRole(REPORTER, TEST_IAM_CONFIG_NO_ROLE, (err, res) => { // verify @@ -390,20 +402,21 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru }; beforeEach(() => { + new ResourcesConfig(FIXTURE_RESOURCES_CONFIG_FILE_PATH); new Manifest(FIXTURE_MANIFEST_FILE_PATH); }); afterEach(() => { + ResourcesConfig.dispose(); Manifest.dispose(); sinon.restore(); }); it("| no Lambda found, create Lambda function fails, expect an error return.", (done) => { // setup - const TEST_CREATE_FUNCTION_ERROR = "createLambdaFunction error"; + const TEST_CREATE_FUNCTION_ERROR = new Error("createLambdaFunction error"); sinon.stub(fs, "readFileSync").withArgs(TEST_ZIP_FILE_PATH).returns(TEST_ZIP_FILE); - sinon.stub(aws, "Lambda"); - sinon.stub(LambdaClient.prototype, "createLambdaFunction").callsArgWith(4, TEST_CREATE_FUNCTION_ERROR); + sinon.stub(LambdaClient.prototype, "createLambdaFunction").rejects(TEST_CREATE_FUNCTION_ERROR); // call helper.deployLambdaFunction(REPORTER, TEST_CREATE_OPTIONS, (err) => { // verify @@ -417,16 +430,15 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru " add Alexa Permission fails, expect an error return.", (done) => { // setup - const RETRY_MESSAGE = "The role defined for the function cannot be assumed by Lambda."; - const TEST_CREATE_FUNCTION_ERROR = {message: RETRY_MESSAGE}; - const TEST_ADD_PERMISSION_ERROR = "addAlexaPermissionByDomain error"; + const TEST_CREATE_FUNCTION_ERROR = new Error(CONSTANTS.LAMBDA.ERROR_MESSAGE.ROLE_NOT_ASSUMED); + const TEST_ADD_PERMISSION_ERROR = new Error("addAlexaPermissionByDomain error"); sinon.stub(fs, "readFileSync").withArgs(TEST_ZIP_FILE_PATH).returns(TEST_ZIP_FILE); - sinon.stub(aws, "Lambda"); const stubTestFunc = sinon.stub(LambdaClient.prototype, "createLambdaFunction"); - stubTestFunc.onCall(0).callsArgWith(4, TEST_CREATE_FUNCTION_ERROR); - stubTestFunc.onCall(1).callsArgWith(4, null, TEST_CREATE_DATA); - sinon.stub(LambdaClient.prototype, "addAlexaPermissionByDomain").callsArgWith(3, TEST_ADD_PERMISSION_ERROR); - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, null, TEST_GET_DATA); + stubTestFunc.onCall(0).rejects(TEST_CREATE_FUNCTION_ERROR); + stubTestFunc.onCall(1).resolves(TEST_CREATE_DATA); + sinon.stub(LambdaClient.prototype, "addAlexaPermissionByDomain").rejects(TEST_ADD_PERMISSION_ERROR); + sinon.stub(LambdaClient.prototype, "getFunction").resolves(TEST_GET_DATA); + sinon.useFakeTimers().tickAsync(CONSTANTS.CONFIGURATION.RETRY.MAX_RETRY_INTERVAL); // call helper.deployLambdaFunction(REPORTER, TEST_CREATE_OPTIONS, (err) => { // verify @@ -434,16 +446,15 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru done(); }); }, - ).timeout(10000); + ); it("| no Lambda found, create Lambda function passes but not in active state, expect an error return.", (done) => { // setup const TEST_GET_STATE_DATA = {Configuration: {State: "Inactive"}}; const TEST_GET_STATE_ERROR = `Function [${TEST_FUNCTION_ARN}] state is Inactive.`; sinon.stub(fs, "readFileSync").withArgs(TEST_ZIP_FILE_PATH).returns(TEST_ZIP_FILE); - sinon.stub(aws, "Lambda"); - sinon.stub(LambdaClient.prototype, "createLambdaFunction").callsArgWith(4, null, TEST_CREATE_DATA); - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, null, TEST_GET_STATE_DATA); + sinon.stub(LambdaClient.prototype, "createLambdaFunction").resolves(TEST_CREATE_DATA); + sinon.stub(LambdaClient.prototype, "getFunction").resolves(TEST_GET_STATE_DATA); // call helper.deployLambdaFunction(REPORTER, TEST_CREATE_OPTIONS, (err) => { // verify @@ -454,12 +465,11 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru it("| no Lambda found, create Lambda function passes, add Alexa Permission fails, expect an error return.", (done) => { // setup - const TEST_ADD_PERMISSION_ERROR = "addAlexaPermissionByDomain error"; + const TEST_ADD_PERMISSION_ERROR = new Error("addAlexaPermissionByDomain error"); sinon.stub(fs, "readFileSync").withArgs(TEST_ZIP_FILE_PATH).returns(TEST_ZIP_FILE); - sinon.stub(aws, "Lambda"); - sinon.stub(LambdaClient.prototype, "createLambdaFunction").callsArgWith(4, null, TEST_CREATE_DATA); - sinon.stub(LambdaClient.prototype, "addAlexaPermissionByDomain").callsArgWith(3, TEST_ADD_PERMISSION_ERROR); - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, null, TEST_GET_DATA); + sinon.stub(LambdaClient.prototype, "createLambdaFunction").resolves(TEST_CREATE_DATA); + sinon.stub(LambdaClient.prototype, "addAlexaPermissionByDomain").rejects(TEST_ADD_PERMISSION_ERROR); + sinon.stub(LambdaClient.prototype, "getFunction").resolves(TEST_GET_DATA); // call helper.deployLambdaFunction(REPORTER, TEST_CREATE_OPTIONS, (err) => { // verify @@ -473,14 +483,13 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru " expect an error return.", (done) => { // setup - const TEST_REVISION_ID_ERROR = "getFunctionRevisionId error"; + const TEST_REVISION_ID_ERROR = new Error("getFunctionRevisionId error"); sinon.stub(fs, "readFileSync").withArgs(TEST_ZIP_FILE_PATH).returns(TEST_ZIP_FILE); - sinon.stub(aws, "Lambda"); - sinon.stub(LambdaClient.prototype, "createLambdaFunction").callsArgWith(4, null, TEST_CREATE_DATA); - sinon.stub(LambdaClient.prototype, "addAlexaPermissionByDomain").callsArgWith(3, null); + sinon.stub(LambdaClient.prototype, "createLambdaFunction").resolves(TEST_CREATE_DATA); + sinon.stub(LambdaClient.prototype, "addAlexaPermissionByDomain").resolves(); const stubTestFunc = sinon.stub(LambdaClient.prototype, "getFunction"); - stubTestFunc.onCall(0).callsArgWith(1, null, TEST_GET_DATA); - stubTestFunc.onCall(1).callsArgWith(1, TEST_REVISION_ID_ERROR); + stubTestFunc.onCall(0).resolves(TEST_GET_DATA); + stubTestFunc.onCall(1).rejects(TEST_REVISION_ID_ERROR); // call helper.deployLambdaFunction(REPORTER, TEST_CREATE_OPTIONS, (err) => { @@ -497,14 +506,14 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru (done) => { // setup sinon.stub(fs, "readFileSync").withArgs(TEST_ZIP_FILE_PATH).returns(TEST_ZIP_FILE); - sinon.stub(aws, "Lambda"); - sinon.stub(LambdaClient.prototype, "createLambdaFunction").callsArgWith(4, null, TEST_CREATE_DATA); - sinon.stub(LambdaClient.prototype, "addAlexaPermissionByDomain").callsArgWith(3, null); - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, null, TEST_GET_DATA); + sinon.stub(LambdaClient.prototype, "createLambdaFunction").resolves(TEST_CREATE_DATA); + sinon.stub(LambdaClient.prototype, "addAlexaPermissionByDomain").resolves(); + sinon.stub(LambdaClient.prototype, "getFunction").resolves(TEST_GET_DATA); // call helper.deployLambdaFunction(REPORTER, TEST_CREATE_OPTIONS, (err, res) => { // verify + expect(err).to.be.null; expect(res).deep.equal({ isAllStepSuccess: true, isCodeDeployed: true, @@ -525,15 +534,15 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru (done) => { // setup sinon.stub(fs, "readFileSync").withArgs(TEST_ZIP_FILE_PATH).returns(TEST_ZIP_FILE); - sinon.stub(aws, "Lambda"); sinon.stub(ResourcesConfig.prototype, "getTargetEndpoints").returns([]); - sinon.stub(LambdaClient.prototype, "createLambdaFunction").callsArgWith(4, null, TEST_CREATE_DATA); - sinon.stub(LambdaClient.prototype, "addAlexaPermissionByDomain").callsArgWith(3, null); - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, null, TEST_GET_DATA); + sinon.stub(LambdaClient.prototype, "createLambdaFunction").resolves(TEST_CREATE_DATA); + sinon.stub(LambdaClient.prototype, "addAlexaPermissionByDomain").resolves(); + sinon.stub(LambdaClient.prototype, "getFunction").resolves(TEST_GET_DATA); // call helper.deployLambdaFunction(REPORTER, TEST_CREATE_OPTIONS, (err, res) => { // verify + expect(err).to.be.null; expect(res).deep.equal({ isAllStepSuccess: true, isCodeDeployed: true, @@ -550,10 +559,9 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru it("| an existing Lambda found, update function code fails, expect an error return.", (done) => { // setup - const TEST_UPDATE_CODE_ERROR = "updateFunctionCode error"; + const TEST_UPDATE_CODE_ERROR = new Error("updateFunctionCode error"); sinon.stub(fs, "readFileSync").withArgs(TEST_ZIP_FILE_PATH).returns(TEST_ZIP_FILE); - sinon.stub(aws, "Lambda"); - sinon.stub(LambdaClient.prototype, "updateFunctionCode").callsArgWith(3, TEST_UPDATE_CODE_ERROR); + sinon.stub(LambdaClient.prototype, "updateFunctionCode").rejects(TEST_UPDATE_CODE_ERROR); // call helper.deployLambdaFunction(REPORTER, TEST_UPDATE_OPTIONS, (err) => { // verify @@ -567,9 +575,8 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru const TEST_GET_UPDATE_STATUS_DATA = {Configuration: {State: "Active", LastUpdateStatus: "Failed"}}; const TEST_GET_UPDATE_STATUS_ERROR = `Function [${TEST_FUNCTION_ARN}] last update status is Failed.`; sinon.stub(fs, "readFileSync").withArgs(TEST_ZIP_FILE_PATH).returns(TEST_ZIP_FILE); - sinon.stub(aws, "Lambda"); - sinon.stub(LambdaClient.prototype, "updateFunctionCode").callsArgWith(3, null, {RevisionId: TEST_REVISION_ID}); - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, null, TEST_GET_UPDATE_STATUS_DATA); + sinon.stub(LambdaClient.prototype, "updateFunctionCode").resolves({RevisionId: TEST_REVISION_ID}); + sinon.stub(LambdaClient.prototype, "getFunction").resolves(TEST_GET_UPDATE_STATUS_DATA); // call helper.deployLambdaFunction(REPORTER, TEST_UPDATE_OPTIONS, (err, res) => { // verify @@ -580,16 +587,15 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru it("| an existing Lambda found, update function code passes, update function configuration fails, expect an error return.", (done) => { // setup - const TEST_UPDATE_CONFIG_ERROR = "updateFunctionConfiguration error"; + const TEST_UPDATE_CONFIG_ERROR = new Error("updateFunctionConfiguration error"); sinon.stub(fs, "readFileSync").withArgs(TEST_ZIP_FILE_PATH).returns(TEST_ZIP_FILE); - sinon.stub(aws, "Lambda"); - sinon.stub(LambdaClient.prototype, "updateFunctionCode").callsArgWith(3, null, {RevisionId: TEST_REVISION_ID}); - sinon.stub(LambdaClient.prototype, "updateFunctionConfiguration").callsArgWith(3, TEST_UPDATE_CONFIG_ERROR); - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, null, TEST_GET_DATA); + sinon.stub(LambdaClient.prototype, "updateFunctionCode").resolves({RevisionId: TEST_REVISION_ID}); + sinon.stub(LambdaClient.prototype, "updateFunctionConfiguration").rejects(TEST_UPDATE_CONFIG_ERROR); + sinon.stub(LambdaClient.prototype, "getFunction").resolves(TEST_GET_DATA); // call helper.deployLambdaFunction(REPORTER, TEST_UPDATE_OPTIONS, (err, res) => { // verify - expect(err).equal(null); + expect(err).to.be.null; expect(res).deep.equal({ isAllStepSuccess: false, isCodeDeployed: true, @@ -612,13 +618,13 @@ Please solve this revision mismatch and re-deploy again. To ignore this error ru RevisionId: TEST_REVISION_ID, }; sinon.stub(fs, "readFileSync").withArgs(TEST_ZIP_FILE_PATH).returns(TEST_ZIP_FILE); - sinon.stub(aws, "Lambda"); - sinon.stub(LambdaClient.prototype, "updateFunctionCode").callsArgWith(3, null, {RevisionId: TEST_REVISION_ID}); - sinon.stub(LambdaClient.prototype, "updateFunctionConfiguration").callsArgWith(3, null, TEST_UPDATE_CONFIG_DATA); - sinon.stub(LambdaClient.prototype, "getFunction").callsArgWith(1, null, TEST_GET_DATA); + sinon.stub(LambdaClient.prototype, "updateFunctionCode").resolves({RevisionId: TEST_REVISION_ID}); + sinon.stub(LambdaClient.prototype, "updateFunctionConfiguration").resolves(TEST_UPDATE_CONFIG_DATA); + sinon.stub(LambdaClient.prototype, "getFunction").resolves(TEST_GET_DATA); // call helper.deployLambdaFunction(REPORTER, TEST_UPDATE_OPTIONS, (err, data) => { // verify + expect(err).to.be.null; expect(data).deep.equal({ isAllStepSuccess: true, isCodeDeployed: true, diff --git a/test/unit/builtins/lambda-deployer/index-test.js b/test/unit/builtins/lambda-deployer/index-test.js index 61a856ea..4d10369b 100644 --- a/test/unit/builtins/lambda-deployer/index-test.js +++ b/test/unit/builtins/lambda-deployer/index-test.js @@ -250,10 +250,10 @@ with output Lambda ARN: ${LAMBDA_ARN}.`; alexaRegion: TEST_ALEXA_REGION_NA, deployState: { [TEST_ALEXA_REGION_DEFAULT]: { - property: "1" + property: "1", }, [TEST_ALEXA_REGION_NA]: { - property: "2" + property: "2", }, }, deployRegions: { @@ -275,7 +275,6 @@ with output Lambda ARN: ${LAMBDA_ARN}.`; // call lambdaDeployer.invoke(REPORTER, TEST_OPTIONS_WITH_MULTI_REGIONS, (err, res) => { // verify - console.log(res); expect(res.isAllStepSuccess).equal(true); expect(res.isCodeDeployed).equal(true); expect(res.isDeploySkipped).equal(undefined); diff --git a/test/unit/clients/aws-client/abstract-aws-client-test.js b/test/unit/clients/aws-client/abstract-aws-client-test.js deleted file mode 100644 index 0e260bac..00000000 --- a/test/unit/clients/aws-client/abstract-aws-client-test.js +++ /dev/null @@ -1,49 +0,0 @@ -const {expect} = require("chai"); -const aws = require("aws-sdk"); -const CONSTANTS = require("../../../../lib/utils/constants"); - -const AbstractAwsClient = require("../../../../lib/clients/aws-client/abstract-aws-client"); - -describe("Clients test - abstract client test", () => { - const TEST_AWS_PROFILE = "TEST_AWS_PROFILE"; - const TEST_AWS_REGION = "TEST_AWS_REGION"; - let configuration; - beforeEach(() => { - aws.config.credentials.profile = null; - configuration = { - awsProfile: TEST_AWS_PROFILE, - awsRegion: TEST_AWS_REGION, - }; - }); - - describe("# constructor tests", () => { - it("| should set region and credentials profile", () => { - const client = new AbstractAwsClient(configuration); - expect(client).to.be.instanceof(AbstractAwsClient); - expect(client.awsRegion).eql(TEST_AWS_REGION); - expect(client.awsProfile).eql(TEST_AWS_PROFILE); - expect(aws.config.region).eql(TEST_AWS_REGION); - expect(aws.config.credentials.profile).eql(TEST_AWS_PROFILE); - }); - - it("| should not set credentials profile since using env variables", () => { - configuration.awsProfile = CONSTANTS.PLACEHOLDER.ENVIRONMENT_VAR.AWS_CREDENTIALS; - const client = new AbstractAwsClient(configuration); - expect(client).to.be.instanceof(AbstractAwsClient); - expect(client.awsRegion).eql(TEST_AWS_REGION); - expect(client.awsProfile).eql(CONSTANTS.PLACEHOLDER.ENVIRONMENT_VAR.AWS_CREDENTIALS); - expect(aws.config.region).eql(TEST_AWS_REGION); - expect(aws.config.credentials.profile).eql(null); - }); - - it("| should throw error when aws profile is not specified ", () => { - configuration.awsProfile = null; - expect(() => new AbstractAwsClient(configuration)).to.throw("Invalid awsProfile or Invalid awsRegion"); - }); - - it("| should throw error when aws region is not specified ", () => { - configuration.awsRegion = null; - expect(() => new AbstractAwsClient(configuration)).to.throw("Invalid awsProfile or Invalid awsRegion"); - }); - }); -}); diff --git a/test/unit/clients/aws-client/abstract-aws-client-test.ts b/test/unit/clients/aws-client/abstract-aws-client-test.ts new file mode 100644 index 00000000..3661387e --- /dev/null +++ b/test/unit/clients/aws-client/abstract-aws-client-test.ts @@ -0,0 +1,68 @@ +import {expect} from "chai"; +import sinon from "sinon"; +import proxyquire from "proxyquire"; + +import CONSTANTS from "../../../../lib/utils/constants"; +import {AwsClientConfiguration} from "../../../../lib/clients/aws-client/abstract-aws-client"; + +describe("Clients test - abstract client test", () => { + const TEST_AWS_PROFILE = "TEST_AWS_PROFILE"; + const TEST_AWS_REGION = "TEST_AWS_REGION"; + const TEST_CREDS_FROM_ENV = "TEST_CREDS_FROM_ENV"; + const TEST_CREDS_FROM_INI = "TEST_CREDS_FROM_INI"; + let configuration: AwsClientConfiguration, fromEnvStub: sinon.SinonStub, fromIniStub: sinon.SinonStub, AbstractAwsClient: any; + + beforeEach(() => { + configuration = { + awsProfile: TEST_AWS_PROFILE, + awsRegion: TEST_AWS_REGION, + }; + fromEnvStub = sinon.stub().returns(TEST_CREDS_FROM_ENV); + fromIniStub = sinon.stub().returns(TEST_CREDS_FROM_INI); + AbstractAwsClient = proxyquire("../../../../lib/clients/aws-client/abstract-aws-client", { + "@aws-sdk/credential-providers": { + fromEnv: fromEnvStub, + fromIni: fromIniStub, + }, + }).default; + }); + + afterEach(() => { + sinon.restore(); + }); + + describe("# constructor tests", () => { + it("| should set region and credentials profile", () => { + const client = new AbstractAwsClient(configuration); + expect(client).to.be.instanceof(AbstractAwsClient); + expect(client.credentials).eql(TEST_CREDS_FROM_INI); + expect(client.profile).eql(TEST_AWS_PROFILE); + expect(client.region).eql(TEST_AWS_REGION); + expect(fromEnvStub.called).to.be.false; + expect(fromIniStub.args[0][0]).to.deep.equal({ + profile: TEST_AWS_PROFILE, + }); + }); + + it("| should not set credentials profile since using env variables", () => { + configuration.awsProfile = CONSTANTS.PLACEHOLDER.ENVIRONMENT_VAR.AWS_CREDENTIALS; + const client = new AbstractAwsClient(configuration); + expect(client).to.be.instanceof(AbstractAwsClient); + expect(client.credentials).eql(TEST_CREDS_FROM_ENV); + expect(client.profile).eql(CONSTANTS.PLACEHOLDER.ENVIRONMENT_VAR.AWS_CREDENTIALS); + expect(client.region).eql(TEST_AWS_REGION); + expect(fromEnvStub.called).to.be.true; + expect(fromIniStub.called).to.be.false; + }); + + it("| should throw error when aws profile is not specified ", () => { + delete configuration.awsProfile; + expect(() => new AbstractAwsClient(configuration)).to.throw("Invalid awsProfile or Invalid awsRegion"); + }); + + it("| should throw error when aws region is not specified ", () => { + delete configuration.awsRegion; + expect(() => new AbstractAwsClient(configuration)).to.throw("Invalid awsProfile or Invalid awsRegion"); + }); + }); +}); diff --git a/test/unit/clients/aws-client/aws-util-test.js b/test/unit/clients/aws-client/aws-util-test.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/unit/clients/aws-client/aws-util-test.ts b/test/unit/clients/aws-client/aws-util-test.ts new file mode 100644 index 00000000..d90215cc --- /dev/null +++ b/test/unit/clients/aws-client/aws-util-test.ts @@ -0,0 +1,126 @@ +import {expect} from "chai"; +import sinon from "sinon"; +import proxyquire from "proxyquire"; +import fs from "fs-extra"; + +import CONSTANTS from "../../../../lib/utils/constants"; + +describe("Clients test - aws util test", () => { + const TEST_ASK_PROFILE = "TEST_ASK_PROFILE"; + const TEST_AWS_PROFILE = "TEST_AWS_PROFILE"; + const TEST_AWS_DEFAULT_PROFILE = "TEST_AWS_DEFAULT_PROFILE"; + let awsUtil: any, parseKnownFilesStub: sinon.SinonStub; + + beforeEach(() => { + parseKnownFilesStub = sinon.stub(); + awsUtil = proxyquire("../../../../lib/clients/aws-client/aws-util", { + "@smithy/shared-ini-file-loader": { + DEFAULT_PROFILE: TEST_AWS_DEFAULT_PROFILE, + parseKnownFiles: parseKnownFilesStub, + }, + }); + }); + + afterEach(() => { + sinon.restore(); + }); + + describe("# function getAWSProfile tests", () => { + afterEach(() => { + delete process.env.AWS_ACCESS_KEY_ID; + delete process.env.AWS_SECRET_ACCESS_KEY; + }); + + it("| enviroment variable ask profile with undefined aws enviroment variables, expect error return.", () => { + // setup + const TEST_ASK_PROFILE = CONSTANTS.PLACEHOLDER.ENVIRONMENT_VAR.PROFILE_NAME; + const TEST_GET_AWS_PROFILE_ERR = "Environmental variables AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY not defined."; + // call/verify + expect(() => awsUtil.getAWSProfile(TEST_ASK_PROFILE)).throw(TEST_GET_AWS_PROFILE_ERR); + }); + + it("| enviroment variable ask profile, expect enviroment variable aws profile return.", () => { + // setup + const TEST_ASK_PROFILE = CONSTANTS.PLACEHOLDER.ENVIRONMENT_VAR.PROFILE_NAME; + process.env.AWS_ACCESS_KEY_ID = "TEST_AWS_REGION_KEY_ID"; + process.env.AWS_SECRET_ACCESS_KEY = "TEST_AWS_SECRET_ACCESS_KEY"; + // call/verify + expect(awsUtil.getAWSProfile(TEST_ASK_PROFILE)).equal(CONSTANTS.PLACEHOLDER.ENVIRONMENT_VAR.AWS_CREDENTIALS); + }); + + it("| standard ask profile with invalid ask cli config, expect error return.", () => { + // setup + const TEST_GET_AWS_PROFILE_ERR = new Error("Parse error"); + sinon.stub(fs, "readJSONSync").throws(TEST_GET_AWS_PROFILE_ERR); + // call/verify + expect(() => awsUtil.getAWSProfile(TEST_ASK_PROFILE)).throw(TEST_GET_AWS_PROFILE_ERR); + }); + + it("| standard ask profile unconfigured, expect undefined profile return.", () => { + // setup + const TEST_ASK_CONFIG = { + profiles: {}, + }; + sinon.stub(fs, "readJSONSync").returns(TEST_ASK_CONFIG); + // call/verify + expect(awsUtil.getAWSProfile(TEST_ASK_PROFILE)).to.be.undefined; + }); + + it("| standard ask profile, expect ask cli config aws profile return.", () => { + // setup + const TEST_ASK_CONFIG = { + profiles: { + [TEST_ASK_PROFILE]: { + aws_profile: TEST_AWS_PROFILE, + }, + }, + }; + sinon.stub(fs, "readJSONSync").returns(TEST_ASK_CONFIG); + // call/verify + expect(awsUtil.getAWSProfile(TEST_ASK_PROFILE)).equal(TEST_AWS_PROFILE); + }); + }); + + describe("# function getCLICompatibleDefaultRegion tests", () => { + const TEST_AWS_REGION = "TEST_AWS_REGION"; + + afterEach(() => { + delete process.env.AWS_REGION; + }); + + it("| defined enviroment variable region, expect enviroment variable region return.", async () => { + // setup + process.env.AWS_REGION = TEST_AWS_REGION; + // call + const region = await awsUtil.getCLICompatibleDefaultRegion(TEST_AWS_PROFILE); + // verify + expect(region).equal(TEST_AWS_REGION); + expect(parseKnownFilesStub.called).to.be.false; + }); + + it("| undefined enviroment variable region, expect aws config file region return.", async () => { + // setup + const TEST_AWS_CONFIG = { + [TEST_AWS_PROFILE]: { + region: TEST_AWS_REGION, + }, + }; + parseKnownFilesStub.resolves(TEST_AWS_CONFIG); + // call + const region = await awsUtil.getCLICompatibleDefaultRegion(TEST_AWS_PROFILE); + // verify + expect(region).equal(TEST_AWS_REGION); + expect(parseKnownFilesStub.called).to.be.true; + }); + + it("| undefined enviroment variable region and undefined aws profile, expect default region return.", async () => { + // setup + parseKnownFilesStub.rejects(); + // call + const region = await awsUtil.getCLICompatibleDefaultRegion(); + // verify + expect(region).equal(CONSTANTS.AWS_SKILL_INFRASTRUCTURE_DEFAULT_REGION); + expect(parseKnownFilesStub.called).to.be.true; + }); + }); +}); diff --git a/test/unit/clients/aws-client/cloudformation-client-test.js b/test/unit/clients/aws-client/cloudformation-client-test.js deleted file mode 100644 index 035a5ace..00000000 --- a/test/unit/clients/aws-client/cloudformation-client-test.js +++ /dev/null @@ -1,382 +0,0 @@ -const {expect} = require("chai"); -const sinon = require("sinon"); -const aws = require("aws-sdk"); - -const CloudformationClient = require("../../../../lib/clients/aws-client/cloudformation-client"); - -const noop = () => {}; - -describe("Clients test - cloudformation client test", () => { - const TEST_AWS_PROFILE = "AWS_PROFILE"; - const TEST_AWS_REGION = "AWS_REGION"; - const TEST_CLIENT_ERROR = "CLIENT_ERR"; - const TEST_CLIENT_RESPONSE = "CLIENT_RESPONSE"; - const TEST_CONFIGURATION = { - awsProfile: TEST_AWS_PROFILE, - awsRegion: TEST_AWS_REGION, - }; - const TEST_CREATE_RESPONSE = { - StackId: "someId", - }; - const TEST_UPDATE_RESPONSE = { - StackId: "someId", - }; - let createStackStub, updateStackStub, describeStackStub, describeStackResourceStub, describeStackResourcesStub; - - beforeEach(() => { - createStackStub = sinon.stub().returns({promise: sinon.stub().resolves({...TEST_CREATE_RESPONSE})}); - updateStackStub = sinon.stub().returns({promise: sinon.stub().resolves({...TEST_UPDATE_RESPONSE})}); - describeStackStub = sinon.stub(); - describeStackResourceStub = sinon.stub(); - describeStackResourcesStub = sinon.stub(); - sinon.stub(aws, "CloudFormation").returns({ - createStack: createStackStub, - updateStack: updateStackStub, - describeStacks: describeStackStub, - describeStackResource: describeStackResourceStub, - describeStackResources: describeStackResourcesStub, - }); - }); - - afterEach(() => { - sinon.restore(); - }); - - describe("Check correctness for constructor function", () => { - it("| inspect correctness for constructor when awsRegion is set in configuration", () => { - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - expect(cfnClient).to.be.instanceof(CloudformationClient); - expect(cfnClient.awsRegion).equal(TEST_AWS_REGION); - expect(aws.config.region).equal(TEST_AWS_REGION); - expect(aws.config.credentials).deep.equal(new aws.SharedIniFileCredentials({profile: TEST_AWS_PROFILE})); - }); - - it("| throw error when awsProfile or awsRegion is not passed in", () => { - try { - new CloudformationClient({}); - } catch (e) { - expect(e.message).equal("Invalid awsProfile or Invalid awsRegion"); - } - }); - }); - - describe("Test client method - createStack()", () => { - const TEST_STACK_NAME = "STACK"; - const TEST_TEMPLATE = "TEMPLATE_CONTENT"; - const TEST_PARAMETERS = { - key: "value", - }; - - it("| call aws-sdk createStack method with same params from input", () => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - // call - cfnClient.createStack(TEST_STACK_NAME, TEST_TEMPLATE, TEST_PARAMETERS); - // verify - expect(createStackStub.args[0][0].StackName).equal(TEST_STACK_NAME); - expect(createStackStub.args[0][0].TemplateBody).equal(TEST_TEMPLATE); - expect(createStackStub.args[0][0].Capabilities).deep.equal(["CAPABILITY_IAM"]); - expect(createStackStub.args[0][0].Parameters).deep.equal(TEST_PARAMETERS); - }); - - it("| call aws-sdk createStack method with same params from input without parameters", () => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - // call - cfnClient.createStack(TEST_STACK_NAME, TEST_TEMPLATE, {}); - // verify - expect(createStackStub.args[0][0].StackName).equal(TEST_STACK_NAME); - expect(createStackStub.args[0][0].TemplateBody).equal(TEST_TEMPLATE); - expect(createStackStub.args[0][0].Capabilities).deep.equal(["CAPABILITY_IAM"]); - expect(createStackStub.args[0][0].Parameters).equal(undefined); - }); - - it("| createStack returns response when client request succeeds", async () => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - - // call - const res = await cfnClient.createStack(TEST_STACK_NAME, TEST_TEMPLATE, TEST_PARAMETERS); - - expect(res).eql(TEST_CREATE_RESPONSE); - }); - }); - - describe("Test client method - updateStack()", () => { - const TEST_STACK_NAME = "STACK"; - const TEST_TEMPLATE = "TEMPLATE_CONTENT"; - const TEST_PARAMETERS = { - key: "value", - }; - - it("| call aws-sdk updateStack method with same params from input", () => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - // call - cfnClient.updateStack(TEST_STACK_NAME, TEST_TEMPLATE, TEST_PARAMETERS, noop); - // verify - expect(updateStackStub.args[0][0].StackName).equal(TEST_STACK_NAME); - expect(updateStackStub.args[0][0].TemplateBody).equal(TEST_TEMPLATE); - expect(updateStackStub.args[0][0].Capabilities).deep.equal(["CAPABILITY_IAM"]); - expect(updateStackStub.args[0][0].Parameters).deep.equal(TEST_PARAMETERS); - }); - - it("| call aws-sdk updateStack method with same params from input without parameters", () => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - // call - cfnClient.updateStack(TEST_STACK_NAME, TEST_TEMPLATE, {}, noop); - // verify - expect(updateStackStub.args[0][0].StackName).equal(TEST_STACK_NAME); - expect(updateStackStub.args[0][0].TemplateBody).equal(TEST_TEMPLATE); - expect(updateStackStub.args[0][0].Capabilities).deep.equal(["CAPABILITY_IAM"]); - expect(updateStackStub.args[0][0].Parameters).equal(undefined); - }); - - it("| updateStack method returns error when client request fails", () => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - updateStackStub.returns({promise: sinon.stub().rejects(TEST_CLIENT_ERROR)}); - // call - return cfnClient.updateStack(TEST_STACK_NAME, TEST_TEMPLATE, TEST_PARAMETERS).catch((err) => { - expect(err.name).eql(TEST_CLIENT_ERROR); - }); - }); - - it("| updateStack returns with response string when no update to be performed", async () => { - // setup - const NO_UPDATE_ERROR = { - code: "ValidationError", - message: "No updates are to be performed.", - }; - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - updateStackStub.returns({promise: sinon.stub().rejects(NO_UPDATE_ERROR)}); - // call - const res = await cfnClient.updateStack(TEST_STACK_NAME, TEST_TEMPLATE, TEST_PARAMETERS); - // verify - expect(res).eql("No updates are to be performed."); - }); - - it("| updateStack returns response when client request succeeds", async () => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - // call - const res = await cfnClient.updateStack(TEST_STACK_NAME, TEST_TEMPLATE, TEST_PARAMETERS); - - expect(res).eql(TEST_UPDATE_RESPONSE); - }); - }); - - describe("Test client method - stackExists()", () => { - it("| returns false when stack id is undefined", async () => { - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - - const exists = await cfnClient.stackExists(); - - expect(exists).eql(false); - }); - - it("| returns false when stack status is delete complete", async () => { - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - describeStackStub.returns({promise: sinon.stub().resolves({Stacks: [{StackStatus: "DELETE_COMPLETE"}]})}); - - const exists = await cfnClient.stackExists("someId"); - - expect(exists).eql(false); - }); - - it("| returns false when when getting stack status fails", async () => { - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - describeStackStub.returns({promise: sinon.stub().rejects()}); - - const exists = await cfnClient.stackExists("someId"); - - expect(exists).eql(false); - }); - - it("| returns true when request succeeds", async () => { - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - describeStackStub.returns({promise: sinon.stub().resolves({Stacks: [{StackStatus: "test"}]})}); - - const exists = await cfnClient.stackExists("someId"); - - expect(exists).eql(true); - }); - }); - describe("Test client method - describeStack()", () => { - const TEST_STACK_NAME = "STACK"; - - it("| call aws-sdk describeStack method with same params from input", () => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - // call - cfnClient.describeStack(TEST_STACK_NAME, noop); - // verify - expect(describeStackStub.args[0][0].StackName).equal(TEST_STACK_NAME); - }); - - it("| describeStack method callback with error when stackId not provided", (done) => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - // call - cfnClient.describeStack("", (err, res) => { - // verify - expect(err).equal("Stack ID must be set to further describe"); - expect(res).equal(undefined); - done(); - }); - }); - - it("| describeStack method callback with error when client request fails", (done) => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - describeStackStub.callsArgWith(1, TEST_CLIENT_ERROR, null); - // call - cfnClient.describeStack(TEST_STACK_NAME, (err, res) => { - // verify - expect(err).equal(TEST_CLIENT_ERROR); - expect(res).equal(null); - done(); - }); - }); - - it("| describeStack method callback with response when client request succeeds", (done) => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - const TEST_DESCRIBE_RESPONSE = { - Stacks: [TEST_CLIENT_RESPONSE], - }; - describeStackStub.callsArgWith(1, null, TEST_DESCRIBE_RESPONSE); - // call - cfnClient.describeStack(TEST_STACK_NAME, (err, res) => { - // verify - expect(err).equal(null); - expect(res).equal(TEST_CLIENT_RESPONSE); - done(); - }); - }); - }); - // expect(err).equal('Logical ID must be set to describe the resource') - - describe("Test client method - describeStackResource()", () => { - const TEST_STACK_NAME = "STACK"; - const TEST_LOGICAL_ID = "LOGICAL_ID"; - - it("| call aws-sdk describeStackResource method with same params from input", () => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - // call - cfnClient.describeStackResource(TEST_STACK_NAME, TEST_LOGICAL_ID, noop); - // verify - expect(describeStackResourceStub.args[0][0].StackName).equal(TEST_STACK_NAME); - expect(describeStackResourceStub.args[0][0].LogicalResourceId).equal(TEST_LOGICAL_ID); - }); - - it("| describeStackResource method callback error when stackId not set", (done) => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - // call - cfnClient.describeStackResource("", TEST_LOGICAL_ID, (err, res) => { - // verify - expect(err).equal("Stack ID must be set to describe its resources"); - expect(res).equal(undefined); - done(); - }); - }); - - it("| describeStackResource method callback error when logicalId not set", (done) => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - // call - cfnClient.describeStackResource(TEST_STACK_NAME, "", (err, res) => { - // verify - expect(err).equal("Logical ID must be set to describe its resources"); - expect(res).equal(undefined); - done(); - }); - }); - - it("| describeStackResource method callback error when client request fails", (done) => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - describeStackResourceStub.callsArgWith(1, TEST_CLIENT_ERROR, null); - // call - cfnClient.describeStackResource(TEST_STACK_NAME, TEST_LOGICAL_ID, (err, res) => { - // verify - expect(err).equal(TEST_CLIENT_ERROR); - expect(res).equal(null); - done(); - }); - }); - - it("| describeStackResource method callback response when client request succeeds", (done) => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - const TEST_DESCRIBE_RESPONSE = { - StackResourceDetail: TEST_CLIENT_RESPONSE, - }; - describeStackResourceStub.callsArgWith(1, null, TEST_DESCRIBE_RESPONSE); - // call - cfnClient.describeStackResource(TEST_STACK_NAME, TEST_LOGICAL_ID, (err, res) => { - // verify - expect(err).equal(null); - expect(res).equal(TEST_CLIENT_RESPONSE); - done(); - }); - }); - }); - - describe("Test client method - describeStackResources()", () => { - const TEST_STACK_NAME = "STACK"; - - it("| call aws-sdk describeStackResources method with same params from input", () => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - // call - cfnClient.describeStackResources(TEST_STACK_NAME, noop); - // verify - expect(describeStackResourcesStub.args[0][0].StackName).equal(TEST_STACK_NAME); - }); - - it("| describeStackResources method callback error when stackId not set", (done) => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - // call - cfnClient.describeStackResources("", (err, res) => { - // verify - expect(err).equal("Stack ID must be set to describe its resources"); - expect(res).equal(); - done(); - }); - }); - - it("| describeStackResources method callback error when client request fails", (done) => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - describeStackResourcesStub.callsArgWith(1, TEST_CLIENT_ERROR, null); - // call - cfnClient.describeStackResources(TEST_STACK_NAME, (err, res) => { - // verify - expect(err).equal(TEST_CLIENT_ERROR); - expect(res).equal(null); - done(); - }); - }); - - it("| describeStackResources method callback response when client request succeeds", (done) => { - // setup - const cfnClient = new CloudformationClient(TEST_CONFIGURATION); - const TEST_DESCRIBE_RESPONSE = { - StackResources: TEST_CLIENT_RESPONSE, - }; - describeStackResourcesStub.callsArgWith(1, null, TEST_DESCRIBE_RESPONSE); - // call - cfnClient.describeStackResources(TEST_STACK_NAME, (err, res) => { - // verify - expect(err).equal(null); - expect(res).equal(TEST_CLIENT_RESPONSE); - done(); - }); - }); - }); -}); diff --git a/test/unit/clients/aws-client/cloudformation-client-test.ts b/test/unit/clients/aws-client/cloudformation-client-test.ts new file mode 100644 index 00000000..db2e8c6e --- /dev/null +++ b/test/unit/clients/aws-client/cloudformation-client-test.ts @@ -0,0 +1,395 @@ +import {expect} from "chai"; +import sinon from "sinon"; +import { + CloudFormationClient as _CloudFormationClient, + CreateStackCommand, + DescribeStacksCommand, + DescribeStackEventsCommand, + DescribeStackResourceCommand, + DescribeStackResourcesCommand, + UpdateStackCommand, +} from "@aws-sdk/client-cloudformation"; + +import CloudformationClient from "../../../../lib/clients/aws-client/cloudformation-client"; + +describe("Clients test - cloudformation client test", () => { + const TEST_AWS_PROFILE = "AWS_PROFILE"; + const TEST_AWS_REGION = "AWS_REGION"; + const TEST_CLIENT_ERROR = new Error("CLIENT_ERR"); + const TEST_CLIENT_RESPONSE = "CLIENT_RESPONSE"; + const TEST_STACK_ID = "TEST_STACK_ID"; + const TEST_CONFIGURATION = { + awsProfile: TEST_AWS_PROFILE, + awsRegion: TEST_AWS_REGION, + }; + const TEST_CREATE_RESPONSE = { + StackId: TEST_STACK_ID, + }; + const TEST_UPDATE_RESPONSE = { + StackId: TEST_STACK_ID, + }; + let cfnClient: CloudformationClient, sendCommandStub: sinon.SinonStub; + + beforeEach(() => { + cfnClient = new CloudformationClient(TEST_CONFIGURATION); + sendCommandStub = sinon.stub(_CloudFormationClient.prototype, "send"); + }); + + afterEach(() => { + sinon.restore(); + }); + + describe("Check correctness for constructor function", () => { + it("| inspect correctness for constructor when awsRegion is set in configuration", () => { + expect(cfnClient).to.be.instanceof(CloudformationClient); + expect(cfnClient.credentials).to.be.a("function"); + expect(cfnClient.profile).equal(TEST_AWS_PROFILE); + expect(cfnClient.region).equal(TEST_AWS_REGION); + }); + + it("| throw error when awsProfile or awsRegion is not passed in", () => { + expect(() => new CloudformationClient({})).to.throw("Invalid awsProfile or Invalid awsRegion"); + }); + }); + + describe("Test client method - createStack()", () => { + const TEST_STACK_NAME = "STACK"; + const TEST_TEMPLATE = "TEMPLATE_CONTENT"; + const TEST_PARAMETERS = [{ParameterKey: "key", ParameterValue: "value"}]; + const TEST_CAPABILITIES = ["CAPABILITY_IAM"]; + + it("| call aws-sdk createStack command with same params from input", () => { + // setup + sendCommandStub.resolves(); + // call + cfnClient.createStack(TEST_STACK_NAME, TEST_TEMPLATE, TEST_PARAMETERS, TEST_CAPABILITIES); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(CreateStackCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + StackName: TEST_STACK_NAME, + TemplateBody: TEST_TEMPLATE, + Capabilities: TEST_CAPABILITIES, + Parameters: TEST_PARAMETERS, + }); + }); + + it("| call aws-sdk createStack command with same params from input without parameters", () => { + // setup + sendCommandStub.resolves(); + // call + cfnClient.createStack(TEST_STACK_NAME, TEST_TEMPLATE, [], TEST_CAPABILITIES); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(CreateStackCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + StackName: TEST_STACK_NAME, + TemplateBody: TEST_TEMPLATE, + Capabilities: TEST_CAPABILITIES, + }); + }); + + it("| createStack returns response when client request succeeds", (done) => { + // setup + sendCommandStub.resolves(TEST_CREATE_RESPONSE); + // call + cfnClient.createStack(TEST_STACK_NAME, TEST_TEMPLATE, TEST_PARAMETERS, TEST_CAPABILITIES).then((res) => { + // verify + expect(res).eql(TEST_STACK_ID); + done(); + }); + }); + }); + + describe("Test client method - updateStack()", () => { + const TEST_STACK_NAME = "STACK"; + const TEST_TEMPLATE = "TEMPLATE_CONTENT"; + const TEST_PARAMETERS = [{ParameterKey: "key", ParameterValue: "value"}]; + const TEST_CAPABILITIES = ["CAPABILITY_IAM"]; + + it("| call aws-sdk updateStackCommand with same params from input", () => { + // setup + sendCommandStub.resolves(); + // call + cfnClient.updateStack(TEST_STACK_NAME, TEST_TEMPLATE, TEST_PARAMETERS, TEST_CAPABILITIES); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(UpdateStackCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + StackName: TEST_STACK_NAME, + TemplateBody: TEST_TEMPLATE, + Capabilities: TEST_CAPABILITIES, + Parameters: TEST_PARAMETERS, + }); + }); + + it("| call aws-sdk updateStackCommand with same params from input without parameters", () => { + // setup + sendCommandStub.resolves(); + // call + cfnClient.updateStack(TEST_STACK_NAME, TEST_TEMPLATE, [], TEST_CAPABILITIES); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(UpdateStackCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + StackName: TEST_STACK_NAME, + TemplateBody: TEST_TEMPLATE, + Capabilities: TEST_CAPABILITIES, + }); + }); + + it("| updateStack method returns error when client request fails", (done) => { + // setup + sendCommandStub.rejects(TEST_CLIENT_ERROR); + // call + cfnClient.updateStack(TEST_STACK_NAME, TEST_TEMPLATE, TEST_PARAMETERS, TEST_CAPABILITIES).catch((err) => { + // verify + expect(err).eql(TEST_CLIENT_ERROR); + done(); + }); + }); + + it("| updateStack returns with no response when no update to be performed", (done) => { + // setup + const NO_UPDATE_ERROR = { + name: "ValidationError", + message: "No updates are to be performed.", + }; + sendCommandStub.rejects(NO_UPDATE_ERROR); + // call + cfnClient.updateStack(TEST_STACK_NAME, TEST_TEMPLATE, TEST_PARAMETERS, TEST_CAPABILITIES).then((res) => { + // verify + expect(res).to.be.undefined; + done(); + }); + }); + + it("| updateStack returns response when client request succeeds", (done) => { + // setup + sendCommandStub.resolves(TEST_UPDATE_RESPONSE); + // call + cfnClient.updateStack(TEST_STACK_NAME, TEST_TEMPLATE, TEST_PARAMETERS, TEST_CAPABILITIES).then((res) => { + // verify + expect(res).eql(TEST_STACK_ID); + done(); + }); + }); + }); + + describe("Test client method - stackExists()", () => { + it("| returns false when stack id is undefined", (done) => { + // call + cfnClient.stackExists(undefined).then((res) => { + // verify + expect(res).eql(false); + done(); + }); + }); + + it("| returns false when stack status is delete complete", (done) => { + // setup + sendCommandStub.resolves({Stacks: [{StackStatus: "DELETE_COMPLETE"}]}); + // call + cfnClient.stackExists("someId").then((res) => { + // verify + expect(res).eql(false); + done(); + }); + }); + + it("| returns false when when no stack information available", (done) => { + // setup + sendCommandStub.resolves({}); + // call + cfnClient.stackExists("someId").then((res) => { + // verify + expect(res).eql(false); + done(); + }); + }); + + it("| returns false when when getting stack status fails", (done) => { + // setup + sendCommandStub.rejects(); + // call + cfnClient.stackExists("someId").then((res) => { + // verify + expect(res).eql(false); + done(); + }); + }); + + it("| returns true when request succeeds", (done) => { + // setup + sendCommandStub.resolves({Stacks: [{StackStatus: "test"}]}); + // call + cfnClient.stackExists("someId").then((res) => { + // verify + expect(res).eql(true); + done(); + }); + }); + }); + + describe("Test client method - getStack()", () => { + const TEST_STACK_NAME = "STACK"; + const TEST_DESCRIBE_RESPONSE = { + Stacks: [TEST_CLIENT_RESPONSE], + }; + + it("| call aws-sdk describeStacksCommand with same params from input", () => { + // setup + sendCommandStub.resolves(TEST_DESCRIBE_RESPONSE); + // call + cfnClient.getStack(TEST_STACK_NAME); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(DescribeStacksCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + StackName: TEST_STACK_NAME, + }); + }); + + it("| getStack method callback with error when client request fails", (done) => { + // setup + sendCommandStub.rejects(TEST_CLIENT_ERROR); + // call + cfnClient.getStack(TEST_STACK_NAME).catch((err) => { + // verify + expect(err).equal(TEST_CLIENT_ERROR); + done(); + }); + }); + + it("| getStack method callback with response when client request succeeds", (done) => { + // setup + sendCommandStub.resolves(TEST_DESCRIBE_RESPONSE); + // call + cfnClient.getStack(TEST_STACK_NAME).then((res) => { + // verify + expect(res).equal(TEST_CLIENT_RESPONSE); + done(); + }); + }); + }); + + describe("Test client method - getStackEvents()", () => { + const TEST_STACK_NAME = "STACK"; + const TEST_DESCRIBE_RESPONSE = { + StackEvents: TEST_CLIENT_RESPONSE, + }; + + it("| call aws-sdk describeStackEventsCommand with same params from input", () => { + // setup + sendCommandStub.resolves(TEST_DESCRIBE_RESPONSE); + // call + cfnClient.getStackEvents(TEST_STACK_NAME); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(DescribeStackEventsCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + StackName: TEST_STACK_NAME, + }); + }); + + it("| getStackEvents method callback error when client request fails", (done) => { + // setup + sendCommandStub.rejects(TEST_CLIENT_ERROR); + // call + cfnClient.getStackEvents(TEST_STACK_NAME).catch((err) => { + // verify + expect(err).equal(TEST_CLIENT_ERROR); + done(); + }); + }); + + it("| getStackEvents method callback response when client request succeeds", (done) => { + // setup + sendCommandStub.resolves(TEST_DESCRIBE_RESPONSE); + // call + cfnClient.getStackEvents(TEST_STACK_NAME).then((res) => { + // verify + expect(res).equal(TEST_CLIENT_RESPONSE); + done(); + }); + }); + }); + + describe("Test client method - getStackResource()", () => { + const TEST_STACK_NAME = "STACK"; + const TEST_LOGICAL_ID = "LOGICAL_ID"; + const TEST_DESCRIBE_RESPONSE = { + StackResourceDetail: TEST_CLIENT_RESPONSE, + }; + + it("| call aws-sdk describeStackResourceCommand with same params from input", () => { + // setup + sendCommandStub.resolves(TEST_DESCRIBE_RESPONSE); + // call + cfnClient.getStackResource(TEST_STACK_NAME, TEST_LOGICAL_ID); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(DescribeStackResourceCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + StackName: TEST_STACK_NAME, + LogicalResourceId: TEST_LOGICAL_ID, + }); + }); + + it("| getStackResource method callback error when client request fails", (done) => { + // setup + sendCommandStub.rejects(TEST_CLIENT_ERROR); + // call + cfnClient.getStackResource(TEST_STACK_NAME, TEST_LOGICAL_ID).catch((err) => { + // verify + expect(err).equal(TEST_CLIENT_ERROR); + done(); + }); + }); + + it("| getStackResource method callback response when client request succeeds", (done) => { + // setup + sendCommandStub.resolves(TEST_DESCRIBE_RESPONSE); + // call + cfnClient.getStackResource(TEST_STACK_NAME, TEST_LOGICAL_ID).then((res) => { + // verify + expect(res).equal(TEST_CLIENT_RESPONSE); + done(); + }); + }); + }); + + describe("Test client method - getStackResources()", () => { + const TEST_STACK_NAME = "STACK"; + const TEST_DESCRIBE_RESPONSE = { + StackResources: TEST_CLIENT_RESPONSE, + }; + + it("| call aws-sdk describeStackResourcesCommand with same params from input", () => { + // setup + sendCommandStub.resolves(TEST_DESCRIBE_RESPONSE); + // call + cfnClient.getStackResources(TEST_STACK_NAME); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(DescribeStackResourcesCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + StackName: TEST_STACK_NAME, + }); + }); + + it("| getStackResources method callback error when client request fails", (done) => { + // setup + sendCommandStub.rejects(TEST_CLIENT_ERROR); + // call + cfnClient.getStackResources(TEST_STACK_NAME).catch((err) => { + // verify + expect(err).equal(TEST_CLIENT_ERROR); + done(); + }); + }); + + it("| getStackResources method callback response when client request succeeds", (done) => { + // setup + sendCommandStub.resolves(TEST_DESCRIBE_RESPONSE); + // call + cfnClient.getStackResources(TEST_STACK_NAME).then((res) => { + // verify + expect(res).equal(TEST_CLIENT_RESPONSE); + done(); + }); + }); + }); +}); diff --git a/test/unit/clients/aws-client/iam-client-test.js b/test/unit/clients/aws-client/iam-client-test.js deleted file mode 100644 index fc30c569..00000000 --- a/test/unit/clients/aws-client/iam-client-test.js +++ /dev/null @@ -1,146 +0,0 @@ -const aws = require("aws-sdk"); -const {expect} = require("chai"); -const sinon = require("sinon"); - -const IAMClient = require("../../../../lib/clients/aws-client/iam-client"); - -describe("Clients test - iam client test", () => { - const TEST_AWS_PROFILE = "TEST_AWS_PROFILE"; - const TEST_AWS_REGION = "TEST_AWS_REGION"; - const TEST_CONFIGURATION = { - awsProfile: TEST_AWS_PROFILE, - awsRegion: TEST_AWS_REGION, - }; - const TEST_ROLE_ARN = "iam_role_arn"; - const TEST_ROLE_NAME = "iam_role_name"; - - afterEach(() => { - sinon.restore(); - }); - - describe("# constructor tests", () => { - it("| inspect correctness for constructor when awsRegion is set in configuration.", () => { - const iamClient = new IAMClient(TEST_CONFIGURATION); - expect(iamClient).to.be.instanceOf(IAMClient); - expect(iamClient.awsRegion).equal(TEST_AWS_REGION); - expect(aws.config.region).equal(TEST_AWS_REGION); - expect(aws.config.credentials).deep.equal(new aws.SharedIniFileCredentials({profile: TEST_AWS_PROFILE})); - }); - - it("| inspect an error for constructor when awsRegion is null in configuration.", () => { - const configuration = { - awsProfile: TEST_AWS_PROFILE, - awsRegion: null, - }; - try { - new IAMClient(configuration); - } catch (e) { - expect(e.message).equal("Invalid awsProfile or Invalid awsRegion"); - } - }); - it("| inspect an error for constructor when awsRegion is blank in configuration.", () => { - const configuration = { - awsProfile: " ", - awsRegion: TEST_AWS_REGION, - }; - try { - new IAMClient(configuration); - } catch (e) { - expect(e.message).equal("Invalid awsProfile or Invalid awsRegion"); - } - }); - }); - - describe("# function getIAMRole tests", () => { - it("| iamClient get IAM role request fails, expect an error return.", (done) => { - // setup - const iamClient = new IAMClient(TEST_CONFIGURATION); - const TEST_GET_ROLE_ERR = "GET_ROLE_ERROR"; - sinon.stub(iamClient.client, "getRole").callsArgWith(1, TEST_GET_ROLE_ERR); - // call - iamClient.getIAMRole(TEST_ROLE_ARN, (err) => { - // verify - expect(err).equal(TEST_GET_ROLE_ERR); - done(); - }); - }); - - it("| iamClient get IAM role request passes, expect role data return.", (done) => { - // setup - const iamClient = new IAMClient(TEST_CONFIGURATION); - const TEST_GET_ROLE_RESPONSE = { - Role: { - Arn: TEST_ROLE_ARN, - }, - }; - sinon.stub(iamClient.client, "getRole").callsArgWith(1, null, TEST_GET_ROLE_RESPONSE); - // call - iamClient.getIAMRole(TEST_ROLE_ARN, (err, data) => { - // verify - expect(data.Role.Arn).equal(TEST_ROLE_ARN); - expect(err).equal(null); - done(); - }); - }); - }); - - describe("# function createBasicLambdaRole tests", () => { - it("| iamClient create basic Lambda role request fails, expect an error return.", (done) => { - // setup - const iamClient = new IAMClient(TEST_CONFIGURATION); - const TEST_CREATE_ROLE_ERR = "CREATE_ROLE_ERROR"; - sinon.stub(iamClient.client, "createRole").callsArgWith(1, TEST_CREATE_ROLE_ERR); - // call - iamClient.createBasicLambdaRole(TEST_ROLE_NAME, (err) => { - // verify - expect(err).equal(TEST_CREATE_ROLE_ERR); - done(); - }); - }); - - it("| iamClient create basic Lambda role request passes, expect role data return.", (done) => { - // setup - const iamClient = new IAMClient(TEST_CONFIGURATION); - const TEST_CREATE_ROLE_RESPONSE = { - Role: { - Arn: TEST_ROLE_ARN, - }, - }; - sinon.stub(iamClient.client, "createRole").callsArgWith(1, null, TEST_CREATE_ROLE_RESPONSE); - // call - iamClient.createBasicLambdaRole(TEST_ROLE_NAME, (err, data) => { - // verify - expect(data.Role.Arn).equal(TEST_ROLE_ARN); - expect(err).equal(null); - done(); - }); - }); - }); - - describe("# function attachBasicLambdaRolePolicy tests", () => { - it("| iamClient attach basic Lambda role policy request fails, expect an error return.", (done) => { - // setup - const iamClient = new IAMClient(TEST_CONFIGURATION); - const TEST_ATTACH_POLICY_ERR = "ATTACH_POLICY_ERROR"; - sinon.stub(iamClient.client, "attachRolePolicy").callsArgWith(1, TEST_ATTACH_POLICY_ERR); - // call - iamClient.attachBasicLambdaRolePolicy(TEST_ROLE_ARN, (err) => { - // verify - expect(err).equal(TEST_ATTACH_POLICY_ERR); - done(); - }); - }); - - it("| iamClient attach basic Lambda role policy request passes, expect null error return.", (done) => { - // setup - const iamClient = new IAMClient(TEST_CONFIGURATION); - sinon.stub(iamClient.client, "attachRolePolicy").callsArgWith(1, null); - // call - iamClient.attachBasicLambdaRolePolicy(TEST_ROLE_ARN, (err) => { - // verify - expect(err).equal(null); - done(); - }); - }); - }); -}); diff --git a/test/unit/clients/aws-client/iam-client-test.ts b/test/unit/clients/aws-client/iam-client-test.ts new file mode 100644 index 00000000..5874c561 --- /dev/null +++ b/test/unit/clients/aws-client/iam-client-test.ts @@ -0,0 +1,175 @@ +import {expect} from "chai"; +import sinon from "sinon"; +import {IAMClient as _IAMClient, AttachRolePolicyCommand, CreateRoleCommand, GetRoleCommand} from "@aws-sdk/client-iam"; + +import IAMClient from "../../../../lib/clients/aws-client/iam-client"; +import CONSTANTS from "../../../../lib/utils/constants"; + +describe("Clients test - iam client test", () => { + const TEST_AWS_PROFILE = "TEST_AWS_PROFILE"; + const TEST_AWS_REGION = "TEST_AWS_REGION"; + const TEST_CONFIGURATION = { + awsProfile: TEST_AWS_PROFILE, + awsRegion: TEST_AWS_REGION, + }; + const TEST_ROLE_ARN = "iam_role_arn"; + const TEST_ROLE_NAME = "iam_role_name"; + let iamClient: IAMClient, sendCommandStub: sinon.SinonStub; + + beforeEach(() => { + iamClient = new IAMClient(TEST_CONFIGURATION); + sendCommandStub = sinon.stub(_IAMClient.prototype, "send"); + }); + + afterEach(() => { + sinon.restore(); + }); + + describe("# constructor tests", () => { + it("| inspect correctness for constructor when awsRegion is set in configuration.", () => { + expect(iamClient).to.be.instanceof(IAMClient); + expect(iamClient.credentials).to.be.a("function"); + expect(iamClient.profile).equal(TEST_AWS_PROFILE); + expect(iamClient.region).equal(TEST_AWS_REGION); + }); + + it("| inspect an error for constructor when awsRegion is null in configuration.", () => { + const configuration = { + awsProfile: TEST_AWS_PROFILE, + awsRegion: undefined, + }; + expect(() => new IAMClient(configuration)).to.throw("Invalid awsProfile or Invalid awsRegion"); + }); + + it("| inspect an error for constructor when awsRegion is blank in configuration.", () => { + const configuration = { + awsProfile: " ", + awsRegion: TEST_AWS_REGION, + }; + expect(() => new IAMClient(configuration)).to.throw("Invalid awsProfile or Invalid awsRegion"); + }); + }); + + describe("# function getIAMRole tests", () => { + it("| call aws-sdk getRoleCommand with same params from input", () => { + // setup + sendCommandStub.resolves(); + // call + iamClient.getIAMRole(`role/${TEST_ROLE_ARN}`); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(GetRoleCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + RoleName: TEST_ROLE_ARN, + }); + }); + + it("| get IAM role request fails, expect an error return.", (done) => { + // setup + const TEST_GET_ROLE_ERR = new Error("GET_ROLE_ERROR"); + sendCommandStub.rejects(TEST_GET_ROLE_ERR); + // call + iamClient.getIAMRole(TEST_ROLE_ARN).catch((err) => { + // verify + expect(err).equal(TEST_GET_ROLE_ERR); + done(); + }); + }); + + it("| get IAM role request passes, expect role data return.", (done) => { + // setup + const TEST_GET_ROLE_RESPONSE = { + Role: { + Arn: TEST_ROLE_ARN, + }, + }; + sendCommandStub.resolves(TEST_GET_ROLE_RESPONSE); + // call + iamClient.getIAMRole(TEST_ROLE_ARN).then((role) => { + // verify + expect(role?.Arn).equal(TEST_ROLE_ARN); + done(); + }); + }); + }); + + describe("# function createBasicLambdaRole tests", () => { + it("| call aws-sdk CreateRoleCommand with same params from input", () => { + // setup + const policy = CONSTANTS.AWS.IAM.ROLE.LAMBDA_BASIC_ROLE.POLICY; + sendCommandStub.resolves(); + // call + iamClient.createBasicLambdaRole(TEST_ROLE_ARN); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(CreateRoleCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + RoleName: TEST_ROLE_ARN, + AssumeRolePolicyDocument: JSON.stringify(policy), + }); + }); + + it("| create basic Lambda role request fails, expect an error return.", (done) => { + // setup + const TEST_CREATE_ROLE_ERR = new Error("CREATE_ROLE_ERROR"); + sendCommandStub.rejects(TEST_CREATE_ROLE_ERR); + // call + iamClient.createBasicLambdaRole(TEST_ROLE_ARN).catch((err) => { + // verify + expect(err).equal(TEST_CREATE_ROLE_ERR); + done(); + }); + }); + + it("| create basic Lambda role request passes, expect role data return.", (done) => { + // setup + const TEST_CREATE_ROLE_RESPONSE = { + Role: { + Arn: TEST_ROLE_ARN, + }, + }; + sendCommandStub.resolves(TEST_CREATE_ROLE_RESPONSE); + // call + iamClient.createBasicLambdaRole(TEST_ROLE_NAME).then((role) => { + // verify + expect(role?.Arn).equal(TEST_ROLE_ARN); + done(); + }); + }); + }); + + describe("# function attachBasicLambdaRolePolicy tests", () => { + it("| call aws-sdk AttachRolePolicyCommand with same params from input", () => { + // call + iamClient.attachBasicLambdaRolePolicy(TEST_ROLE_ARN); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(AttachRolePolicyCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + PolicyArn: CONSTANTS.AWS.IAM.ROLE.LAMBDA_BASIC_ROLE.POLICY_ARN, + RoleName: TEST_ROLE_ARN, + }); + }); + + it("| attach basic Lambda role policy request fails, expect an error return.", (done) => { + // setup + const TEST_ATTACH_POLICY_ERR = new Error("ATTACH_POLICY_ERROR"); + sendCommandStub.rejects(TEST_ATTACH_POLICY_ERR); + // call + iamClient.attachBasicLambdaRolePolicy(TEST_ROLE_ARN).catch((err) => { + // verify + expect(err).equal(TEST_ATTACH_POLICY_ERR); + done(); + }); + }); + + it("| attach basic Lambda role policy request passes, expect a response.", (done) => { + // setup + const TEST_ATTACH_POLICY_RESPONSE = "TEST_ATTACH_POLICY_RESPONSE"; + sendCommandStub.resolves(TEST_ATTACH_POLICY_RESPONSE); + // call + iamClient.attachBasicLambdaRolePolicy(TEST_ROLE_ARN).then((res) => { + // verify + expect(res).equal(TEST_ATTACH_POLICY_RESPONSE); + done(); + }); + }); + }); +}); diff --git a/test/unit/clients/aws-client/lambda-client-test.js b/test/unit/clients/aws-client/lambda-client-test.js deleted file mode 100644 index 37e7faa4..00000000 --- a/test/unit/clients/aws-client/lambda-client-test.js +++ /dev/null @@ -1,236 +0,0 @@ -const aws = require("aws-sdk"); -const {expect} = require("chai"); -const sinon = require("sinon"); - -const LambdaClient = require("../../../../lib/clients/aws-client/lambda-client"); - -describe("Clients test - lambda client test", () => { - const TEST_AWS_PROFILE = "TEST_AWS_PROFILE"; - const TEST_AWS_REGION = "TEST_AWS_REGION"; - const TEST_CONFIGURATION = { - awsProfile: TEST_AWS_PROFILE, - awsRegion: TEST_AWS_REGION, - }; - const TEST_FUNCTION_ARN = "function_arn"; - const TEST_SKILL_ID = "skill_id"; - const TEST_REVISION_ID = "revision_id"; - const TEST_ZIPFILE = "zipfile_path"; - const TEST_FUNCTION_NAME = "function_name"; - const TEST_FUNCTION_CONFIG = "function_config"; - - afterEach(() => { - sinon.restore(); - }); - - describe("# constructor tests", () => { - it("| inspect correctness for constructor when awsRegion is set in configuration.", () => { - const lambdaClient = new LambdaClient(TEST_CONFIGURATION); - expect(lambdaClient).to.be.instanceOf(LambdaClient); - expect(lambdaClient.awsRegion).equal(TEST_AWS_REGION); - expect(aws.config.region).equal(TEST_AWS_REGION); - expect(aws.config.credentials).deep.equal(new aws.SharedIniFileCredentials({profile: TEST_AWS_PROFILE})); - }); - - it("| inspect an error for constructor when awsRegion is null in configuration.", () => { - const configuration = { - awsProfile: TEST_AWS_PROFILE, - awsRegion: null, - }; - try { - new LambdaClient(configuration); - } catch (e) { - expect(e.message).equal("Invalid awsProfile or Invalid awsRegion"); - } - }); - it("| inspect an error for constructor when awsRegion is blank in configuration.", () => { - const configuration = { - awsProfile: " ", - awsRegion: TEST_AWS_REGION, - }; - try { - new LambdaClient(configuration); - } catch (e) { - expect(e.message).equal("Invalid awsProfile or Invalid awsRegion"); - } - }); - }); - - describe("# function createLambdaFunction tests", () => { - const TEST_IAM_ROLE = "iam_role"; - - it("| iamClient create Lambda function request fails, expect an error return.", (done) => { - // setup - const lambdaClient = new LambdaClient(TEST_CONFIGURATION); - const TEST_CREATE_FUNCTION_ERR = "create_function_error"; - sinon.stub(lambdaClient.client, "createFunction").callsArgWith(1, TEST_CREATE_FUNCTION_ERR); - // call - lambdaClient.createLambdaFunction(TEST_FUNCTION_NAME, TEST_FUNCTION_CONFIG, TEST_IAM_ROLE, TEST_ZIPFILE, (err) => { - // verify - expect(err).equal(TEST_CREATE_FUNCTION_ERR); - done(); - }); - }); - - it("| iamClient create Lambda function request passes, expect role data return.", (done) => { - // setup - const lambdaClient = new LambdaClient(TEST_CONFIGURATION); - const TEST_CREATE_FUNCTION_RESPONSE = { - FunctionArn: TEST_FUNCTION_ARN, - }; - sinon.stub(lambdaClient.client, "createFunction").callsArgWith(1, null, TEST_CREATE_FUNCTION_RESPONSE); - // call - lambdaClient.createLambdaFunction(TEST_FUNCTION_NAME, TEST_FUNCTION_CONFIG, TEST_IAM_ROLE, TEST_ZIPFILE, (err, data) => { - // verify - expect(data.FunctionArn).equal(TEST_FUNCTION_ARN); - done(); - }); - }); - }); - - describe("# function addAlexaPermissionByDomain tests", () => { - it("| iamClient add Alexa permission by custom domain request fails, expect an error return.", (done) => { - // setup - const lambdaClient = new LambdaClient(TEST_CONFIGURATION); - const TEST_DOMAIN = "custom"; - const TEST_ADD_PERMISSION_ERR = "ADD_PERMISSION_ERROR"; - sinon.stub(lambdaClient.client, "addPermission").callsArgWith(1, TEST_ADD_PERMISSION_ERR); - // call - lambdaClient.addAlexaPermissionByDomain(TEST_DOMAIN, TEST_SKILL_ID, TEST_FUNCTION_ARN, (err) => { - // verify - expect(err).equal(TEST_ADD_PERMISSION_ERR); - done(); - }); - }); - - it("| iamClient add Alexa permission by smartHome domain request fails, expect an error return.", (done) => { - // setup - const lambdaClient = new LambdaClient(TEST_CONFIGURATION); - const TEST_DOMAIN = "smartHome"; - const TEST_ADD_PERMISSION_ERR = "ADD_PERMISSION_ERROR"; - sinon.stub(lambdaClient.client, "addPermission").callsArgWith(1, TEST_ADD_PERMISSION_ERR); - // call - lambdaClient.addAlexaPermissionByDomain(TEST_DOMAIN, TEST_SKILL_ID, TEST_FUNCTION_ARN, (err) => { - // verify - expect(err).equal(TEST_ADD_PERMISSION_ERR); - done(); - }); - }); - - it("| iamClient add Alexa permission by domain request passes, expect null error return.", (done) => { - // setup - const lambdaClient = new LambdaClient(TEST_CONFIGURATION); - const TEST_DOMAIN = "video"; - sinon.stub(lambdaClient.client, "addPermission").callsArgWith(1, null); - // call - lambdaClient.addAlexaPermissionByDomain(TEST_DOMAIN, TEST_SKILL_ID, TEST_FUNCTION_ARN, (err) => { - // verify - expect(err).equal(null); - done(); - }); - }); - - it("| iamClient add Alexa permission by domain no permission needed for domain, expect undefined return.", (done) => { - // setup - const lambdaClient = new LambdaClient(TEST_CONFIGURATION); - const TEST_DOMAIN = "non-existing"; - // call - lambdaClient.addAlexaPermissionByDomain(TEST_DOMAIN, TEST_SKILL_ID, TEST_FUNCTION_ARN, (err) => { - // verify - expect(err).equal(undefined); - done(); - }); - }); - }); - - describe("# function getFunction tests", () => { - it("| iamClient get Function request fails, expect an error return.", (done) => { - // setup - const lambdaClient = new LambdaClient(TEST_CONFIGURATION); - const TEST_GET_FUNCTION_ERR = "GET_FUNCTION_ERROR"; - sinon.stub(lambdaClient.client, "getFunction").callsArgWith(1, TEST_GET_FUNCTION_ERR); - // call - lambdaClient.getFunction(TEST_FUNCTION_ARN, (err) => { - // verify - expect(err).equal(TEST_GET_FUNCTION_ERR); - done(); - }); - }); - - it("| iamClient get Function request passes, expect a revision id return.", (done) => { - // setup - const lambdaClient = new LambdaClient(TEST_CONFIGURATION); - const TEST_GET_FUNCTION_RESPONSE = { - Configuration: { - RevisionId: TEST_REVISION_ID, - }, - }; - sinon.stub(lambdaClient.client, "getFunction").callsArgWith(1, null, TEST_GET_FUNCTION_RESPONSE); - // call - lambdaClient.getFunction(TEST_FUNCTION_ARN, (err, data) => { - // verify - expect(data.Configuration.RevisionId).equal(TEST_REVISION_ID); - done(); - }); - }); - }); - - describe("# function updateFunctionCode tests", () => { - it("| iamClient update function code request fails, expect an error return.", (done) => { - // setup - const lambdaClient = new LambdaClient(TEST_CONFIGURATION); - const TEST_UPDATE_CODE_ERR = "UPDATE_CODE_ERROR"; - sinon.stub(lambdaClient.client, "updateFunctionCode").callsArgWith(1, TEST_UPDATE_CODE_ERR); - // call - lambdaClient.updateFunctionCode(TEST_ZIPFILE, TEST_FUNCTION_ARN, TEST_REVISION_ID, (err) => { - // verify - expect(err).equal(TEST_UPDATE_CODE_ERR); - done(); - }); - }); - - it("| iamClient update function code request passes, expect function data return.", (done) => { - // setup - const lambdaClient = new LambdaClient(TEST_CONFIGURATION); - const TEST_UPDATE_CODE_RESPONSE = { - FunctionArn: TEST_FUNCTION_ARN, - }; - sinon.stub(lambdaClient.client, "updateFunctionCode").callsArgWith(1, null, TEST_UPDATE_CODE_RESPONSE); - // call - lambdaClient.updateFunctionCode(TEST_ZIPFILE, TEST_FUNCTION_ARN, TEST_REVISION_ID, (err, data) => { - // verify - expect(data.FunctionArn).equal(TEST_FUNCTION_ARN); - done(); - }); - }); - }); - - describe("# function update function configuration tests", () => { - it("| iamClient update function configuration request fails, expect an error return.", (done) => { - // setup - const lambdaClient = new LambdaClient(TEST_CONFIGURATION); - const TEST_UPDATE_CONFIG_ERR = "UPDATE_CONFIG_ERROR"; - sinon.stub(lambdaClient.client, "updateFunctionConfiguration").callsArgWith(1, TEST_UPDATE_CONFIG_ERR); - // call - lambdaClient.updateFunctionConfiguration(TEST_FUNCTION_ARN, TEST_FUNCTION_CONFIG, TEST_REVISION_ID, (err) => { - // verify - expect(err).equal(TEST_UPDATE_CONFIG_ERR); - done(); - }); - }); - - it("| iamClient update function configuration request passes, expect null error return.", (done) => { - // setup - const lambdaClient = new LambdaClient(TEST_CONFIGURATION); - const TEST_UPDATE_CONFIG_RESPONSE = { - RevisionId: TEST_REVISION_ID, - }; - sinon.stub(lambdaClient.client, "updateFunctionConfiguration").callsArgWith(1, null, TEST_UPDATE_CONFIG_RESPONSE); - // call - lambdaClient.updateFunctionConfiguration(TEST_FUNCTION_ARN, TEST_FUNCTION_CONFIG, TEST_REVISION_ID, (err, data) => { - // verify - expect(data.RevisionId).equal(TEST_REVISION_ID); - done(); - }); - }); - }); -}); diff --git a/test/unit/clients/aws-client/lambda-client-test.ts b/test/unit/clients/aws-client/lambda-client-test.ts new file mode 100644 index 00000000..0e36a5c3 --- /dev/null +++ b/test/unit/clients/aws-client/lambda-client-test.ts @@ -0,0 +1,326 @@ +import {expect} from "chai"; +import sinon from "sinon"; +import { + LambdaClient as _LambdaClient, + AddPermissionCommand, + CreateFunctionCommand, + GetFunctionCommand, + UpdateFunctionCodeCommand, + UpdateFunctionConfigurationCommand, +} from "@aws-sdk/client-lambda"; + +import LambdaClient from "../../../../lib/clients/aws-client/lambda-client"; + +describe("Clients test - lambda client test", () => { + const TEST_AWS_PROFILE = "TEST_AWS_PROFILE"; + const TEST_AWS_REGION = "TEST_AWS_REGION"; + const TEST_CONFIGURATION = { + awsProfile: TEST_AWS_PROFILE, + awsRegion: TEST_AWS_REGION, + }; + const TEST_FUNCTION_ARN = "function_arn"; + const TEST_SKILL_ID = "skill_id"; + const TEST_REVISION_ID = "revision_id"; + const TEST_ZIPFILE = Buffer.from("zipfile"); + const TEST_FUNCTION_NAME = "function_name"; + const TEST_FUNCTION_RUNTIME = "function_runtime"; + const TEST_FUNCTION_HANDLER = "function_handler"; + const TEST_FUNCTION_MEMORY_SIZE = 512; + const TEST_FUNCTION_TIMEOUT = 15; + const TEST_FUNCTION_DESCRIPTION = "function_description"; + const TEST_FUNCTION_ENV_VARS = {TEST_ENV_1: "function_env_1"}; + const TEST_FUNCTION_CONFIG = { + runtime: TEST_FUNCTION_RUNTIME, + handler: TEST_FUNCTION_HANDLER, + memorySize: TEST_FUNCTION_MEMORY_SIZE, + timeout: TEST_FUNCTION_TIMEOUT, + description: TEST_FUNCTION_DESCRIPTION, + environmentVariables: TEST_FUNCTION_ENV_VARS, + }; + let lambdaClient: LambdaClient, sendCommandStub: sinon.SinonStub; + + beforeEach(() => { + lambdaClient = new LambdaClient(TEST_CONFIGURATION); + sendCommandStub = sinon.stub(_LambdaClient.prototype, "send"); + }); + + afterEach(() => { + sinon.restore(); + }); + + describe("# constructor tests", () => { + it("| inspect correctness for constructor when awsRegion is set in configuration.", () => { + expect(lambdaClient).to.be.instanceOf(LambdaClient); + expect(lambdaClient.credentials).to.be.a("function"); + expect(lambdaClient.profile).equal(TEST_AWS_PROFILE); + expect(lambdaClient.region).equal(TEST_AWS_REGION); + }); + + it("| inspect an error for constructor when awsRegion is null in configuration.", () => { + const configuration = { + awsProfile: TEST_AWS_PROFILE, + awsRegion: undefined, + }; + expect(() => new LambdaClient(configuration)).to.throw("Invalid awsProfile or Invalid awsRegion"); + }); + + it("| inspect an error for constructor when awsRegion is blank in configuration.", () => { + const configuration = { + awsProfile: " ", + awsRegion: TEST_AWS_REGION, + }; + expect(() => new LambdaClient(configuration)).to.throw("Invalid awsProfile or Invalid awsRegion"); + }); + }); + + describe("# function createLambdaFunction tests", () => { + const TEST_IAM_ROLE = "iam_role"; + + it("| call aws-sdk createFunctionCommand with same params from input", () => { + // call + lambdaClient.createLambdaFunction(TEST_FUNCTION_NAME, TEST_FUNCTION_CONFIG, TEST_IAM_ROLE, TEST_ZIPFILE); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(CreateFunctionCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + Code: { + ZipFile: TEST_ZIPFILE, + }, + FunctionName: TEST_FUNCTION_NAME, + Handler: TEST_FUNCTION_HANDLER, + MemorySize: TEST_FUNCTION_MEMORY_SIZE, + Role: TEST_IAM_ROLE, + Runtime: TEST_FUNCTION_RUNTIME, + Timeout: TEST_FUNCTION_TIMEOUT, + Description: TEST_FUNCTION_DESCRIPTION, + Environment: { + Variables: TEST_FUNCTION_ENV_VARS, + }, + }); + }); + + it("| create Lambda function request fails, expect an error return.", (done) => { + // setup + const TEST_CREATE_FUNCTION_ERR = new Error("create_function_error"); + sendCommandStub.rejects(TEST_CREATE_FUNCTION_ERR); + // call + lambdaClient.createLambdaFunction(TEST_FUNCTION_NAME, TEST_FUNCTION_CONFIG, TEST_IAM_ROLE, TEST_ZIPFILE).catch((err) => { + // verify + expect(err).equal(TEST_CREATE_FUNCTION_ERR); + done(); + }); + }); + + it("| create Lambda function request passes, expect lambda data return.", (done) => { + // setup + const TEST_CREATE_FUNCTION_RESPONSE = { + FunctionArn: TEST_FUNCTION_ARN, + }; + sendCommandStub.resolves(TEST_CREATE_FUNCTION_RESPONSE); + // call + lambdaClient.createLambdaFunction(TEST_FUNCTION_NAME, TEST_FUNCTION_CONFIG, TEST_IAM_ROLE, TEST_ZIPFILE).then((res) => { + // verify + expect(res.FunctionArn).equal(TEST_FUNCTION_ARN); + done(); + }); + }); + }); + + describe("# function addAlexaPermissionByDomain tests", () => { + it("| call aws-sdk addPermissionCommand with same params from input", () => { + // setup + const TEST_DOMAIN = "custom"; + const now = Date.now(); + sinon.useFakeTimers(now); + // call + lambdaClient.addAlexaPermissionByDomain(TEST_DOMAIN, TEST_SKILL_ID, TEST_FUNCTION_ARN); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(AddPermissionCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + FunctionName: TEST_FUNCTION_ARN, + StatementId: now.toString(), + Action: "lambda:InvokeFunction", + Principal: "alexa-appkit.amazon.com", + EventSourceToken: TEST_SKILL_ID, + }); + }); + + it("| add Alexa permission by custom domain request fails, expect an error return.", (done) => { + // setup + const TEST_DOMAIN = "custom"; + const TEST_ADD_PERMISSION_ERR = new Error("ADD_PERMISSION_ERROR"); + sendCommandStub.rejects(TEST_ADD_PERMISSION_ERR); + // call + lambdaClient.addAlexaPermissionByDomain(TEST_DOMAIN, TEST_SKILL_ID, TEST_FUNCTION_ARN).catch((err) => { + // verify + expect(err).equal(TEST_ADD_PERMISSION_ERR); + done(); + }); + }); + + it("| add Alexa permission by smartHome domain request fails, expect an error return.", (done) => { + // setup + const TEST_DOMAIN = "smartHome"; + const TEST_ADD_PERMISSION_ERR = new Error("ADD_PERMISSION_ERROR"); + sendCommandStub.rejects(TEST_ADD_PERMISSION_ERR); + // call + lambdaClient.addAlexaPermissionByDomain(TEST_DOMAIN, TEST_SKILL_ID, TEST_FUNCTION_ARN).catch((err) => { + // verify + expect(err).equal(TEST_ADD_PERMISSION_ERR); + done(); + }); + }); + + it("| add Alexa permission by video domain request passes, expect a response.", (done) => { + // setup + const TEST_DOMAIN = "video"; + const TEST_ADD_PERMISSION_RESPOSNE = "ADD_PERMISSION_RESPOSNE"; + sendCommandStub.resolves(TEST_ADD_PERMISSION_RESPOSNE); + // call + lambdaClient.addAlexaPermissionByDomain(TEST_DOMAIN, TEST_SKILL_ID, TEST_FUNCTION_ARN).then((res) => { + // verify + expect(res).equal(TEST_ADD_PERMISSION_RESPOSNE); + done(); + }); + }); + + it("| add Alexa permission by invlid domain request fails, expect an error return.", (done) => { + // setup + const TEST_DOMAIN = "non-existing"; + const TEST_ADD_PERMISSION_ERR = new Error("ADD_PERMISSION_ERROR"); + sendCommandStub.rejects(TEST_ADD_PERMISSION_ERR); + // call + lambdaClient.addAlexaPermissionByDomain(TEST_DOMAIN, TEST_SKILL_ID, TEST_FUNCTION_ARN).catch((err) => { + // verify + expect(err).equal(TEST_ADD_PERMISSION_ERR); + done(); + }); + }); + }); + + describe("# function getFunction tests", () => { + it("| call aws-sdk getFunctionCommand with same params from input", () => { + // call + lambdaClient.getFunction(TEST_FUNCTION_ARN); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(GetFunctionCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + FunctionName: TEST_FUNCTION_ARN, + }); + }); + + it("| get Function request fails, expect an error return.", (done) => { + // setup + const TEST_GET_FUNCTION_ERR = new Error("GET_FUNCTION_ERROR"); + sendCommandStub.rejects(TEST_GET_FUNCTION_ERR); + // call + lambdaClient.getFunction(TEST_FUNCTION_ARN).catch((err) => { + // verify + expect(err).equal(TEST_GET_FUNCTION_ERR); + done(); + }); + }); + + it("| get Function request passes, expect a revision id return.", (done) => { + // setup + const TEST_GET_FUNCTION_RESPONSE = { + Configuration: { + RevisionId: TEST_REVISION_ID, + }, + }; + sendCommandStub.resolves(TEST_GET_FUNCTION_RESPONSE); + // call + lambdaClient.getFunction(TEST_FUNCTION_ARN).then((res) => { + // verify + expect(res.Configuration?.RevisionId).equal(TEST_REVISION_ID); + done(); + }); + }); + }); + + describe("# function updateFunctionCode tests", () => { + it("| call aws-sdk updateFunctionCodeCommand with same params from input", () => { + // call + lambdaClient.updateFunctionCode(TEST_FUNCTION_ARN, TEST_ZIPFILE, TEST_REVISION_ID); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(UpdateFunctionCodeCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + FunctionName: TEST_FUNCTION_ARN, + ZipFile: TEST_ZIPFILE, + RevisionId: TEST_REVISION_ID, + }); + }); + + it("| update function code request fails, expect an error return.", (done) => { + // setup + const TEST_UPDATE_CODE_ERR = new Error("UPDATE_CODE_ERROR"); + sendCommandStub.rejects(TEST_UPDATE_CODE_ERR); + // call + lambdaClient.updateFunctionCode(TEST_FUNCTION_ARN, TEST_ZIPFILE, TEST_REVISION_ID).catch((err) => { + // verify + expect(err).equal(TEST_UPDATE_CODE_ERR); + done(); + }); + }); + + it("| update function code request passes, expect function data return.", (done) => { + // setup + const TEST_UPDATE_CODE_RESPONSE = { + FunctionArn: TEST_FUNCTION_ARN, + }; + sendCommandStub.resolves(TEST_UPDATE_CODE_RESPONSE); + // call + lambdaClient.updateFunctionCode(TEST_FUNCTION_ARN, TEST_ZIPFILE, TEST_REVISION_ID).then((res) => { + // verify + expect(res.FunctionArn).equal(TEST_FUNCTION_ARN); + done(); + }); + }); + }); + + describe("# function update function configuration tests", () => { + it("| call aws-sdk updateFunctionConfigurationCommand with same params from input", () => { + // call + lambdaClient.updateFunctionConfiguration(TEST_FUNCTION_ARN, TEST_FUNCTION_CONFIG, TEST_REVISION_ID); + // verify + expect(sendCommandStub.args[0][0]).to.be.instanceof(UpdateFunctionConfigurationCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal({ + FunctionName: TEST_FUNCTION_ARN, + Handler: TEST_FUNCTION_HANDLER, + MemorySize: TEST_FUNCTION_MEMORY_SIZE, + RevisionId: TEST_REVISION_ID, + Runtime: TEST_FUNCTION_RUNTIME, + Timeout: TEST_FUNCTION_TIMEOUT, + Description: TEST_FUNCTION_DESCRIPTION, + Environment: { + Variables: TEST_FUNCTION_ENV_VARS, + }, + }); + }); + + it("| update function configuration request fails, expect an error return.", (done) => { + // setup + const TEST_UPDATE_CONFIG_ERR = new Error("UPDATE_CONFIG_ERROR"); + sendCommandStub.rejects(TEST_UPDATE_CONFIG_ERR); + // call + lambdaClient.updateFunctionConfiguration(TEST_FUNCTION_ARN, TEST_FUNCTION_CONFIG, TEST_REVISION_ID).catch((err) => { + // verify + expect(err).equal(TEST_UPDATE_CONFIG_ERR); + done(); + }); + }); + + it("| update function configuration request passes, expect null error return.", (done) => { + // setup + const TEST_UPDATE_CONFIG_RESPONSE = { + RevisionId: TEST_REVISION_ID, + }; + sendCommandStub.resolves(TEST_UPDATE_CONFIG_RESPONSE); + // call + lambdaClient.updateFunctionConfiguration(TEST_FUNCTION_ARN, TEST_FUNCTION_CONFIG, TEST_REVISION_ID).then((res) => { + // verify + expect(res.RevisionId).equal(TEST_REVISION_ID); + done(); + }); + }); + }); +}); diff --git a/test/unit/clients/aws-client/s3-client-test.js b/test/unit/clients/aws-client/s3-client-test.js deleted file mode 100644 index 421e33ea..00000000 --- a/test/unit/clients/aws-client/s3-client-test.js +++ /dev/null @@ -1,623 +0,0 @@ -const {expect} = require("chai"); -const sinon = require("sinon"); -const aws = require("aws-sdk"); -const path = require("path"); -const proxyquire = require("proxyquire"); -const fs = require("fs"); - -const S3Client = require("../../../../lib/clients/aws-client/s3-client"); - -describe("Clients test - s3 client test", () => { - const TEST_AWS_PROFILE = "TEST_AWS_PROFILE"; - const TEST_AWS_REGION = "TEST_AWS_REGION"; - const TEST_CONFIGURATION = { - awsProfile: TEST_AWS_PROFILE, - awsRegion: TEST_AWS_REGION, - }; - const TEST_BUCKET_NAME = "BUCKET_NAME"; - const TEST_BUCKET_KEY = "BUCKET_KEY"; - const TEST_BUCKET_BODY = "BUCKET_BODY"; - const TEST_HEAD_ERROR = "HEAD_ERROR"; - const TEST_CREATE_ERROR = "HEAD_ERROR"; - const TEST_PUTVERSION_ERROR = "HEAD_ERROR"; - const TEST_WAITFOR_ERROR = "WAITFOR_ERROR"; - const TEST_PUTOBJECT_ERROR = "PUTOBJECT_ERROR"; - const TEST_GETVERSION_ERROR = "GETVERSION_ERROR"; - const TEST_RESPONSE = "RESPONSE"; - - describe("# constructor tests", () => { - it("| inspect correctness for constructor when awsRegion is set in configuration", () => { - const s3Client = new S3Client(TEST_CONFIGURATION); - expect(s3Client).to.be.instanceof(S3Client); - expect(s3Client.awsRegion).equal(TEST_AWS_REGION); - expect(aws.config.region).equal(TEST_AWS_REGION); - expect(aws.config.credentials).deep.equal(new aws.SharedIniFileCredentials({profile: TEST_AWS_PROFILE})); - }); - - it("| inspect correctness for constructor when awsRegion is null in configuration", () => { - const configuration = { - awsProfile: TEST_AWS_PROFILE, - awsRegion: null, - }; - try { - new S3Client(configuration); - } catch (e) { - expect(e.message).equal("Invalid awsProfile or Invalid awsRegion"); - } - }); - - it("| inspect correctness for constructor when awsProfile is blank in configuration", () => { - const configuration = { - awsProfile: " ", - awsRegion: TEST_AWS_REGION, - }; - try { - new S3Client(configuration); - } catch (e) { - expect(e.message).equal("Invalid awsProfile or Invalid awsRegion"); - } - }); - }); - - describe("# function preSignedPutObject tests", () => { - let proxyClient; - let stubRequest; - let putStub; - const TEST_OPTION = {}; - beforeEach(() => { - putStub = sinon.stub(); - stubRequest = { - put: putStub, - }; - proxyClient = proxyquire("../../../../lib/clients/aws-client/s3-client", { - request: stubRequest, - }); - }); - - afterEach(() => { - sinon.restore(); - }); - - it("| input pre-signed S3 url is not string, expect error thrown ", (done) => { - // setup - const TEST_URL = {}; - // call - proxyClient.preSignedPutObject(TEST_URL, TEST_OPTION, (err) => { - // verify - expect(err).equal("[Error]: The url for the S3 presigned URL upload must not be blank."); - done(); - }); - }); - - it("| input pre-signed S3 url is empty sting, expect error thrown ", (done) => { - // setup - const TEST_URL = ""; - // call - proxyClient.preSignedPutObject(TEST_URL, TEST_OPTION, (err) => { - // verify - expect(err).equal("[Error]: The url for the S3 presigned URL upload must not be blank."); - done(); - }); - }); - - it("| input pre-signed S3 url is empty, expect error thrown ", (done) => { - // setup - const TEST_URL = "pre-signed_S3_url"; - putStub.callsArgWith(2, null); - // call - proxyClient.preSignedPutObject(TEST_URL, TEST_OPTION, (err) => { - // verify - expect(err).equal(null); - done(); - }); - }); - }); - - describe("# function putObject tests", () => { - it("| s3Client putObject method correctly pass params to S3 pubObject method, and callback error when pubObject callback error", (done) => { - // setup - const s3Client = new S3Client(TEST_CONFIGURATION); - const expectedParams = { - Body: TEST_BUCKET_BODY, - Bucket: TEST_BUCKET_NAME, - Key: TEST_BUCKET_KEY, - }; - sinon.stub(s3Client.client, "putObject").withArgs(expectedParams, sinon.match.func).callsArgWith(1, TEST_PUTOBJECT_ERROR); - // call - s3Client.putObject(TEST_BUCKET_NAME, TEST_BUCKET_KEY, TEST_BUCKET_BODY, (err, response) => { - // verify - expect(s3Client.client.putObject.args[0][0]).deep.equal(expectedParams); - expect(err).equal(TEST_PUTOBJECT_ERROR); - expect(response).equal(null); - done(); - }); - }); - - it("| s3Client putObject method correctly pass params to S3 pubObject method, and callback response when S3 pubObject succeed", (done) => { - // setup - const s3Client = new S3Client(TEST_CONFIGURATION); - const expectedParams = { - Body: TEST_BUCKET_BODY, - Bucket: TEST_BUCKET_NAME, - Key: TEST_BUCKET_KEY, - }; - sinon.stub(s3Client.client, "putObject").withArgs(expectedParams, sinon.match.func).callsArgWith(1, null, TEST_RESPONSE); - // call - s3Client.putObject(TEST_BUCKET_NAME, TEST_BUCKET_KEY, TEST_BUCKET_BODY, (error, response) => { - // verify - expect(s3Client.client.putObject.args[0][0]).deep.equal(expectedParams); - expect(error).equal(null); - expect(response).equal(TEST_RESPONSE); - done(); - }); - }); - }); - - describe("# function waitForBucketExists tests", () => { - it("| s3Client waitfor bucketExists event and s3client request fails, expect error callback", (done) => { - // setup - const s3Client = new S3Client(TEST_CONFIGURATION); - const expectedParams = { - Bucket: TEST_BUCKET_NAME, - }; - sinon.stub(s3Client.client, "waitFor").withArgs("bucketExists", expectedParams, sinon.match.func).callsArgWith(2, TEST_WAITFOR_ERROR); - // call - s3Client.waitForBucketExists(TEST_BUCKET_NAME, (error, response) => { - // verify - expect(error).equal(TEST_WAITFOR_ERROR); - expect(response).equal(null); - done(); - }); - }); - - it("| s3Client waitfor bucketExists event and s3client request pass, expect callback response", (done) => { - // setup - const s3Client = new S3Client(TEST_CONFIGURATION); - const expectedParams = { - Bucket: TEST_BUCKET_NAME, - }; - sinon - .stub(s3Client.client, "waitFor") - .withArgs("bucketExists", expectedParams, sinon.match.func) - .callsArgWith(2, null, TEST_RESPONSE); - // call - s3Client.waitForBucketExists(TEST_BUCKET_NAME, (error, response) => { - // verify - expect(error).equal(null); - expect(response).equal(TEST_RESPONSE); - done(); - }); - }); - }); - - // TODO fix the unit test of this function - describe.skip("# function putBucketVersioning tests", () => { - it( - "| s3Client putBucketVersioning method correctly pass params to S3 putBucketVersioning method, " + - "and callback error when S3 pubBucketVersioning callback error", - (done) => { - // setup - const s3Client = new S3Client(TEST_CONFIGURATION); - const MFADelete = "Disabled"; - const Status = "Enabled"; - const expectedParams = { - Bucket: TEST_BUCKET_NAME, - VersioningConfiguration: { - MFADelete, - Status, - }, - }; - sinon - .stub(s3Client.client, "putBucketVersioning") - .withArgs(expectedParams, sinon.match.func) - .callsArgWith(1, TEST_PUTVERSION_ERROR); - // call - s3Client.putBucketVersioning(TEST_BUCKET_NAME, MFADelete, Status, (error, response) => { - // verify - expect(s3Client.client.putBucketVersioning.args[0][0]).deep.equal(expectedParams); - expect(error).equal(TEST_PUTVERSION_ERROR); - expect(response).equal(null); - done(); - }); - }, - ); - - it( - "| s3Client putBucketVersioning method can correctly pass params to aws S3 putBucketVersioning method, " + - "and callback response when S3 putBucketVersioning is executed correctly", - (done) => { - // setup - const s3Client = new S3Client(TEST_CONFIGURATION); - const expectedParams = { - Bucket: TEST_BUCKET_NAME, - VersioningConfiguration: { - MFADelete: "Disabled", - Status: "Enabled", - }, - }; - sinon.stub(s3Client.client, "putBucketVersioning").withArgs(expectedParams, sinon.match.func).callsArgWith(1, null, TEST_RESPONSE); - // call - s3Client.putBucketVersioning(TEST_BUCKET_NAME, "Disabled", "Enabled", (error, response) => { - // verify - expect(s3Client.client.putBucketVersioning.args[0][0]).deep.equal(expectedParams); - expect(error).equal(null); - expect(response).equal(TEST_RESPONSE); - done(); - }); - }, - ); - }); - - describe("# function createBucket tests", () => { - it( - "| s3Client createBucket method can correctly pass params to aws S3 createBucket method when region is us-east-1, " + - "and callback error when S3 createBucket callback error", - (done) => { - // setup - const s3Client = new S3Client(TEST_CONFIGURATION); - const expectedParams = { - Bucket: TEST_BUCKET_NAME, - }; - sinon.stub(s3Client.client, "createBucket").withArgs(expectedParams, sinon.match.func).callsArgWith(1, TEST_CREATE_ERROR); - // call - s3Client.createBucket(TEST_BUCKET_NAME, "us-east-1", (error, response) => { - // verify - expect(s3Client.client.createBucket.args[0][0]).deep.equal(expectedParams); - expect(error).equal(TEST_CREATE_ERROR); - expect(response).equal(null); - done(); - }); - }, - ); - - it( - "| s3Client createBucket method can correctly pass params to aws S3 createBucket method when region is not us-east-1," + - " and callback response when S3 createBucket is executed correctly", - (done) => { - // setup - const s3Client = new S3Client(TEST_CONFIGURATION); - const expectedParams = { - Bucket: TEST_BUCKET_NAME, - CreateBucketConfiguration: { - LocationConstraint: TEST_AWS_REGION, - }, - }; - sinon.stub(s3Client.client, "createBucket").withArgs(expectedParams, sinon.match.func).callsArgWith(1, null, TEST_RESPONSE); - // call - s3Client.createBucket(TEST_BUCKET_NAME, TEST_AWS_REGION, (error, response) => { - // verify - expect(s3Client.client.createBucket.args[0][0]).deep.equal(expectedParams); - expect(error).equal(null); - expect(response).equal(TEST_RESPONSE); - done(); - }); - }, - ); - }); - - describe("# function headBucket tests", () => { - it( - "| s3Client headBucket method can correctly pass params to aws S3 headBucket method, " + - "and callback error when S3 headBucket callback error", - (done) => { - // setup - const s3Client = new S3Client(TEST_CONFIGURATION); - const expectedParams = { - Bucket: TEST_BUCKET_NAME, - }; - sinon.stub(s3Client.client, "headBucket").withArgs(expectedParams, sinon.match.func).callsArgWith(1, TEST_HEAD_ERROR); - // call - s3Client.headBucket(TEST_BUCKET_NAME, (error, response) => { - // verify - expect(s3Client.client.headBucket.args[0][0]).deep.equal(expectedParams); - expect(error).equal(TEST_HEAD_ERROR); - expect(response).equal(null); - done(); - }); - }, - ); - - it( - "| s3Client headBucket method can correctly pass params to aws S3 headBucket method, " + - "and callback response when S3 headBucket is executed correctly", - (done) => { - // setup - const s3Client = new S3Client(TEST_CONFIGURATION); - const expectedParams = { - Bucket: TEST_BUCKET_NAME, - }; - sinon.stub(s3Client.client, "headBucket").withArgs(expectedParams, sinon.match.func).callsArgWith(1, null, TEST_RESPONSE); - // call - s3Client.headBucket(TEST_BUCKET_NAME, (error, response) => { - // verify - expect(s3Client.client.headBucket.args[0][0]).deep.equal(expectedParams); - expect(error).equal(null); - expect(response).equal(TEST_RESPONSE); - done(); - }); - }, - ); - }); - - // TODO fix the unit test of this function - describe.skip("# function getBucketVersioning tests", () => { - it( - "| s3Client getBucketVersioning method, can correctly pass params to aws S3 getBucketVersioning method, " + - "and callback error when S3 getBucketVersioning callback error ", - (done) => { - // setup - const s3Client = new S3Client(TEST_CONFIGURATION); - const expectedParams = { - Bucket: TEST_BUCKET_NAME, - }; - sinon - .stub(s3Client.client, "getBucketVersioning") - .withArgs(expectedParams, sinon.match.func) - .callsArgWith(1, TEST_GETVERSION_ERROR); - // call - s3Client.getBucketVersioning(TEST_BUCKET_NAME, (error, response) => { - // verify - expect(s3Client.client.getBucketVersioning.args[0][0]).deep.equal(expectedParams); - expect(error).equal(TEST_GETVERSION_ERROR); - expect(response).equal(null); - done(); - }); - }, - ); - - it( - "| s3Client getBucketVersioning method, can correctly pass params to aws S3 getBucketVersioning method, " + - "and callback response when S3 getBucketVersioning is executed correctly", - (done) => { - // setup - const s3Client = new S3Client(TEST_CONFIGURATION); - const expectedParams = { - Bucket: TEST_BUCKET_NAME, - }; - sinon.stub(s3Client.client, "getBucketVersioning").withArgs(expectedParams, sinon.match.func).callsArgWith(1, null, TEST_RESPONSE); - // call - s3Client.getBucketVersioning(TEST_BUCKET_NAME, (error, response) => { - // verify - expect(s3Client.client.getBucketVersioning.args[0][0]).deep.equal(expectedParams); - expect(error).equal(null); - expect(response).equal(TEST_RESPONSE); - done(); - }); - }, - ); - }); - - describe("# function createBucketIfNotExist tests", () => { - const s3Client = new S3Client(TEST_CONFIGURATION); - it("| when headBucket return error, provisionBucket can correctly callback error message", (done) => { - // setup - sinon.stub(s3Client, "headBucket").callsArgWith(1, TEST_HEAD_ERROR); - - // call - s3Client.createBucketIfNotExist(TEST_BUCKET_NAME, TEST_AWS_REGION, (error) => { - // verify - expect(error).equal(TEST_HEAD_ERROR); - done(); - }); - }); - - it("| when headBucket return response without error, directly callback with no argument", (done) => { - // setup - sinon.stub(s3Client, "headBucket").callsArgWith(1, null, TEST_RESPONSE); - sinon.stub(s3Client, "createBucket"); - sinon.stub(s3Client, "putBucketVersioningIfUninitialized"); - // call - s3Client.createBucketIfNotExist(TEST_BUCKET_NAME, TEST_AWS_REGION, (error) => { - // verify - expect(s3Client.createBucket.calledOnce).equal(false); - expect(error).equal(undefined); - done(); - }); - }); - - it("| when headBucket callback NotFound error, createBucketIfNotExist can handle error from createBucket", (done) => { - // setup - sinon.stub(s3Client, "headBucket").callsArgWith(1, {code: "NotFound"}); - sinon.stub(s3Client, "createBucket").callsArgWith(2, TEST_CREATE_ERROR, null); - // call - s3Client.createBucketIfNotExist(TEST_BUCKET_NAME, TEST_AWS_REGION, (error) => { - // verify - expect(error).equal(TEST_CREATE_ERROR); - done(); - }); - }); - - it("| when waitFor return with error, callback with the error", (done) => { - // setup - sinon.stub(s3Client, "headBucket").callsArgWith(1, {code: "NotFound"}); - sinon.stub(s3Client, "createBucket").callsArgWith(2, null, TEST_RESPONSE); - sinon.stub(s3Client, "waitForBucketExists").callsArgWith(1, TEST_WAITFOR_ERROR); - sinon.stub(s3Client, "putBucketVersioningIfUninitialized"); - // call - s3Client.createBucketIfNotExist(TEST_BUCKET_NAME, TEST_AWS_REGION, (error) => { - // verify - expect(error).equal(TEST_WAITFOR_ERROR); - done(); - }); - }); - - it("| when create bucket succeeds, callback directly callback without error", (done) => { - // setup - sinon.stub(s3Client, "headBucket").callsArgWith(1, {code: "NotFound"}); - sinon.stub(s3Client, "createBucket").callsArgWith(2, null, TEST_RESPONSE); - sinon.stub(s3Client, "waitForBucketExists").callsArgWith(1); - sinon.stub(s3Client, "putBucketVersioningIfUninitialized"); - // call - s3Client.createBucketIfNotExist(TEST_BUCKET_NAME, TEST_AWS_REGION, (error) => { - // verify - expect(s3Client.createBucket.calledOnce).equal(true); - expect(s3Client.waitForBucketExists.calledOnce).equal(true); - expect(error).equal(undefined); - done(); - }); - }); - }); - - describe("# function provisionBucketAndPutObject tests", () => { - const TEST_PROVISIONBUCKET_ERROR = "PROVISIONBUCKET_ERROR"; - const TEST_LAMBDA_REGION = "LAMBDA_REGION"; - const TEST_FILE_PATH = "FILE_PATH"; - - const s3Client = new S3Client(TEST_CONFIGURATION); - - it("| callback createErr when createBucketIfNotExist function return error", (done) => { - // setup - sinon.stub(s3Client, "createBucketIfNotExist").callsArgWith(2, TEST_CREATE_ERROR); - // call - s3Client.provisionBucketAndPutObject(TEST_BUCKET_NAME, TEST_BUCKET_KEY, TEST_LAMBDA_REGION, TEST_FILE_PATH, (error) => { - // verify - expect(error).equal(TEST_CREATE_ERROR); - done(); - }); - }); - - it("| callback provisionErr when provisionBucket function return error", (done) => { - // setup - sinon.stub(s3Client, "createBucketIfNotExist").callsArgWith(2); - sinon.stub(s3Client, "putBucketVersioningIfUninitialized").callsArgWith(1, TEST_PROVISIONBUCKET_ERROR); - // call - s3Client.provisionBucketAndPutObject(TEST_BUCKET_NAME, TEST_BUCKET_KEY, TEST_LAMBDA_REGION, TEST_FILE_PATH, (error) => { - // verify - expect(error).equal(TEST_PROVISIONBUCKET_ERROR); - done(); - }); - }); - - it("| callback putErr when putObject function return error", (done) => { - // setup - sinon.stub(fs, "readFileSync"); - sinon.stub(s3Client, "createBucketIfNotExist").callsArgWith(2); - sinon.stub(s3Client, "putBucketVersioningIfUninitialized").callsArgWith(1); - sinon.stub(s3Client, "putObject").callsArgWith(3, TEST_PUTOBJECT_ERROR); - // call - s3Client.provisionBucketAndPutObject(TEST_BUCKET_NAME, TEST_BUCKET_KEY, TEST_LAMBDA_REGION, TEST_FILE_PATH, (error) => { - // verify - expect(error).equal(TEST_PUTOBJECT_ERROR); - done(); - }); - }); - - it("| callback putResponse when putObject function is executed correctly", (done) => { - // setup - sinon.stub(fs, "readFileSync"); - sinon.stub(s3Client, "createBucketIfNotExist").callsArgWith(2); - sinon.stub(s3Client, "putBucketVersioningIfUninitialized").callsArgWith(1); - sinon.stub(s3Client, "putObject").callsArgWith(3, null, TEST_RESPONSE); - // call - s3Client.provisionBucketAndPutObject(TEST_BUCKET_NAME, TEST_BUCKET_KEY, TEST_LAMBDA_REGION, TEST_FILE_PATH, (error, response) => { - // verify - expect(error).equal(null); - expect(response).equal(TEST_RESPONSE); - done(); - }); - }); - }); - - describe("# function putBucketVersioningIfUninitialized tests", () => { - const s3Client = new S3Client(TEST_CONFIGURATION); - - it("| callback error when getBucketVersioning return error", (done) => { - // setup - sinon.stub(s3Client, "getBucketVersioning").callsArgWith(1, TEST_GETVERSION_ERROR); - // call - s3Client.putBucketVersioningIfUninitialized(TEST_BUCKET_NAME, (error) => { - // verify - expect(error).equal(TEST_GETVERSION_ERROR); - done(); - }); - }); - - it("| callback error when getBucketVersioning return empty object and putBucketVersioning return error", (done) => { - // setup - sinon.stub(s3Client, "getBucketVersioning").callsArgWith(1, null, {}); - sinon.stub(s3Client, "putBucketVersioning").callsArgWith(3, TEST_PUTVERSION_ERROR); - // call - s3Client.putBucketVersioningIfUninitialized(TEST_BUCKET_NAME, (error) => { - // verify - expect(error).equal(TEST_PUTVERSION_ERROR); - done(); - }); - }); - - it("| callback with no argument when getBucketVersioning return empty object and putBucketVersioning is executed correctly", (done) => { - // setup - sinon.stub(s3Client, "getBucketVersioning").callsArgWith(1, null, {}); - sinon.stub(s3Client, "putBucketVersioning").callsArgWith(3, null, TEST_RESPONSE); - // call - s3Client.putBucketVersioningIfUninitialized(TEST_BUCKET_NAME, (error) => { - // verify - expect(error).equal(undefined); - done(); - }); - }); - - it("| callback with no argument when getBucketVersioning return non-empty object", (done) => { - // setup - sinon.stub(s3Client, "getBucketVersioning").callsArgWith(1, null, {a: "b"}); - sinon.stub(s3Client, "putBucketVersioning"); - // call - s3Client.putBucketVersioningIfUninitialized(TEST_BUCKET_NAME, (error) => { - // verify - expect(s3Client.putBucketVersioning.calledOnce).equal(false); - expect(error).equal(undefined); - done(); - }); - }); - }); - - describe("# function generateBucketName tests", () => { - const TEST_REAL_AWS_REGION = "ap-northeast-1"; - const TEST_PROFILE_NAME = "1234567890"; - - beforeEach(() => { - sinon.useFakeTimers(Date.UTC(2016, 2, 15)); - }); - - it("| when user project name is longer than 22 characters and profile name is longer than 9 characters", () => { - sinon.stub(path, "basename").callsFake(() => "123456789012345678901234"); - const expectedName = "ask-1234567890123456789012-123456789-apnortheast1-1458000000000"; - expect(S3Client.generateBucketName(TEST_PROFILE_NAME, TEST_REAL_AWS_REGION)).equal(expectedName); - }); - - it("| when user project name and profile name contain special characters which are not allowed", () => { - sinon.stub(path, "basename").callsFake(() => ";:,/ +=*&^%$#@test-name!~-."); - const profileName = "foo|{}[]?<>_"; - const expectedName = "ask-test-name-.-foo-apnortheast1-1458000000000"; - expect(S3Client.generateBucketName(profileName, TEST_REAL_AWS_REGION)).equal(expectedName); - }); - - it("| when user project name and profile name contain Capital characters", () => { - sinon.stub(path, "basename").callsFake(() => "TESTPROJECTNAME"); - const profileName = "PROFILE"; - const expectedName = "ask-testprojectname-profile-apnortheast1-1458000000000"; - expect(S3Client.generateBucketName(profileName, TEST_REAL_AWS_REGION)).equal(expectedName); - }); - }); - - describe("# function retryBucketVersionOperations tests", () => { - it("| when status code 404 should set retryable property to true", () => { - const response = {httpResponse: {statusCode: 404}, error: {}}; - const s3Client = new S3Client(TEST_CONFIGURATION); - - s3Client.retryBucketVersionOperations(response); - expect(response.error.retryable).equal(true); - }); - - it("| when status code is not 404 should not set retryable property to true", () => { - const response = {httpResponse: {statusCode: 200}, error: {}}; - const s3Client = new S3Client(TEST_CONFIGURATION); - - s3Client.retryBucketVersionOperations(response); - expect(response.error.retryable).equal(undefined); - }); - }); - - afterEach(() => { - sinon.restore(); - }); -}); diff --git a/test/unit/clients/aws-client/s3-client-test.ts b/test/unit/clients/aws-client/s3-client-test.ts new file mode 100644 index 00000000..3c8109d6 --- /dev/null +++ b/test/unit/clients/aws-client/s3-client-test.ts @@ -0,0 +1,329 @@ +import {expect} from "chai"; +import sinon from "sinon"; +import proxyquire from "proxyquire"; +import { + S3Client as _S3Client, + CreateBucketCommand, + GetBucketVersioningCommand, + HeadBucketCommand, + PutBucketVersioningCommand, + PutObjectCommand, +} from "@aws-sdk/client-s3"; + +import S3Client from "../../../../lib/clients/aws-client/s3-client"; + +describe("Clients test - s3 client test", () => { + const TEST_AWS_PROFILE = "TEST_AWS_PROFILE"; + const TEST_AWS_REGION = "TEST_AWS_REGION"; + const TEST_CONFIGURATION = { + awsProfile: TEST_AWS_PROFILE, + awsRegion: TEST_AWS_REGION, + }; + const TEST_BUCKET_NAME = "BUCKET_NAME"; + const TEST_BUCKET_KEY = "BUCKET_KEY"; + const TEST_BUCKET_BODY = Buffer.from("BUCKET_BODY"); + const TEST_RESPONSE = "RESPONSE"; + let s3Client: S3Client, sendCommandStub: sinon.SinonStub, waitUntilBucketExistsStub: sinon.SinonStub; + + beforeEach(() => { + sendCommandStub = sinon.stub(_S3Client.prototype, "send"); + waitUntilBucketExistsStub = sinon.stub(); + const S3Client = proxyquire("../../../../lib/clients/aws-client/s3-client", { + "@aws-sdk/client-s3": { + waitUntilBucketExists: waitUntilBucketExistsStub, + }, + }).default; + s3Client = new S3Client(TEST_CONFIGURATION); + }); + + afterEach(() => { + sinon.restore(); + }); + + describe("# constructor tests", () => { + it("| inspect correctness for constructor when awsRegion is set in configuration", () => { + const s3Client = new S3Client(TEST_CONFIGURATION); + expect(s3Client).to.be.instanceof(S3Client); + expect(s3Client.credentials).to.be.a("function"); + expect(s3Client.profile).equal(TEST_AWS_PROFILE); + expect(s3Client.region).equal(TEST_AWS_REGION); + }); + + it("| inspect correctness for constructor when awsRegion is null in configuration", () => { + const configuration = { + awsProfile: TEST_AWS_PROFILE, + awsRegion: undefined, + }; + expect(() => new S3Client(configuration)).to.throw("Invalid awsProfile or Invalid awsRegion"); + }); + + it("| inspect correctness for constructor when awsProfile is blank in configuration", () => { + const configuration = { + awsProfile: " ", + awsRegion: TEST_AWS_REGION, + }; + expect(() => new S3Client(configuration)).to.throw("Invalid awsProfile or Invalid awsRegion"); + }); + }); + + describe("# function putObject tests", () => { + const expectedParams = { + Body: TEST_BUCKET_BODY, + Bucket: TEST_BUCKET_NAME, + Key: TEST_BUCKET_KEY, + }; + + it("| putObject method correctly pass params to S3 pubObject method, and error when pubObject error", (done) => { + // setup + const TEST_PUTOBJECT_ERROR = new Error("PUTOBJECT_ERROR"); + sendCommandStub.rejects(TEST_PUTOBJECT_ERROR); + // call + s3Client.putObject(TEST_BUCKET_NAME, TEST_BUCKET_KEY, TEST_BUCKET_BODY).catch((err) => { + // verify + expect(err).equal(TEST_PUTOBJECT_ERROR); + expect(sendCommandStub.args[0][0]).to.be.instanceof(PutObjectCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal(expectedParams); + done(); + }); + }); + + it("| putObject method correctly pass params to S3 pubObject method, and response when S3 pubObject succeed", (done) => { + // setup + sendCommandStub.resolves(TEST_RESPONSE); + // call + s3Client.putObject(TEST_BUCKET_NAME, TEST_BUCKET_KEY, TEST_BUCKET_BODY).then((res) => { + // verify + expect(res).equal(TEST_RESPONSE); + expect(sendCommandStub.args[0][0]).to.be.instanceof(PutObjectCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal(expectedParams); + done(); + }); + }); + }); + + describe("# function waitForBucketExists tests", () => { + const expectedParams = { + Bucket: TEST_BUCKET_NAME, + }; + + it("| waitForBucketExists method and s3client request fails, expect error", (done) => { + // setup + const TEST_WAITFOR_ERROR = new Error("WAITFOR_ERROR"); + waitUntilBucketExistsStub.rejects(TEST_WAITFOR_ERROR); + // call + s3Client.waitForBucketExists(TEST_BUCKET_NAME).catch((err) => { + // verify + expect(err).equal(TEST_WAITFOR_ERROR); + expect(waitUntilBucketExistsStub.args[0][1]).to.deep.equal(expectedParams); + done(); + }); + }); + + it("| waitForBucketExists method and s3client request pass, expect response", (done) => { + // setup + waitUntilBucketExistsStub.resolves(TEST_RESPONSE); + // call + s3Client.waitForBucketExists(TEST_BUCKET_NAME).then((res) => { + // verify + expect(res).equal(TEST_RESPONSE); + done(); + }); + }); + }); + + describe("# function enableBucketVersioning tests", () => { + const expectedParams = { + Bucket: TEST_BUCKET_NAME, + VersioningConfiguration: { + MFADelete: "Disabled", + Status: "Enabled", + }, + }; + + it( + "| enableBucketVersioning method correctly pass params to S3 putBucketVersioning method, " + + "and error when S3 pubBucketVersioning error", + (done) => { + // setup + const TEST_PUTVERSION_ERROR = new Error("HEAD_ERROR"); + sendCommandStub.rejects(TEST_PUTVERSION_ERROR); + // call + s3Client.enableBucketVersioning(TEST_BUCKET_NAME).catch((err) => { + // verify + expect(err).equal(TEST_PUTVERSION_ERROR); + expect(sendCommandStub.args[0][0]).to.be.instanceof(PutBucketVersioningCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal(expectedParams); + done(); + }); + }, + ); + + it( + "| enableBucketVersioning method can correctly pass params to aws S3 putBucketVersioning method, " + + "and response when S3 putBucketVersioning is executed correctly", + (done) => { + // setup + sendCommandStub.resolves(TEST_RESPONSE); + // call + s3Client.enableBucketVersioning(TEST_BUCKET_NAME).then((res) => { + // verify + expect(res).equal(TEST_RESPONSE); + expect(sendCommandStub.args[0][0]).to.be.instanceof(PutBucketVersioningCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal(expectedParams); + done(); + }); + }, + ); + }); + + describe("# function createBucket tests", () => { + it( + "| createBucket method can correctly pass params to aws S3 createBucket method when region is us-east-1, " + + "and error when S3 createBucket error", + (done) => { + // setup + const expectedParams = { + Bucket: TEST_BUCKET_NAME, + }; + const TEST_CREATE_ERROR = new Error("HEAD_ERROR"); + sendCommandStub.rejects(TEST_CREATE_ERROR); + // call + s3Client.createBucket(TEST_BUCKET_NAME, "us-east-1").catch((err) => { + // verify + expect(err).equal(TEST_CREATE_ERROR); + expect(sendCommandStub.args[0][0]).to.be.instanceof(CreateBucketCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal(expectedParams); + done(); + }); + }, + ); + + it( + "| createBucket method can correctly pass params to aws S3 createBucket method when region is not us-east-1," + + " and response when S3 createBucket is executed correctly", + (done) => { + // setup + const expectedParams = { + Bucket: TEST_BUCKET_NAME, + CreateBucketConfiguration: { + LocationConstraint: TEST_AWS_REGION, + }, + }; + sendCommandStub.resolves(TEST_RESPONSE); + // call + s3Client.createBucket(TEST_BUCKET_NAME, TEST_AWS_REGION).then((res) => { + // verify + expect(res).equal(TEST_RESPONSE); + expect(sendCommandStub.args[0][0]).to.be.instanceof(CreateBucketCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal(expectedParams); + done(); + }); + }, + ); + }); + + describe("# function bucketExits tests", () => { + const expectedParams = { + Bucket: TEST_BUCKET_NAME, + }; + + it( + "| bucketExits method can correctly pass params to aws S3 headBucket method, " + + "and return false when S3 headBucket not found error", + (done) => { + // setup + const TEST_HEAD_ERROR = { + $metadata: { + httpStatusCode: 404, + }, + }; + sendCommandStub.rejects(TEST_HEAD_ERROR); + // call + s3Client.bucketExits(TEST_BUCKET_NAME).then((res) => { + // verify + expect(res).to.be.false; + expect(sendCommandStub.args[0][0]).to.be.instanceof(HeadBucketCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal(expectedParams); + done(); + }); + }, + ); + + it( + "| bucketExits method can correctly pass params to aws S3 headBucket method, " + "and return error when S3 headBucket other error", + (done) => { + // setup + const TEST_HEAD_ERROR = { + name: "OtherError", + }; + sendCommandStub.rejects(TEST_HEAD_ERROR); + // call + s3Client.bucketExits(TEST_BUCKET_NAME).catch((err) => { + // verify + expect(err).equal(TEST_HEAD_ERROR); + expect(sendCommandStub.args[0][0]).to.be.instanceof(HeadBucketCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal(expectedParams); + done(); + }); + }, + ); + + it( + "| bucketExits method can correctly pass params to aws S3 headBucket method, " + + "and return true when S3 headBucket is executed correctly", + (done) => { + // setup + sendCommandStub.resolves(); + // call + s3Client.bucketExits(TEST_BUCKET_NAME).then((res) => { + // verify + expect(res).to.be.true; + expect(sendCommandStub.args[0][0]).to.be.instanceof(HeadBucketCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal(expectedParams); + done(); + }); + }, + ); + }); + + describe("# function getBucketVersioning tests", () => { + const expectedParams = { + Bucket: TEST_BUCKET_NAME, + }; + + it( + "| getBucketVersioning method, can correctly pass params to aws S3 getBucketVersioning method, " + + "and error when S3 getBucketVersioning error ", + (done) => { + // setup + const TEST_GETVERSION_ERROR = new Error("GETVERSION_ERROR"); + sendCommandStub.rejects(TEST_GETVERSION_ERROR); + // call + s3Client.getBucketVersioning(TEST_BUCKET_NAME).catch((err) => { + // verify + expect(err).equal(TEST_GETVERSION_ERROR); + expect(sendCommandStub.args[0][0]).to.be.instanceof(GetBucketVersioningCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal(expectedParams); + done(); + }); + }, + ); + + it( + "| getBucketVersioning method, can correctly pass params to aws S3 getBucketVersioning method, " + + "and response when S3 getBucketVersioning is executed correctly", + (done) => { + // setup + sendCommandStub.resolves(TEST_RESPONSE); + // call + s3Client.getBucketVersioning(TEST_BUCKET_NAME).then((res) => { + // verify + expect(res).equal(TEST_RESPONSE); + expect(sendCommandStub.args[0][0]).to.be.instanceof(GetBucketVersioningCommand); + expect(sendCommandStub.args[0][0].input).to.deep.equal(expectedParams); + done(); + }); + }, + ); + }); +}); diff --git a/test/unit/clients/http-client-test.js b/test/unit/clients/http-client-test.js index a099068d..49382d2c 100644 --- a/test/unit/clients/http-client-test.js +++ b/test/unit/clients/http-client-test.js @@ -1,11 +1,11 @@ -const {expect} = require("chai"); -const sinon = require("sinon"); -const proxyquire = require("proxyquire"); +import axios from "axios"; +import {expect} from "chai"; +import {stub, replace, restore, spy} from "sinon"; -const httpClient = require("../../../lib/clients/http-client"); -const urlUtility = require("../../../lib/utils/url-utils"); -const logger = require("../../../lib/utils/logger-utility"); -const CONSTANTS = require("../../../lib/utils/constants"); +import * as httpClient from "../../../lib/clients/http-client"; +import urlUtility, {isValidUrl} from "../../../lib/utils/url-utils"; +import logger, {getInstance} from "../../../lib/utils/logger-utility"; +import {HTTP_REQUEST} from "../../../lib/utils/constants"; describe("Clients test - cli http request client", () => { const VALID_OPTIONS = {url: "https://test.com"}; @@ -15,6 +15,50 @@ describe("Clients test - cli http request client", () => { const VALID_OPERATION = "valid-operation"; const TEST_UPLOAD_URL = "https://upload.url.com"; const TEST_PAYLOAD = "payload"; + const TEST_REQUEST_BODY = {token: "someToken"}; + const TEST_FAKE_REQUEST_ID = "FOO REQUEST #5"; + const TEST_FAKE_RESPONSE_HEADERS = {"x-amzn-requestid": TEST_FAKE_REQUEST_ID}; + const TEST_FAKE_REQUEST_HEADERS = {"H-key": "H-value"}; + const TEST_DEFAULT_AXIOS_RESPONSE = { + status: 200, + statusText: "status message", + headers: TEST_FAKE_RESPONSE_HEADERS, + data: TEST_REQUEST_BODY, + config: { + method: "FAKE", + url: VALID_OPTIONS.url, + headers: TEST_FAKE_REQUEST_HEADERS, + data:TEST_REQUEST_BODY + } + }; + let stubRequest; + let axiosPromiseResponse; + let debugStub; + let errorStub; + let warnStub; + let infoStub; + + beforeEach(() => { + axiosPromiseResponse = stub(); + stubRequest = replace(axios, "request", axiosPromiseResponse); + axiosPromiseResponse.resolves(TEST_DEFAULT_AXIOS_RESPONSE); + + stub(logger, "getInstance"); + debugStub = stub(); + errorStub = stub(); + warnStub = stub(); + infoStub = stub(); + getInstance.returns({ + info: infoStub, + warn: warnStub, + error: errorStub, + debug: debugStub, + }); + }); + + afterEach(() => { + restore(); + }); describe("# input parameter validation", () => { it("| input operation is not a string, expect fatal error", (done) => { @@ -37,27 +81,30 @@ describe("Clients test - cli http request client", () => { it("| input operation url is not a valid url, expect fatal error", (done) => { // setup - sinon.stub(urlUtility, "isValidUrl"); - urlUtility.isValidUrl.withArgs(INVALID_URL_OPTIONS).returns(false); + stub(urlUtility, "isValidUrl"); + isValidUrl.withArgs(INVALID_URL_OPTIONS).returns(false); // call httpClient.request(INVALID_URL_OPTIONS, VALID_OPERATION, false, (err) => { + isValidUrl.restore(); + // verify expect(err).equal(`[Fatal]: Invalid URL:${INVALID_URL_OPTIONS.url}. CLI request must call with valid url.`); - urlUtility.isValidUrl.restore(); done(); }); }); }); describe("# embedding user-agent", () => { - let stubRequest; - let proxyhttpClient; let initialDownstreamClient; before(() => { - initialDownstreamClient = process.env.ASK_DOWNSTREAM_CLIENT; - stubRequest = sinon.stub(); - proxyhttpClient = proxyquire("../../../lib/clients/http-client", {request: stubRequest}); + if (process.env.ASK_DOWNSTREAM_CLIENT) { + initialDownstreamClient = process.env.ASK_DOWNSTREAM_CLIENT; + } + }); + + afterEach(() => { + initialDownstreamClient ? (process.env.ASK_DOWNSTREAM_CLIENT = initialDownstreamClient) : delete process.env.ASK_DOWNSTREAM_CLIENT; }); it("| no downstream client, expect CLI user agent", (done) => { @@ -67,9 +114,8 @@ describe("Clients test - cli http request client", () => { headers: {}, }; process.env.ASK_DOWNSTREAM_CLIENT = ""; - stubRequest.callsFake(() => {}); // call - proxyhttpClient.request(VALID_OPTION_WITH_HEADERS, VALID_OPERATION, true, () => {}); + httpClient.request(VALID_OPTION_WITH_HEADERS, VALID_OPERATION, true, () => {}); // verify expect(stubRequest.args[0][0]).to.have.property("headers"); expect(stubRequest.args[0][0].headers).to.have.property("User-Agent"); @@ -81,83 +127,81 @@ describe("Clients test - cli http request client", () => { // setup const TEST_DOWNSTREAM = "test_downstream"; process.env.ASK_DOWNSTREAM_CLIENT = TEST_DOWNSTREAM; - stubRequest.callsFake(() => {}); // call - proxyhttpClient.request(VALID_OPTIONS, VALID_OPERATION, false, () => {}); + httpClient.request(VALID_OPTIONS, VALID_OPERATION, false, () => {}); // verfiy expect(stubRequest.args[0][0]).to.have.property("headers"); expect(stubRequest.args[0][0].headers).to.have.property("User-Agent"); expect(stubRequest.args[0][0].headers["User-Agent"].startsWith(TEST_DOWNSTREAM)).equal(true); done(); }); - - afterEach(() => { - stubRequest.reset(); - }); - - after(() => { - process.env.ASK_DOWNSTREAM_CLIENT = initialDownstreamClient; - }); }); describe("# embedding proxyUrl", () => { - let stubRequest; - let proxyhttpClient; let initialProxyUrl; - beforeEach(() => { - initialProxyUrl = process.env.ASK_CLI_PROXY; - stubRequest = sinon.stub(); - proxyhttpClient = proxyquire("../../../lib/clients/http-client", {request: stubRequest}); + before(() => { + if (process.env.ASK_CLI_PROXY) { + initialProxyUrl = process.env.ASK_CLI_PROXY; + } + }); + + afterEach(() => { + initialProxyUrl ? (process.env.ASK_CLI_PROXY = initialProxyUrl) : delete process.env.ASK_CLI_PROXY; }); it("| proxyUrl is added to request options", (done) => { // setup - process.env.ASK_CLI_PROXY = "proxyUrl"; - stubRequest.callsFake(() => {}); + process.env.ASK_CLI_PROXY = "ftp://u:p@proxy.url:5678"; // call - proxyhttpClient.request(VALID_OPTIONS, VALID_OPERATION, true, () => {}); + httpClient.request(VALID_OPTIONS, VALID_OPERATION, true, () => {}); + // verfiy expect(stubRequest.args[0][0]).to.have.property("proxy"); - expect(stubRequest.args[0][0].proxy).equal("proxyUrl"); + expect(stubRequest.args[0][0].proxy.protocol).equal("ftp"); + expect(stubRequest.args[0][0].proxy.host).equal("proxy.url"); + expect(stubRequest.args[0][0].proxy.port).equal("5678"); + expect(stubRequest.args[0][0].proxy).to.have.property("auth"); + expect(stubRequest.args[0][0].proxy.auth.username).equal("u"); + expect(stubRequest.args[0][0].proxy.auth.password).equal("p"); + done(); - // reset }); - afterEach(() => { - stubRequest.reset(); - process.env.ASK_DOWNSTREAM_CLIENT = initialProxyUrl; + it("| proxyUrl is added to request options", (done) => { + // setup + const invalidProxyUrl = "This should fail the url Validity check"; + process.env.ASK_CLI_PROXY = invalidProxyUrl; + // call + httpClient.request(VALID_OPTIONS, VALID_OPERATION, true, (err, response) => { + // verify + expect(err).equal(`[Fatal]: Invalid Proxy setting URL: ${invalidProxyUrl}. Reset ASK_CLI_PROXY env variable with a valid proxy url.`); + expect(response).equal(undefined); + done(); + }); }); }); describe("# call request correctly", () => { - let stubRequest; - let proxyhttpClient; - - before(() => { - stubRequest = sinon.stub(); - proxyhttpClient = proxyquire("../../../lib/clients/http-client", {request: stubRequest}); - }); - it("| request error occurs, expect error message", (done) => { // setup - stubRequest.callsArgWith(1, "error", null); + axiosPromiseResponse.rejects("error"); // call - proxyhttpClient.request(VALID_OPTIONS, VALID_OPERATION, false, (err, response) => { + httpClient.request(VALID_OPTIONS, VALID_OPERATION, false, (err, response) => { // verify - expect(err).equal(`Failed to make request to ${VALID_OPERATION}.\nError response: error`); - expect(response).equal(undefined); + expect(err.errorMessage).equal(`The request to ${VALID_OPTIONS.url} failed. Client Error: error`); + expect(response).deep.equal({}); done(); }); }); it("| request with no error and no response, expect error", (done) => { // setup - stubRequest.callsArgWith(1, null, null); + axiosPromiseResponse.resolves(null); // call - proxyhttpClient.request(VALID_OPTIONS, VALID_OPERATION, false, (err, response) => { + httpClient.request(VALID_OPTIONS, VALID_OPERATION, false, (err, response) => { // verify - expect(err).equal(`Failed to make request to ${VALID_OPERATION}.\nPlease make sure "${VALID_OPTIONS.url}" is responding.`); + expect(err.errorMessage).equal(`The request to ${VALID_OPERATION}, failed.\nPlease make sure "${VALID_OPTIONS.url}" is responding.`); expect(response).equal(undefined); done(); }); @@ -165,11 +209,11 @@ describe("Clients test - cli http request client", () => { it("| request with no error and no response statusCode, expect error", (done) => { // setup - stubRequest.callsArgWith(1, null, {body: "response"}); + axiosPromiseResponse.resolves({data: "response"}); // call - proxyhttpClient.request(VALID_OPTIONS, VALID_OPERATION, false, (err, response) => { + httpClient.request(VALID_OPTIONS, VALID_OPERATION, false, (err, response) => { // verify - expect(err).equal(`Failed to access the statusCode from the request to ${VALID_OPERATION}.`); + expect(err.errorMessage).equal(`Failed to access the statusCode from the request to ${VALID_OPERATION}.`); expect(response).equal(undefined); done(); }); @@ -177,9 +221,9 @@ describe("Clients test - cli http request client", () => { it("| request with success, expect no error and response", (done) => { // setup - stubRequest.callsArgWith(1, null, {statusCode: 200}); + axiosPromiseResponse.resolves({status: 200}); // call - proxyhttpClient.request(VALID_OPTIONS, VALID_OPERATION, false, (err, response) => { + httpClient.request(VALID_OPTIONS, VALID_OPERATION, false, (err, response) => { // verify expect(err).equal(null); expect(response).deep.equal({statusCode: 200}); @@ -191,82 +235,71 @@ describe("Clients test - cli http request client", () => { // setup const fakeResponse = { request: { - method: "method", - href: "href", - headers: "request headers", - body: "body", + method: TEST_DEFAULT_AXIOS_RESPONSE.config.method, + href: TEST_DEFAULT_AXIOS_RESPONSE.config.url, + headers: TEST_FAKE_REQUEST_HEADERS, + data: TEST_DEFAULT_AXIOS_RESPONSE.config.data, }, - headers: "response headers", - statusCode: "status code", - statusMessage: "status message", - body: "body", + headers: TEST_FAKE_RESPONSE_HEADERS, + status: 200, + statusText: "status message", + data: "body", + config: TEST_DEFAULT_AXIOS_RESPONSE.config }; - stubRequest.callsArgWith(1, null, fakeResponse); - sinon.stub(logger, "getInstance"); - const debugStub = sinon.spy(); - logger.getInstance.returns({ - debug: debugStub, - }); + axiosPromiseResponse.resolves(fakeResponse); // call - proxyhttpClient.request(VALID_OPTIONS, VALID_OPERATION, true, () => { + httpClient.request(VALID_OPTIONS, VALID_OPERATION, true, () => { // verify const expectedDebugContent = { activity: VALID_OPERATION, error: null, - "request-id": null, + "request-id": TEST_FAKE_REQUEST_ID, request: { - method: "method", - url: "href", - headers: "request headers", - body: "body", + method: fakeResponse.request.method, + url: fakeResponse.request.href, + headers: TEST_FAKE_REQUEST_HEADERS, + body: TEST_DEFAULT_AXIOS_RESPONSE.config.data, }, response: { - statusCode: "status code", - statusMessage: "status message", - headers: "response headers", + statusCode: 200, + statusMessage: fakeResponse.statusText, + headers: fakeResponse.headers, }, - body: "body", + body: fakeResponse.data, }; - expect(logger.getInstance.called).equal(true); + expect(getInstance.called).equal(true); expect(debugStub.args[0][0]).deep.equal(expectedDebugContent); - logger.getInstance.restore(); + getInstance.restore(); done(); }); }); }); describe("# verify upload method", () => { - const stubRequest = sinon.stub(); - const proxyhttpClient = proxyquire("../../../lib/clients/http-client", {request: stubRequest}); - - afterEach(() => { - sinon.restore(); - }); - it("| upload but meet error, expect error callback", (done) => { // setup - stubRequest.callsArgWith(1, "uploadErr"); + axiosPromiseResponse.rejects("uploadErr"); // test - proxyhttpClient.putByUrl(TEST_UPLOAD_URL, TEST_PAYLOAD, VALID_OPERATION, false, (err, res) => { + httpClient.putByUrl(TEST_UPLOAD_URL, TEST_PAYLOAD, VALID_OPERATION, false, (err, res) => { // verify expect(stubRequest.args[0][0].url).equal(TEST_UPLOAD_URL); - expect(stubRequest.args[0][0].method).equal(CONSTANTS.HTTP_REQUEST.VERB.PUT); - expect(stubRequest.args[0][0].body).equal(TEST_PAYLOAD); - expect(res).equal(undefined); - expect(err).equal(`Failed to make request to ${VALID_OPERATION}.\nError response: uploadErr`); + expect(stubRequest.args[0][0].method).equal(HTTP_REQUEST.VERB.PUT); + expect(stubRequest.args[0][0].data).equal(TEST_PAYLOAD); + expect(res).deep.equal({}); + expect(err.errorMessage).equal(`The request to ${TEST_UPLOAD_URL} failed. Client Error: uploadErr`); done(); }); }); it("| upload successfully", (done) => { // setup - stubRequest.callsArgWith(1, null, {statusCode: 202}); + axiosPromiseResponse.resolves({status: 202}); // test - proxyhttpClient.putByUrl(TEST_UPLOAD_URL, TEST_PAYLOAD, VALID_OPERATION, false, (err, res) => { + httpClient.putByUrl(TEST_UPLOAD_URL, TEST_PAYLOAD, VALID_OPERATION, false, (err, res) => { // verify expect(stubRequest.args[0][0].url).equal(TEST_UPLOAD_URL); - expect(stubRequest.args[0][0].method).equal(CONSTANTS.HTTP_REQUEST.VERB.PUT); - expect(stubRequest.args[0][0].body).equal(TEST_PAYLOAD); + expect(stubRequest.args[0][0].method).equal(HTTP_REQUEST.VERB.PUT); + expect(stubRequest.args[0][0].data).equal(TEST_PAYLOAD); expect(err).equal(null); expect(res).deep.equal({statusCode: 202}); done(); diff --git a/test/unit/clients/lwa-auth-code-client-test.js b/test/unit/clients/lwa-auth-code-client-test.js index 74233d16..07c268f6 100644 --- a/test/unit/clients/lwa-auth-code-client-test.js +++ b/test/unit/clients/lwa-auth-code-client-test.js @@ -194,6 +194,7 @@ describe("# Clients test - LWA OAuth2 client test", () => { lwaClient.refreshToken(VALID_ACCESS_TOKEN, (err, res) => { const expectedOptions = { url: `${new URL(tokenPath, tokenHost)}`, + headers: {"content-type": "application/json"}, method: POST_REQUEST_METHOD, body: { grant_type: REFRESH_TOKEN_GRANT_TYPE, diff --git a/test/unit/clients/smapi-client-test/index.test.ts b/test/unit/clients/smapi-client-test/index.test.ts index ca4602df..471e913a 100644 --- a/test/unit/clients/smapi-client-test/index.test.ts +++ b/test/unit/clients/smapi-client-test/index.test.ts @@ -2,7 +2,7 @@ import {expect} from "chai"; import sinon from "sinon"; import {SmapiClientLateBound} from "../../../../lib/clients/smapi-client"; -import httpClient from "../../../../lib/clients/http-client"; +import * as httpClient from "../../../../lib/clients/http-client"; import AuthorizationController from "../../../../lib/controllers/authorization-controller"; import CONSTANTS from "../../../../lib/utils/constants"; @@ -208,7 +208,7 @@ describe("Clients test - smapi client test", () => { it("| input request options and the SMAPI returns error status code but without response object", (done) => { // setup tokenReadStub.callsArgWith(1, null, TEST_ACCESS_TOKEN.access_token); - httpRequestStub.callsArgWith(3, null, TEST_REQUEST_RESPONSE_ERROR_STATUS_CODE_WITHOUT_BODY); + httpRequestStub.callsArgWith(3, TEST_REQUEST_RESPONSE_ERROR_STATUS_CODE_WITHOUT_BODY, null); // call smapiClient._smapiRequest( { diff --git a/test/unit/clients/smapi-client-test/index.ts b/test/unit/clients/smapi-client-test/index.ts deleted file mode 100644 index d4116ac0..00000000 --- a/test/unit/clients/smapi-client-test/index.ts +++ /dev/null @@ -1,262 +0,0 @@ -import {expect} from "chai"; -import sinon from "sinon"; - -import {SmapiClientLateBound} from "../../../../lib/clients/smapi-client"; -import httpClient from "../../../../lib/clients/http-client"; -import AuthorizationController from "../../../../lib/controllers/authorization-controller"; -import CONSTANTS from "../../../../lib/utils/constants"; - -import triggerAccountLinking from "./resources/account-linking"; -import triggerCatalog from "./resources/catalog"; -import triggerHistory from "./resources/history"; -import triggerIsp from "./resources/isp"; -import triggerManifest from "./resources/manifest"; -import triggerInteractionModel from "./resources/interaction-model"; -import triggerPrivateSkill from "./resources/private-skill"; -import triggerSkillPackage from "./resources/skill-package"; -import triggerSkill from "./resources/skill"; -import triggerTest from "./resources/test"; -import triggerVendor from "./resources/vendor"; -import triggerTask from "./resources/task"; -import triggerEvaluations from "./resources/evaluations"; -import triggerAlexaHosted from "./resources/alexa-hosted"; -import triggerBetaTestTests from "./resources/beta-test"; -import triggerPublishingTests from "./resources/publishing"; - -describe("Clients test - smapi client test", () => { - const TEST_PROFILE = "testProfile"; - const TEST_DO_DEBUG = false; - const TEST_ACCESS_TOKEN = { - access_token: "access_token", - refresh_token: "refresh_token", - token_type: "bearer", - expires_in: 3600, - expires_at: "expires_at", - }; - const smapiClient = new SmapiClientLateBound(); - const smapiClientBound = smapiClient.withConfiguration({ - profile: TEST_PROFILE, - doDebug: TEST_DO_DEBUG, - }); - const TEST_REQUEST_RESPONSE = { - statusCode: 100, - body: '{"test":"BODY"}', - headers: {}, - }; - const TEST_REQUEST_RESPONSE_NOT_PARSABLE = { - statusCode: 100, - body: '{"test","BODY"}', - headers: {}, - }; - const TEST_REQUEST_RESPONSE_ERROR_STATUS_CODE_WITHOUT_BODY = { - statusCode: 401, - headers: {}, - }; - - describe("# smapi client request handler", () => { - const TEST_API_NAME = "apiName"; - const TEST_URL_PATH = "urlPath"; - const TEST_VERSION = "version"; - const TEST_METHOD = "method"; - const TEST_ERROR = "error"; - - let tokenReadStub: sinon.SinonStub; - let httpRequestStub: sinon.SinonStub; - - beforeEach(() => { - sinon.restore(); - tokenReadStub = sinon.stub(AuthorizationController.prototype, "tokenRefreshAndRead"); - httpRequestStub = sinon.stub(httpClient, "request"); - }); - - it("| input request options correctly to _smapiRequest", (done) => { - // setup - tokenReadStub.callsArgWith(1, null, TEST_ACCESS_TOKEN.access_token); - httpRequestStub.callsArgWith(3, null, TEST_REQUEST_RESPONSE); - // call - smapiClient._smapiRequest( - { - profile: TEST_PROFILE, - doDebug: TEST_DO_DEBUG, - }, - TEST_API_NAME, - TEST_METHOD, - TEST_VERSION, - TEST_URL_PATH, - {}, - {}, - null, - (err, res) => { - // verify - const expectedOptions = { - url: `${CONSTANTS.SMAPI.ENDPOINT}/${TEST_VERSION}/${TEST_URL_PATH}`, - method: TEST_METHOD, - headers: {authorization: "access_token"}, - body: null, - json: false, - }; - - expect(tokenReadStub.args[0][0]).equal(TEST_PROFILE); - expect(httpRequestStub.args[0][0]).deep.equal(expectedOptions); - expect(httpRequestStub.args[0][1]).equal(TEST_API_NAME); - expect(httpRequestStub.args[0][2]).equal(false); - expect(err).equal(null); - expect(res).deep.equal({ - statusCode: 100, - body: {test: "BODY"}, - headers: {}, - }); - done(); - }, - ); - }); - - it("| input request options without headers input to _smapiRequest", (done) => { - // setup - tokenReadStub.callsArgWith(1, null, TEST_ACCESS_TOKEN.access_token); - httpRequestStub.callsArgWith(3, null, TEST_REQUEST_RESPONSE); - // call - smapiClient._smapiRequest( - { - profile: TEST_PROFILE, - doDebug: TEST_DO_DEBUG, - }, - TEST_API_NAME, - TEST_METHOD, - TEST_VERSION, - TEST_URL_PATH, - {}, - null, - null, - (err, res) => { - // verify - const expectedOptions = { - url: `${CONSTANTS.SMAPI.ENDPOINT}/${TEST_VERSION}/${TEST_URL_PATH}`, - method: TEST_METHOD, - headers: {authorization: "access_token"}, - body: null, - json: false, - }; - expect(tokenReadStub.args[0][0]).deep.equal(TEST_PROFILE); - expect(httpRequestStub.args[0][0]).deep.equal(expectedOptions); - expect(httpRequestStub.args[0][1]).equal(TEST_API_NAME); - expect(httpRequestStub.args[0][2]).equal(false); - expect(err).equal(null); - expect(res).deep.equal({ - statusCode: 100, - body: {test: "BODY"}, - headers: {}, - }); - done(); - }, - ); - }); - - it("| input request options but http request fails", (done) => { - // setup - tokenReadStub.callsArgWith(1, null, TEST_ACCESS_TOKEN.access_token); - httpRequestStub.callsArgWith(3, TEST_ERROR); - // call - smapiClient._smapiRequest( - { - profile: TEST_PROFILE, - doDebug: TEST_DO_DEBUG, - }, - TEST_API_NAME, - TEST_METHOD, - TEST_VERSION, - TEST_URL_PATH, - {}, - {}, - null, - (err, res) => { - // verify - expect(err).equal(TEST_ERROR); - expect(res).equal(undefined); - done(); - }, - ); - }); - - it("| input request options but the response is not parsable", (done) => { - // setup - tokenReadStub.callsArgWith(1, null, TEST_ACCESS_TOKEN.access_token); - httpRequestStub.callsArgWith(3, null, TEST_REQUEST_RESPONSE_NOT_PARSABLE); - // call - smapiClient._smapiRequest( - { - profile: TEST_PROFILE, - doDebug: TEST_DO_DEBUG, - }, - TEST_API_NAME, - TEST_METHOD, - TEST_VERSION, - TEST_URL_PATH, - {}, - {}, - null, - (err, res) => { - // verify - console.log("hi4"); - const errMsg = "[Fatal]: Failed to parse SMAPI's response. Please run again with --debug to check more details.\nError:"; - expect(err.startsWith(errMsg)).equal(true); - expect(res).equal(null); - console.log("hi5"); - done(); - }, - ); - }); - - it("| input request options and the SMAPI returns error status code but without response object", (done) => { - // setup - tokenReadStub.callsArgWith(1, null, TEST_ACCESS_TOKEN.access_token); - httpRequestStub.callsArgWith(3, null, TEST_REQUEST_RESPONSE_ERROR_STATUS_CODE_WITHOUT_BODY); - // call - smapiClient._smapiRequest( - { - profile: TEST_PROFILE, - doDebug: TEST_DO_DEBUG, - }, - TEST_API_NAME, - TEST_METHOD, - TEST_VERSION, - TEST_URL_PATH, - {}, - {}, - null, - (err, res) => { - // verify - const errMsg = `[Fatal]: SMAPI error code ${TEST_REQUEST_RESPONSE_ERROR_STATUS_CODE_WITHOUT_BODY.statusCode}. \ -No response body from the service request.`; - expect(err).equal(errMsg); - expect(res).equal(null); - done(); - }, - ); - }); - }); - - describe("# smapi client skill APIs", () => { - triggerSkill(smapiClientBound); - triggerManifest(smapiClientBound); - triggerInteractionModel(smapiClientBound); - triggerAccountLinking(smapiClientBound); - triggerTest(smapiClientBound); - triggerPrivateSkill(smapiClientBound); - triggerHistory(smapiClientBound); - triggerEvaluations(smapiClientBound); - triggerAlexaHosted(smapiClientBound); - triggerBetaTestTests(smapiClientBound); - triggerPublishingTests(smapiClientBound); - }); - - triggerSkillPackage(smapiClientBound); - - triggerIsp(smapiClientBound); - - triggerVendor(smapiClientBound); - - triggerCatalog(smapiClientBound); - - triggerTask(smapiClientBound); -}); diff --git a/test/unit/clients/smapi-client-test/smapiApiClient-test.ts b/test/unit/clients/smapi-client-test/smapiApiClient-test.ts new file mode 100644 index 00000000..db4720b4 --- /dev/null +++ b/test/unit/clients/smapi-client-test/smapiApiClient-test.ts @@ -0,0 +1,96 @@ +import {expect} from "chai"; +import sinon, { SinonStub } from "sinon"; +import * as httpClient from "../../../../lib/clients/http-client"; +import { SmapiApiClient } from "../../../../lib/clients/smapi-client/smapiApiClient"; + +describe("SmapiApiClient invoke", () => { + let httpClientStub: SinonStub; + let smapiApiClientInstance: SmapiApiClient; + + const TEST_PROFILE = "testProfile"; + const TEST_DO_DEBUG = false; + const HTTP_CLIENT_RESPONSE_BODY_CONTENT = { + test: 'content', + } + const HTTP_CLIENT_RESPONSE_200 = { + statusCode: 200, + body: HTTP_CLIENT_RESPONSE_BODY_CONTENT, + headers: [] + }; + const TEST_FULL_RESPONSE = false; + const FAKE_URL = "FakeUrl"; + const TEST_ERROR = "TEST: error"; + const HEADER_CONTENT_TYPE_KEY = "content-type"; + const HEADER_CONTENT_TYPE_VALUE = "application/x-www-form-urlencoded"; + const HEADER_CONTENT_TYPE_JSON_VALUE = "application/json"; + const HEADER_2_KEY = "header2"; + const HEADER_2_VALUE = "value2"; + const API_CLIENT_REQUEST = { + body: '&this=is&Test=Content', + method: "GET", + headers: [ + { + key: HEADER_CONTENT_TYPE_KEY, + value: HEADER_CONTENT_TYPE_VALUE, + }, + { + key: HEADER_2_KEY, + value: HEADER_2_VALUE, + }, + ], + url: FAKE_URL, + } + + beforeEach(() => { + httpClientStub = sinon.stub(httpClient, "request").yields(null, HTTP_CLIENT_RESPONSE_200); + //httpClientStub.callsArgWith(3, null, HTTP_CLIENT_RESPONSE_200); + smapiApiClientInstance = new SmapiApiClient(TEST_DO_DEBUG, TEST_PROFILE, TEST_FULL_RESPONSE); + }); + + afterEach(() => { + sinon.restore(); + }); + + it("should return a valid response", (done) => { + const expectedHeaders: any = {}; + expectedHeaders[HEADER_CONTENT_TYPE_KEY]= HEADER_CONTENT_TYPE_JSON_VALUE; + expectedHeaders[HEADER_2_KEY]= HEADER_2_VALUE; + + smapiApiClientInstance.invoke(API_CLIENT_REQUEST).then(smapiApiClientResponse => { + expect(smapiApiClientResponse).to.not.be.null; + expect(smapiApiClientResponse.statusCode).to.equal(HTTP_CLIENT_RESPONSE_200.statusCode); + expect(smapiApiClientResponse.body).to.not.be.null; + expect(smapiApiClientResponse.body).to.deep.equal(JSON.stringify(HTTP_CLIENT_RESPONSE_BODY_CONTENT)); + expect(smapiApiClientResponse.headers).to.not.be.null; + expect(smapiApiClientResponse.headers).to.equal(HTTP_CLIENT_RESPONSE_200.headers); + expect(httpClientStub.calledOnce).to.be.true; + expect(httpClientStub.args[0][0]).to.deep.equal({ + url: API_CLIENT_REQUEST.url, + method: API_CLIENT_REQUEST.method, + headers: expectedHeaders, + body: { + this: 'is', + Test: 'Content' + }, + }); + expect(httpClientStub.args[0][1]).to.equal("SMAPI_API_CLIENT"); + expect(httpClientStub.args[0][2]).to.be.false; + + done(); + }).catch((err) =>{ + console.log(err); + }); + }); + + it("should reject the promise if httpClient request returns an error", (done) => { + httpClientStub.reset(); + httpClientStub.callsArgWith(3, TEST_ERROR); + smapiApiClientInstance.invoke(API_CLIENT_REQUEST).then(smapiApiClientResponse => { + console.log(smapiApiClientResponse); + }).catch((error) => { + expect(error).to.not.be.null; + expect(error.message).to.equal(TEST_ERROR); + done(); + }) + }) +}); \ No newline at end of file diff --git a/test/unit/commands/abstract-command-test.ts b/test/unit/commands/abstract-command-test.ts index 4815e066..f76fa246 100644 --- a/test/unit/commands/abstract-command-test.ts +++ b/test/unit/commands/abstract-command-test.ts @@ -1,7 +1,7 @@ import {expect} from "chai"; import sinon from "sinon"; import path from "path"; -import httpClient from "../../../lib/clients/http-client"; +import * as httpClient from "../../../lib/clients/http-client"; import {AbstractCommand} from "../../../lib/commands/abstract-command"; import AppConfig from "../../../lib/model/app-config"; import CONSTANTS from "../../../lib/utils/constants"; @@ -18,7 +18,7 @@ describe("Command test - AbstractCommand class", () => { const TEST_PROFILE = "profile"; const TEST_NPM_REGISTRY_DATA = (inputVersion: string) => { const result = { - body: JSON.stringify({version: inputVersion}), + body: {version: inputVersion}, }; return result; }; @@ -331,7 +331,7 @@ describe("Command test - AbstractCommand class", () => { it("| http client request error status code , should warn it out and pass the process", async () => { // setup - httpClientStub.yields(undefined, {statusCode: 400}); + httpClientStub.callsArgWith(3, {statusCode: 400}); // call await AbstractCommand.prototype._remindsIfNewVersion(TEST_DO_DEBUG_FALSE, undefined); // verify diff --git a/test/unit/commands/configure/aws-profile-setup-helper-test.js b/test/unit/commands/configure/aws-profile-setup-helper-test.js index cd0a4ad7..6df24dc4 100644 --- a/test/unit/commands/configure/aws-profile-setup-helper-test.js +++ b/test/unit/commands/configure/aws-profile-setup-helper-test.js @@ -213,6 +213,7 @@ describe("Command: Configure - AWS profile setup helper test", () => { sinon.stub(ui, "addNewCredentials").callsArgWith(0, null, TEST_CREDENTIALS); sinon.stub(awsProfileHandler, "addProfile"); sinon.stub(profileHelper, "setupProfile"); + sinon.useFakeTimers().tickAsync(CONSTANTS.CONFIGURATION.OPEN_BROWSER_DELAY); // call proxyHelper.setupAwsProfile({askProfile: TEST_PROFILE, needBrowser: true}, (err, awsProfile) => { diff --git a/test/unit/commands/deploy/helper-test.js b/test/unit/commands/deploy/helper-test.js index 25b3f0fb..48bb5a14 100644 --- a/test/unit/commands/deploy/helper-test.js +++ b/test/unit/commands/deploy/helper-test.js @@ -1,5 +1,6 @@ const {expect} = require("chai"); const sinon = require("sinon"); +const path = require("path"); const helper = require("../../../../lib/commands/deploy/helper"); const SkillMetadataController = require("../../../../lib/controllers/skill-metadata-controller"); @@ -13,6 +14,15 @@ const Messenger = require("../../../../lib/view/messenger"); const SpinnerView = require("../../../../lib/view/spinner-view"); describe("Commands deploy test - helper test", () => { + const FIXTURE_RESOURCES_CONFIG_FILE_PATH = path.join( + process.cwd(), + "test", + "unit", + "fixture", + "model", + "regular-proj", + "ask-resources.json", + ); const TEST_PROFILE = "default"; const TEST_IGNORE_HASH = false; const TEST_VENDOR_ID = "vendor"; @@ -20,7 +30,12 @@ describe("Commands deploy test - helper test", () => { const TEST_OPTIONS = {profile: TEST_PROFILE, doDebug: TEST_DO_DEBUG, ignoreHash: TEST_IGNORE_HASH}; describe("# test helper method - confirmProfile", () => { + beforeEach(() => { + new ResourcesConfig(FIXTURE_RESOURCES_CONFIG_FILE_PATH); + }); + afterEach(() => { + ResourcesConfig.dispose(); sinon.restore(); }); diff --git a/test/unit/commands/dialog/index.spec.ts b/test/unit/commands/dialog/index.spec.ts index b38091e5..bd6f32c3 100644 --- a/test/unit/commands/dialog/index.spec.ts +++ b/test/unit/commands/dialog/index.spec.ts @@ -6,10 +6,9 @@ import AuthorizationController from "../../../../lib/controllers/authorization-c import {DialogCommand} from "../../../../lib/commands/dialog"; import DialogReplayFile from "../../../../lib/model/dialog-replay-file"; import * as helper from "../../../../lib/commands/dialog/helper"; -import httpClient from "../../../../lib/clients/http-client"; +import * as httpClient from "../../../../lib/clients/http-client"; import {InteractiveMode} from "../../../../lib/commands/dialog/interactive-mode"; import ResourcesConfig from "../../../../lib/model/resources-config"; -import jsonView from "../../../../lib/view/json-view"; import CONSTANTS from "../../../../lib/utils/constants"; import profileHelper from "../../../../lib/utils/profile-helper"; import stringUtils from "../../../../lib/utils/string-utils"; @@ -36,9 +35,11 @@ describe("Commands Dialog test - command class test", () => { let errorStub: sinon.SinonStub; let infoStub: sinon.SinonStub; + let httpClientStub: sinon.SinonStub; beforeEach(() => { errorStub = sinon.stub(); infoStub = sinon.stub(); + httpClientStub = sinon.stub(httpClient, "request"); sinon.stub(Messenger, "getInstance").returns({ error: errorStub, info: infoStub, @@ -151,7 +152,7 @@ describe("Commands Dialog test - command class test", () => { replay: INVALID_DIALOG_REPLAY_FILE_JSON_PATH, }; sinon.stub(profileHelper, "runtimeProfile").returns(TEST_PROFILE); - sinon.stub(httpClient, "request").yields(null, {statusCode: 200, body: {manifest}}); + httpClientStub.yields(null, {statusCode: 200, body: {manifest}}); // call await expect(instance._getDialogConfig(TEST_CMD_WITH_VALUES)).rejectedWith("Replay file must contain skillId"); }); @@ -165,7 +166,7 @@ describe("Commands Dialog test - command class test", () => { const validateDialogArgsStub = sinon.stub(helper, "validateDialogArgs").resolves(); sinon.stub(profileHelper, "runtimeProfile").returns(TEST_PROFILE); sinon.stub(InteractiveMode.prototype, "start").resolves(); - sinon.stub(httpClient, "request").yields(null, {statusCode: 200, body: {manifest}}); + httpClientStub.yields(null, {statusCode: 200, body: {manifest}}); // call await instance.handle(TEST_CMD_WITH_VALUES); expect(validateDialogArgsStub).calledOnceWith(sinon.match({ @@ -181,7 +182,7 @@ describe("Commands Dialog test - command class test", () => { replay: INVALID_DIALOG_REPLAY_FILE_JSON_PATH, }; sinon.stub(profileHelper, "runtimeProfile").returns(TEST_PROFILE); - sinon.stub(httpClient, "request").yields(null, {statusCode: 200, body: {manifest}}); + httpClientStub.yields(null, {statusCode: 200, body: {manifest}}); const stringUtilsStub = sinon.stub(stringUtils, "isNonBlankString"); stringUtilsStub.onCall(0).returns(true); stringUtilsStub.onCall(1).returns(false); @@ -196,7 +197,7 @@ describe("Commands Dialog test - command class test", () => { replay: INVALID_DIALOG_REPLAY_FILE_JSON_PATH, }; sinon.stub(profileHelper, "runtimeProfile").returns(TEST_PROFILE); - sinon.stub(httpClient, "request").yields(null, {statusCode: 200, body: {manifest}}); + httpClientStub.yields(null, {statusCode: 200, body: {manifest}}); const stringUtilsStub = sinon.stub(stringUtils, "isNonBlankString"); stringUtilsStub.onCall(0).returns(true); stringUtilsStub.onCall(1).returns(true); @@ -211,7 +212,7 @@ describe("Commands Dialog test - command class test", () => { replay: DIALOG_REPLAY_FILE_JSON_PATH, }; sinon.stub(profileHelper, "runtimeProfile").returns(TEST_PROFILE); - sinon.stub(httpClient, "request").yields(null, {statusCode: 200, body: {manifest}}); + httpClientStub.yields(null, {statusCode: 200, body: {manifest}}); // call await expect(instance._getDialogConfig(TEST_CMD_WITH_VALUES)).eventually.fulfilled.deep.include({ debug: undefined, @@ -245,7 +246,7 @@ describe("Commands Dialog test - command class test", () => { }; const smapiError = "error"; sinon.stub(profileHelper, "runtimeProfile").returns(TEST_PROFILE); - sinon.stub(httpClient, "request").yields(smapiError); + httpClientStub.yields(smapiError); // call await expect(instance._getDialogConfig(TEST_CMD_WITH_VALUES)).rejectedWith(smapiError); }); @@ -257,14 +258,28 @@ describe("Commands Dialog test - command class test", () => { replay: DIALOG_REPLAY_FILE_JSON_PATH, }; const smapiError = "error"; + const mockedResponse = { + statusCode: 400, + headers: [], + body: { + message: smapiError + } + }; sinon.stub(profileHelper, "runtimeProfile").returns(TEST_PROFILE); - sinon.stub(httpClient, "request").yields(null, {statusCode: 400, body: {message: smapiError}}); + httpClientStub.yields(mockedResponse); // call - await expect(instance._getDialogConfig(TEST_CMD_WITH_VALUES)).rejectedWith(jsonView.toString({message: smapiError})); + await instance._getDialogConfig(TEST_CMD_WITH_VALUES).catch((error) => { + expect(error).to.deep.equal(mockedResponse); + }); }); }); describe("# test with default (interactive) option", () => { + + afterEach(() => { + delete process.env.ASK_DEFAULT_DEVICE_LOCALE; + }); + it("| no resources config file found", async () => { // setup const TEST_CMD_WITH_VALUES = {}; @@ -297,7 +312,7 @@ describe("Commands Dialog test - command class test", () => { // setup const TEST_CMD_WITH_VALUES = {}; sinon.stub(profileHelper, "runtimeProfile").returns(TEST_PROFILE); - sinon.stub(httpClient, "request").yields(null, {statusCode: 200, body: {manifest}}); + httpClientStub.yields(null, {statusCode: 200, body: {manifest}}); const pathJoinStub = sinon.stub(path, "join"); pathJoinStub.withArgs(process.cwd(), CONSTANTS.FILE_PATH.ASK_RESOURCES_JSON_CONFIG).returns(VALID_RESOURCES_CONFIG_JSON_PATH); pathJoinStub.withArgs("./skillPackage", CONSTANTS.FILE_PATH.SKILL_PACKAGE.MANIFEST).returns(VALID_MANIFEST_JSON_PATH); @@ -320,7 +335,7 @@ describe("Commands Dialog test - command class test", () => { const [expectedLocale] = Object.keys(manifest.publishingInformation?.locales || {}); const TEST_CMD_WITH_VALUES = {}; sinon.stub(profileHelper, "runtimeProfile").returns(TEST_PROFILE); - sinon.stub(httpClient, "request").yields(null, {statusCode: 200, body: {manifest}}); + httpClientStub.yields(null, {statusCode: 200, body: {manifest}}); const pathJoinStub = sinon.stub(path, "join"); pathJoinStub.withArgs(process.cwd(), CONSTANTS.FILE_PATH.ASK_RESOURCES_JSON_CONFIG).returns(VALID_RESOURCES_CONFIG_JSON_PATH); pathJoinStub.callThrough(); @@ -338,32 +353,16 @@ describe("Commands Dialog test - command class test", () => { expect(infoStub).calledOnceWith(`Defaulting locale to the first value from the skill manifest: ${expectedLocale}`); }); - - afterEach(() => { - sinon.restore(); - delete process.env.ASK_DEFAULT_DEVICE_LOCALE; - }); }); - afterEach(() => { - sinon.restore(); - }); }); describe("# test _validateUserInputs", () => { - let instance: DialogCommand; - - beforeEach(() => { - instance = new DialogCommand(new SmapiClientLateBound(), optionModel as OptionModel); - }); - it("| all valid inputs", () => { // setup const userInputs = [" open hello world ", "help"]; - // call - const validatedInputs = instance._validateUserInputs(userInputs); - + const validatedInputs = new DialogCommand(new SmapiClientLateBound(), optionModel as OptionModel)._validateUserInputs(userInputs); // verify expect(validatedInputs).deep.equal(["open hello world", "help"]); }); diff --git a/test/unit/commands/init/index-test.ts b/test/unit/commands/init/index-test.ts index b500222f..c6d0ddb8 100644 --- a/test/unit/commands/init/index-test.ts +++ b/test/unit/commands/init/index-test.ts @@ -4,9 +4,8 @@ import AuthorizationController from "../../../../lib/controllers/authorization-c import InitCommand from "../../../../lib/commands/init"; import helper from "../../../../lib/commands/init/helper"; import HostedSkillController from "../../../../lib/controllers/hosted-skill-controller"; -import httpClient from "../../../../lib/clients/http-client"; +import * as httpClient from "../../../../lib/clients/http-client"; import CliWarn from "../../../../lib/exceptions/cli-warn"; -import jsonView from "../../../../lib/view/json-view"; import optionModel from "../../../../lib/commands/option-model.json"; import Messenger from "../../../../lib/view/messenger"; import profileHelper from "../../../../lib/utils/profile-helper"; @@ -356,15 +355,18 @@ describe("Commands init test - command class test", () => { // setup const GET_MANIFEST_ERROR = { statusCode: 403, + headers: undefined, body: { - error: TEST_ERROR, + error: TEST_ERROR.toString(), // jsonView.toString(TEST_ERROR), }, }; - sinon.stub(httpClient, "request").callsArgWith(3, null, GET_MANIFEST_ERROR); // stub getManifest request + sinon.stub(httpClient, "request").callsArgWith(3, GET_MANIFEST_ERROR); // stub getManifest request // call - await expect(instance.handle(TEST_CMD)).rejectedWith(jsonView.toString({error: TEST_ERROR})); + await instance.handle(TEST_CMD).catch((error) => { + expect(error).to.deep.equal(GET_MANIFEST_ERROR); + }); // verify - expect(errorStub).calledOnceWith(jsonView.toString({error: TEST_ERROR})); + expect(errorStub.args[0][0]).to.deep.equal(GET_MANIFEST_ERROR); }); it("| get skill manifest succeed without locales, expect error thrown", async () => { diff --git a/test/unit/commands/new/template-helper-test.ts b/test/unit/commands/new/template-helper-test.ts index a4e80a93..c55846cf 100644 --- a/test/unit/commands/new/template-helper-test.ts +++ b/test/unit/commands/new/template-helper-test.ts @@ -1,7 +1,7 @@ import {expect, assert} from "chai"; import {beforeEach} from "mocha"; import sinon from "sinon"; -import httpClient from "../../../../lib/clients/http-client"; +import * as httpClient from "../../../../lib/clients/http-client"; import { CODE_LANGUAGE_JAVA, CODE_LANGUAGE_NODEJS, @@ -50,7 +50,7 @@ export const TEST_SAMPLE_IM_LAMBDA_JAVA: SampleTemplate = { url: "https://github.com/alexa/bar.git", desc: TEST_SAMPLE_DESCRIPTION_2, }; -const TEST_TEMPLATES = JSON.stringify({templates: [TEST_SAMPLE_1_IM_HOSTED_NODE, TEST_SAMPLE_2_AC_CFN_PYTHON]}); +const TEST_TEMPLATES = {templates: [TEST_SAMPLE_1_IM_HOSTED_NODE, TEST_SAMPLE_2_AC_CFN_PYTHON]}; describe("Commands new test - template helper test", () => { describe("getSampleTemplatesFromS3", () => { @@ -88,7 +88,7 @@ describe("Commands new test - template helper test", () => { }); it("| returns simplified error when debug is enabled and http request fails", async () => { - httpRequestStub.callsArgWith(3, null, TEST_HTTP_RESPONSE_400_ERROR); + httpRequestStub.callsArgWith(3, TEST_HTTP_RESPONSE_400_ERROR, null); doDebug = true; await getSampleTemplatesFromS3(doDebug) @@ -99,7 +99,7 @@ describe("Commands new test - template helper test", () => { }); it("| returns longer error message explaining to enable debug if debug is not enabled and http request fails", async () => { - httpRequestStub.callsArgWith(3, null, TEST_HTTP_RESPONSE_400_ERROR); + httpRequestStub.callsArgWith(3, TEST_HTTP_RESPONSE_400_ERROR, null); doDebug = false; await getSampleTemplatesFromS3(doDebug) diff --git a/test/unit/commands/option-validator-test.js b/test/unit/commands/option-validator-test.js index f8997da0..c1c1982f 100644 --- a/test/unit/commands/option-validator-test.js +++ b/test/unit/commands/option-validator-test.js @@ -111,13 +111,14 @@ describe("Command test - Option validator test", () => { const skillOptions = { optionValid: "amzn1.ask.skill.1234abcd-12ab-abcd-1234-123456789012", + optionValidLegacy: "amzn1.echo-sdk-ams.app.1234abcd-12ab-abcd-1234-123456789012", optionInvalid: "amzn1.ask.skill", }; const skillRegex = [ { type: "REGEX", - regex: "^amzn\\d\\.ask\\.skill\\.\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12}$", + regex: "^amzn\\d((\\.ask\\.skill)|(\\.echo-sdk-ams\\.app))\\.\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12}$", }, ]; @@ -130,6 +131,10 @@ describe("Command test - Option validator test", () => { optionValidator.validateOptionRules(skillOptions, "optionValid", skillRegex); }).not.throw(); + expect(() => { + optionValidator.validateOptionRules(skillOptions, "optionValidLegacy", skillRegex); + }).not.throw(); + // invalid regex expectations expect(() => { optionValidator.validateOptionRules(skillOptions, "optionInvalid", skillRegex); diff --git a/test/unit/commands/run/helper-test.js b/test/unit/commands/run/helper-test.js index d9fee2fc..1842fd9b 100644 --- a/test/unit/commands/run/helper-test.js +++ b/test/unit/commands/run/helper-test.js @@ -1,39 +1,39 @@ -const {expect} = require("chai"); -const fs = require("fs"); -const sinon = require("sinon"); -const helper = require("../../../../lib/commands/run/helper"); -const CONSTANTS = require("../../../../lib/utils/constants"); -const NodejsRunFlow = require("../../../../lib/commands/run/run-flow/nodejs-run"); -const PythonRunFlow = require("../../../../lib/commands/run/run-flow/python-run"); -const JavaRunFlow = require("../../../../lib/commands/run/run-flow/java-run"); -const ResourcesConfig = require("../../../../lib/model/resources-config"); +import { expect } from "chai"; +import fs from "fs"; +import { restore, stub } from "sinon"; +import { getHostedSkillInvocationInfo, getNonHostedSkillInvocationInfo, getNormalisedRuntime, selectRunFlowClass, getSkillCodeFolderName, getSkillFlowInstance } from "../../../../lib/commands/run/helper"; +import { RUNTIME, FILE_PATH, ALEXA, RUN } from "../../../../lib/utils/constants"; +import {NodejsRunFlow} from "../../../../lib/commands/run/run-flow/nodejs-run"; +import {PythonRunFlow} from "../../../../lib/commands/run/run-flow/python-run"; +import {JavaRunFlow} from "../../../../lib/commands/run/run-flow/java-run"; +import ResourcesConfig from "../../../../lib/model/resources-config"; describe("Commands Run - helper test", () => { describe("getHostedSkillInvocationInfo test", () => { it("| validate Node hosted skill invocation info", () => { - const hostedSkillInvocationInfo = helper.getHostedSkillInvocationInfo(CONSTANTS.RUNTIME.NODE); + const hostedSkillInvocationInfo = getHostedSkillInvocationInfo(RUNTIME.NODE); expect(hostedSkillInvocationInfo.skillCodeFolderName).eq("lambda"); expect(hostedSkillInvocationInfo.handlerName).eq("handler"); expect(hostedSkillInvocationInfo.skillFileName).eq("index"); }); it("| validate Python hosted skill invocation info", () => { - const hostedSkillInvocationInfo = helper.getHostedSkillInvocationInfo(CONSTANTS.RUNTIME.PYTHON); + const hostedSkillInvocationInfo = getHostedSkillInvocationInfo(RUNTIME.PYTHON); expect(hostedSkillInvocationInfo.skillCodeFolderName).eq("lambda"); expect(hostedSkillInvocationInfo.handlerName).eq("lambda_handler"); expect(hostedSkillInvocationInfo.skillFileName).eq("lambda_function"); }); it("| Invalid hosted skill runtime info", () => { - const hostedSkillInvocationInfo = helper.getHostedSkillInvocationInfo(CONSTANTS.RUNTIME.JAVA); + const hostedSkillInvocationInfo = getHostedSkillInvocationInfo(RUNTIME.JAVA); expect(hostedSkillInvocationInfo).eq(undefined); }); }); describe("getNonHostedSkillInvocationInfo test", () => { it("| validate Node non hosted skill invocation info", () => { - const nonHostedSkillInvocationInfo = helper.getNonHostedSkillInvocationInfo( - CONSTANTS.RUNTIME.NODE, + const nonHostedSkillInvocationInfo = getNonHostedSkillInvocationInfo( + RUNTIME.NODE, "fooFileName.fooHandler", "fooSkillCodeFolderName", ); @@ -42,8 +42,8 @@ describe("Commands Run - helper test", () => { expect(nonHostedSkillInvocationInfo.skillCodeFolderName).eq("fooSkillCodeFolderName"); }); it("| validate Python non hosted skill invocation info", () => { - const nonHostedSkillInvocationInfo = helper.getNonHostedSkillInvocationInfo( - CONSTANTS.RUNTIME.PYTHON, + const nonHostedSkillInvocationInfo = getNonHostedSkillInvocationInfo( + RUNTIME.PYTHON, "fooFileName.fooHandler", "fooSkillCodeFolderName", ); @@ -52,8 +52,8 @@ describe("Commands Run - helper test", () => { expect(nonHostedSkillInvocationInfo.skillCodeFolderName).eq("fooSkillCodeFolderName"); }); it("| validate Java non hosted skill invocation info", () => { - const nonHostedSkillInvocationInfo = helper.getNonHostedSkillInvocationInfo( - CONSTANTS.RUNTIME.JAVA, + const nonHostedSkillInvocationInfo = getNonHostedSkillInvocationInfo( + RUNTIME.JAVA, "fooHandler", "fooSkillCodeFolderName", ); @@ -61,89 +61,88 @@ describe("Commands Run - helper test", () => { expect(nonHostedSkillInvocationInfo.skillCodeFolderName).eq("fooSkillCodeFolderName"); }); it("| empty runtime", () => { - expect(() => helper.getNonHostedSkillInvocationInfo("", "", "")).to.throw( - "Missing runtime info in " + `resource file ${CONSTANTS.FILE_PATH.ASK_RESOURCES_JSON_CONFIG}.`, + expect(() => getNonHostedSkillInvocationInfo("", "", "")).to.throw( + "Missing runtime info in " + `resource file ${FILE_PATH.ASK_RESOURCES_JSON_CONFIG}.`, ); }); it("| empty handler", () => { - expect(() => helper.getNonHostedSkillInvocationInfo(CONSTANTS.RUNTIME.JAVA, "", "")).to.throw( - "Missing handler info in " + `resource file ${CONSTANTS.FILE_PATH.ASK_RESOURCES_JSON_CONFIG}.`, + expect(() => getNonHostedSkillInvocationInfo(RUNTIME.JAVA, "", "")).to.throw( + "Missing handler info in " + `resource file ${FILE_PATH.ASK_RESOURCES_JSON_CONFIG}.`, ); }); }); describe("getNormalisedRuntime test", () => { it("| normalised runtime for nodejs", () => { - expect(helper.getNormalisedRuntime("nodejs12.x")).eq(CONSTANTS.RUNTIME.NODE); + expect(getNormalisedRuntime("nodejs12.x")).eq(RUNTIME.NODE); }); it("| normalised runtime for python", () => { - expect(helper.getNormalisedRuntime("python3.8")).eq(CONSTANTS.RUNTIME.PYTHON); + expect(getNormalisedRuntime("python3.8")).eq(RUNTIME.PYTHON); }); it("| normalised runtime for java", () => { - expect(helper.getNormalisedRuntime("java11")).eq(CONSTANTS.RUNTIME.JAVA); + expect(getNormalisedRuntime("java11")).eq(RUNTIME.JAVA); }); it("| unsupported runtime", () => { - expect(() => helper.getNormalisedRuntime("foo")).to.throw("Runtime - foo is not supported"); + expect(() => getNormalisedRuntime("foo")).to.throw("Runtime - foo is not supported"); }); }); describe("selectRunFlowClass test", () => { it("| java run flow test", () => { - expect(helper.selectRunFlowClass(CONSTANTS.RUNTIME.JAVA)).eq(JavaRunFlow); + expect(selectRunFlowClass(RUNTIME.JAVA)).eq(JavaRunFlow); }); it("| python run flow test", () => { - expect(helper.selectRunFlowClass(CONSTANTS.RUNTIME.PYTHON)).eq(PythonRunFlow); + expect(selectRunFlowClass(RUNTIME.PYTHON)).eq(PythonRunFlow); }); it("| nodejs run flow test", () => { - expect(helper.selectRunFlowClass(CONSTANTS.RUNTIME.NODE)).eq(NodejsRunFlow); + expect(selectRunFlowClass(RUNTIME.NODE)).eq(NodejsRunFlow); }); it("| unsupported run flow test", () => { - expect(helper.selectRunFlowClass("foo")).eq(undefined); + expect(selectRunFlowClass("foo")).eq(undefined); }); }); describe("getSkillCodeFolderName test", () => { afterEach(() => { - sinon.restore(); + restore(); }); it("| skill code folder value exists for user provided region in resources file", () => { - sinon.stub(ResourcesConfig, "getInstance").returns({ - getCodeSrcByRegion: sinon.stub().returns("fooFolder"), + stub(ResourcesConfig, "getInstance").returns({ + getCodeSrcByRegion: stub().returns("fooFolder"), }); - sinon.stub(fs, "existsSync").returns(true); - expect(helper.getSkillCodeFolderName("foo", CONSTANTS.ALEXA.REGION.NA)).eq("fooFolder"); + stub(fs, "existsSync").returns(true); + expect(getSkillCodeFolderName("foo", ALEXA.REGION.NA)).eq("fooFolder"); }); it("| skill code folder value does not for user provided region, default exists in resources file", () => { - sinon.stub(ResourcesConfig, "getInstance").returns({ - getCodeSrcByRegion: sinon - .stub() - .withArgs("foo", CONSTANTS.ALEXA.REGION.NA) + stub(ResourcesConfig, "getInstance").returns({ + getCodeSrcByRegion: stub() + .withArgs("foo", ALEXA.REGION.NA) .returns("") - .withArgs("foo", CONSTANTS.ALEXA.REGION.DEFAULT) + .withArgs("foo", ALEXA.REGION.DEFAULT) .returns("fooFolder"), }); - sinon.stub(fs, "existsSync").returns(true); - expect(helper.getSkillCodeFolderName("foo", CONSTANTS.ALEXA.REGION.NA)).eq("fooFolder"); + stub(fs, "existsSync").returns(true); + expect(getSkillCodeFolderName("foo", ALEXA.REGION.NA)).eq("fooFolder"); }); it("| skill code folder value does not exist for user provided region or default in resources file", () => { - sinon.stub(ResourcesConfig, "getInstance").returns({ - getCodeSrcByRegion: sinon.stub().returns(""), + stub(ResourcesConfig, "getInstance").returns({ + getCodeSrcByRegion: stub().returns(""), }); - sinon.stub(fs, "existsSync").returns(true); - expect(() => helper.getSkillCodeFolderName("foo", CONSTANTS.ALEXA.REGION.NA)).to.throw( + stub(fs, "existsSync").returns(true); + expect(() => getSkillCodeFolderName("foo", ALEXA.REGION.NA)).to.throw( 'Invalid code setting in region NA. "src" must be set if you want to run the skill code with skill package.', ); }); it("| skill code folder does not exist", () => { - sinon.stub(ResourcesConfig, "getInstance").returns({ - getCodeSrcByRegion: sinon.stub().returns("fooFolder"), + stub(ResourcesConfig, "getInstance").returns({ + getCodeSrcByRegion: stub().returns("fooFolder"), }); - sinon.stub(fs, "existsSync").returns(false); - expect(() => helper.getSkillCodeFolderName("foo", CONSTANTS.ALEXA.REGION.NA)).to.throw( + stub(fs, "existsSync").returns(false); + expect(() => getSkillCodeFolderName("foo", ALEXA.REGION.NA)).to.throw( "Invalid code setting in region NA. File doesn't exist for code src: fooFolder.", ); }); @@ -152,15 +151,14 @@ describe("Commands Run - helper test", () => { describe("getSkillFlowInstance test", () => { it("| create skill flow instance test, error case", () => { expect(() => - helper - .getSkillFlowInstance( - CONSTANTS.RUNTIME.NODE, + getSkillFlowInstance( + RUNTIME.NODE, {skillCodeFolderName: "fooSkillCodeFolderName"}, true, - CONSTANTS.RUN.DEFAULT_DEBUG_PORT, + RUN.DEFAULT_DEBUG_PORT, "fooToken", "fooSkillId", - CONSTANTS.ALEXA.REGION.NA, + ALEXA.REGION.NA, false, ) .to.throw( diff --git a/test/unit/commands/run/index-test.ts b/test/unit/commands/run/index-test.ts index e70070f9..c41fb30f 100644 --- a/test/unit/commands/run/index-test.ts +++ b/test/unit/commands/run/index-test.ts @@ -8,7 +8,7 @@ import Messenger from "../../../../lib/view/messenger"; import ResourcesConfig from "../../../../lib/model/resources-config"; import profileHelper from "../../../../lib/utils/profile-helper"; import CONSTANTS from "../../../../lib/utils/constants"; -import helper from "../../../../lib/commands/run/helper"; +import * as helper from "../../../../lib/commands/run/helper"; import SmapiClient from "../../../../lib/clients/smapi-client"; import {OptionModel} from "../../../../lib/commands/option-validator"; @@ -78,7 +78,7 @@ describe("Commands Run test - command class test", () => { sinon.stub(path, "join").returns(INVALID_RESOURCES_CONFIG_JSON_PATH); // call await expect(instance.handle(TEST_CMD_WITH_VALUES)).rejectedWith( - `Failed to obtain skill-id for the given profile - ${TEST_PROFILE}. Please deploy you skill project first.`, + `Failed to obtain skill-id for the given profile - ${TEST_PROFILE}. Please deploy your skill project first.`, ); }); diff --git a/test/unit/commands/run/run-flow/java-run-test.js b/test/unit/commands/run/run-flow/java-run-test.js index 275af808..1b622b4b 100644 --- a/test/unit/commands/run/run-flow/java-run-test.js +++ b/test/unit/commands/run/run-flow/java-run-test.js @@ -1,6 +1,6 @@ -const {expect} = require("chai"); -const JavaRunFlow = require("../../../../../lib/commands/run/run-flow/java-run"); -const CONSTANTS = require("../../../../../lib/utils/constants"); +import { expect } from "chai"; +import { JavaRunFlow } from "../../../../../lib/commands/run/run-flow/java-run"; +import { RUN, ALEXA } from "../../../../../lib/utils/constants"; describe("Java run flow test", () => { const skillInvocationInfo = { @@ -11,10 +11,10 @@ describe("Java run flow test", () => { const runFlow = new JavaRunFlow({ skillInvocationInfo, waitForAttach: false, - debugPort: CONSTANTS.RUN.DEFAULT_DEBUG_PORT, + debugPort: RUN.DEFAULT_DEBUG_PORT, token: "fooToken", skillId: "fooSkill", - runRegion: CONSTANTS.ALEXA.REGION.NA, + runRegion: ALEXA.REGION.NA, watch: false, }); const nodemonConfig = runFlow.getExecConfig(); @@ -31,10 +31,10 @@ describe("Java run flow test", () => { const runFlow = new JavaRunFlow({ skillInvocationInfo, waitForAttach: true, - debugPort: CONSTANTS.RUN.DEFAULT_DEBUG_PORT, + debugPort: RUN.DEFAULT_DEBUG_PORT, token: "fooToken", skillId: "fooSkill", - runRegion: CONSTANTS.ALEXA.REGION.NA, + runRegion: ALEXA.REGION.NA, watch: true, }); const nodemonConfig = runFlow.getExecConfig(); diff --git a/test/unit/commands/run/run-flow/nodejs-run-test.js b/test/unit/commands/run/run-flow/nodejs-run-test.js index b0899132..fd63404e 100644 --- a/test/unit/commands/run/run-flow/nodejs-run-test.js +++ b/test/unit/commands/run/run-flow/nodejs-run-test.js @@ -1,9 +1,9 @@ -const {expect} = require("chai"); -const path = require("path"); -const fs = require("fs"); -const sinon = require("sinon"); -const NodejsRunFlow = require("../../../../../lib/commands/run/run-flow/nodejs-run"); -const CONSTANTS = require("../../../../../lib/utils/constants"); +import { expect } from "chai"; +import { join } from "path"; +import fs from "fs"; +import { restore, stub } from "sinon"; +import { NodejsRunFlow } from "../../../../../lib/commands/run/run-flow/nodejs-run"; +import { RUN, ALEXA } from "../../../../../lib/utils/constants"; describe("Node run flow test", () => { const skillInvocationInfo = { @@ -12,22 +12,22 @@ describe("Node run flow test", () => { skillFileName: "fooFileName", }; afterEach(() => { - sinon.restore(); + restore(); }); it("| validate nodemon config, run mode", () => { - sinon.stub(fs, "existsSync").returns(true); + stub(fs, "existsSync").returns(true); const runFlow = new NodejsRunFlow({ skillInvocationInfo, waitForAttach: false, - debugPort: CONSTANTS.RUN.DEFAULT_DEBUG_PORT, + debugPort: RUN.DEFAULT_DEBUG_PORT, token: "fooToken", skillId: "fooSkill", - runRegion: CONSTANTS.ALEXA.REGION.NA, + runRegion: ALEXA.REGION.NA, watch: false, }); const nodemonConfig = runFlow.getExecConfig(); expect(nodemonConfig.execMap).eq(undefined); - expect(nodemonConfig.script).eq(path.join(process.cwd(), "fooFolder", CONSTANTS.RUN.NODE.SCRIPT_LOCATION)); + expect(nodemonConfig.script).eq(join(process.cwd(), "fooFolder", RUN.NODE.SCRIPT_LOCATION)); expect(nodemonConfig.args).to.deep.equal([ "--accessToken", '"fooToken"', @@ -36,28 +36,28 @@ describe("Node run flow test", () => { "--handlerName", "fooHandler", "--skillEntryFile", - path.join(process.cwd(), "fooFolder", "fooFileName.js"), + join(process.cwd(), "fooFolder", "fooFileName.js"), "--region", - CONSTANTS.ALEXA.REGION.NA, + ALEXA.REGION.NA, ]); expect(nodemonConfig.watch).eq(false); }); it("| validate nodemon config, debug mode, watch enabled", () => { - sinon.stub(fs, "existsSync").returns(true); + stub(fs, "existsSync").returns(true); const runFlow = new NodejsRunFlow({ skillInvocationInfo, waitForAttach: true, - debugPort: CONSTANTS.RUN.DEFAULT_DEBUG_PORT, + debugPort: RUN.DEFAULT_DEBUG_PORT, token: "fooToken", skillId: "fooSkill", - runRegion: CONSTANTS.ALEXA.REGION.NA, + runRegion: ALEXA.REGION.NA, watch: true, }); const nodemonConfig = runFlow.getExecConfig(); expect(nodemonConfig.execMap).to.deep.equal({ - js: `node --inspect-brk=${CONSTANTS.RUN.DEFAULT_DEBUG_PORT}`, + js: `node --inspect-brk=${RUN.DEFAULT_DEBUG_PORT}`, }); - expect(nodemonConfig.script).eq(path.join(process.cwd(), "fooFolder", CONSTANTS.RUN.NODE.SCRIPT_LOCATION)); + expect(nodemonConfig.script).eq(join(process.cwd(), "fooFolder", RUN.NODE.SCRIPT_LOCATION)); expect(nodemonConfig.args).to.deep.equal([ "--accessToken", '"fooToken"', @@ -66,22 +66,22 @@ describe("Node run flow test", () => { "--handlerName", "fooHandler", "--skillEntryFile", - path.join(process.cwd(), "fooFolder", "fooFileName.js"), + join(process.cwd(), "fooFolder", "fooFileName.js"), "--region", - CONSTANTS.ALEXA.REGION.NA, + ALEXA.REGION.NA, ]); expect(nodemonConfig.watch).eq("fooFolder"); }); it("| ask-sdk-local-debug has not been installed", () => { - sinon.stub(fs, "existsSync").returns(false); + stub(fs, "existsSync").returns(false); try { new NodejsRunFlow({ skillInvocationInfo, waitForAttach: true, - debugPort: CONSTANTS.RUN.DEFAULT_DEBUG_PORT, + debugPort: RUN.DEFAULT_DEBUG_PORT, token: "fooToken", skillId: "fooSkill", - runRegion: CONSTANTS.ALEXA.REGION.NA, + runRegion: ALEXA.REGION.NA, watch: true, }); } catch (err) { diff --git a/test/unit/commands/run/run-flow/python-run-test.js b/test/unit/commands/run/run-flow/python-run-test.js index e8dbb687..afe66835 100644 --- a/test/unit/commands/run/run-flow/python-run-test.js +++ b/test/unit/commands/run/run-flow/python-run-test.js @@ -1,40 +1,39 @@ -const {expect} = require("chai"); -const path = require("path"); -const fs = require("fs"); -const sinon = require("sinon"); -const childProcess = require("child_process"); -const PythonRunFlow = require("../../../../../lib/commands/run/run-flow/python-run"); -const CONSTANTS = require("../../../../../lib/utils/constants"); +import { expect } from "chai"; +import { join } from "path"; +import fs from "fs"; +import { stub, restore } from "sinon"; +import childProcess from "child_process"; +import { PythonRunFlow } from "../../../../../lib/commands/run/run-flow/python-run"; +import { RUN, ALEXA } from "../../../../../lib/utils/constants"; describe("Python run flow test", () => { const skillPackagePath = "fooPythonPath"; - const pythonDebugPath = path.join(skillPackagePath, CONSTANTS.RUN.PYTHON.SCRIPT_LOCATION); + const pythonDebugPath = join(skillPackagePath, RUN.PYTHON.SCRIPT_LOCATION); const skillInvocationInfo = { skillCodeFolderName: "fooFolder", handlerName: "fooHandler", skillFileName: "fooFileName", }; beforeEach(() => { - sinon - .stub(childProcess, "execSync") + stub(childProcess, "execSync") .withArgs('python3 -c "import site; import json; print(json.dumps(site.getsitepackages()))"') .returns("") .withArgs("python3 -m pip install debugpy", {stdio: "inherit"}) .returns(""); - sinon.stub(JSON, "parse").returns([skillPackagePath]); + stub(JSON, "parse").returns([skillPackagePath]); }); afterEach(() => { - sinon.restore(); + restore(); }); it("| validate nodemon config, run mode", () => { - sinon.stub(fs, "existsSync").withArgs(skillPackagePath).returns(true).withArgs(pythonDebugPath).returns(true); + stub(fs, "existsSync").withArgs(skillPackagePath).returns(true).withArgs(pythonDebugPath).returns(true); const runFlow = new PythonRunFlow({ skillInvocationInfo, waitForAttach: false, - debugPort: CONSTANTS.RUN.DEFAULT_DEBUG_PORT, + debugPort: RUN.DEFAULT_DEBUG_PORT, token: "fooToken", skillId: "fooSkill", - runRegion: CONSTANTS.ALEXA.REGION.NA, + runRegion: ALEXA.REGION.NA, watch: false, }); const nodemonConfig = runFlow.getExecConfig(); @@ -50,29 +49,29 @@ describe("Python run flow test", () => { "--skillHandler", "fooHandler", "--skillFilePath", - path.join("fooFolder", "fooFileName.py"), + join("fooFolder", "fooFileName.py"), "--region", - CONSTANTS.ALEXA.REGION.NA, + ALEXA.REGION.NA, ]); expect(nodemonConfig.watch).eq(false); expect(nodemonConfig.ext).eq("py,json,txt"); }); it("| validate nodemon config, debug mode, watch enabled", () => { - sinon.stub(fs, "existsSync").withArgs(skillPackagePath).returns(true).withArgs(pythonDebugPath).returns(true); + stub(fs, "existsSync").withArgs(skillPackagePath).returns(true).withArgs(pythonDebugPath).returns(true); const runFlow = new PythonRunFlow({ skillInvocationInfo, waitForAttach: true, - debugPort: CONSTANTS.RUN.DEFAULT_DEBUG_PORT, + debugPort: RUN.DEFAULT_DEBUG_PORT, token: "fooToken", skillId: "fooSkill", - runRegion: CONSTANTS.ALEXA.REGION.NA, + runRegion: ALEXA.REGION.NA, watch: true, }); const nodemonConfig = runFlow.getExecConfig(); expect(nodemonConfig.execMap).to.deep.equal({ - py: `python3 -m debugpy --listen ${CONSTANTS.RUN.DEFAULT_DEBUG_PORT} --wait-for-client`, + py: `python3 -m debugpy --listen ${RUN.DEFAULT_DEBUG_PORT} --wait-for-client`, }); - expect(nodemonConfig.script).eq(path.join("fooPythonPath", CONSTANTS.RUN.PYTHON.SCRIPT_LOCATION)); + expect(nodemonConfig.script).eq(join("fooPythonPath", RUN.PYTHON.SCRIPT_LOCATION)); expect(nodemonConfig.args).to.deep.equal([ "--accessToken", '"fooToken"', @@ -81,23 +80,23 @@ describe("Python run flow test", () => { "--skillHandler", "fooHandler", "--skillFilePath", - path.join("fooFolder", "fooFileName.py"), + join("fooFolder", "fooFileName.py"), "--region", - CONSTANTS.ALEXA.REGION.NA, + ALEXA.REGION.NA, ]); expect(nodemonConfig.watch).eq("fooFolder"); expect(nodemonConfig.ext).eq("py,json,txt"); }); it("| ask-sdk-local-debug has not been installed", () => { - sinon.stub(fs, "existsSync").withArgs(skillPackagePath).returns(true).withArgs(pythonDebugPath).returns(false); + stub(fs, "existsSync").withArgs(skillPackagePath).returns(true).withArgs(pythonDebugPath).returns(false); try { new PythonRunFlow({ skillInvocationInfo, waitForAttach: true, - debugPort: CONSTANTS.RUN.DEFAULT_DEBUG_PORT, + debugPort: RUN.DEFAULT_DEBUG_PORT, token: "fooToken", skillId: "fooSkill", - runRegion: CONSTANTS.ALEXA.REGION.NA, + runRegion: ALEXA.REGION.NA, watch: true, }); } catch (err) { diff --git a/test/unit/commands/skill/add-locales/helper-test.js b/test/unit/commands/skill/add-locales/helper-test.js index 7252f56c..146cf7dd 100644 --- a/test/unit/commands/skill/add-locales/helper-test.js +++ b/test/unit/commands/skill/add-locales/helper-test.js @@ -65,12 +65,12 @@ describe("Commands add-locales - helper test", () => { const TEST_TEMPLATE_BODY = {body: "template"}; const TEST_TEMPLATE_MAP = { statusCode: 200, - body: JSON.stringify({ + body: { INTERACTION_MODEL_BY_LANGUAGE: { es: "TEST_ES_URL", en: "TEST_EN_URL", }, - }), + }, }; new ResourcesConfig(FIXTURE_RESOURCES_CONFIG_FILE_PATH); new Manifest(FIXTURE_MANIFEST_FILE_PATH); @@ -96,7 +96,7 @@ describe("Commands add-locales - helper test", () => { httpClient.request.onFirstCall().callsArgWith(3, TEST_ERROR); // call helper.addLocales(["en-US"], TEST_PROFILE, TEST_DEBUG, (err, result) => { - expect(err).equal("Failed to retrieve the template list.\nError: error"); + expect(err).equal("Failed to retrieve the interaction model map template list.\nError: \"error\""); expect(result).equal(undefined); done(); }); @@ -104,11 +104,10 @@ describe("Commands add-locales - helper test", () => { it("| fail to get the template map with statusCode not correct", (done) => { // setup - httpClient.request.onFirstCall().callsArgWith(3, undefined, {statusCode: 401}); + httpClient.request.onFirstCall().callsArgWith(3, {statusCode: 401}); // call helper.addLocales(["en-US"], TEST_PROFILE, TEST_DEBUG, (err, result) => { - expect(err).equal(`Failed to retrieve the template list, please see the details from the error response. -${JSON.stringify({statusCode: 401}, null, 2)}`); + expect(err).equal(`Failed to retrieve the interaction model map template list.\nError: ${JSON.stringify({statusCode: 401}, null, 2)}`); expect(result).equal(undefined); done(); }); @@ -160,7 +159,7 @@ ${JSON.stringify({statusCode: 401}, null, 2)}`); httpClient.request.onFirstCall().callsArgWith(3, undefined, TEST_TEMPLATE_MAP); SkillMetadataController.prototype.getInteractionModelLocales.returns({"es-US": TEST_MODEL_PATH}); fs.existsSync.returns(false); - httpClient.request.onSecondCall().callsArgWith(3, null, {statusCode: 401}); + httpClient.request.onSecondCall().callsArgWith(3, {statusCode: 401}, null); // call helper.addLocales(["en-US"], TEST_PROFILE, TEST_DEBUG, (err, result) => { expect(err).equal(`Failed to retrieve the template list, please see the details from the error response. diff --git a/test/unit/commands/skill/skill-commander-test.ts b/test/unit/commands/skill/skill-commander-test.ts index 0c8d74e4..bd466503 100644 --- a/test/unit/commands/skill/skill-commander-test.ts +++ b/test/unit/commands/skill/skill-commander-test.ts @@ -2,7 +2,6 @@ import {commander} from "../../../../lib/commands/skill/skill-commander"; import AddlocalesCommand from "../../../../lib/commands/skill/add-locales"; import sinon from "sinon"; import Messenger from "../../../../lib/view/messenger"; -import httpClient from "../../../../lib/clients/http-client"; /** * Simple test which loads the skill commander while running tests. @@ -22,11 +21,11 @@ describe("Skill Commander Test", () => { dispose: sinon.stub(), }); sinon.stub(process, "exit"); - sinon.stub(httpClient, "request").yields({statusCode: 200}); }); it("loads and runs a command", async () => { sinon.stub(AddlocalesCommand.prototype, "handle").resolves(); + sinon.stub(AddlocalesCommand.prototype, "_remindsIfNewVersion").resolves(); await commander.parseAsync(["something", "something", "add-locales"]); }); diff --git a/test/unit/commands/smapi/appended-commands/export-package/index-test.ts b/test/unit/commands/smapi/appended-commands/export-package/index-test.ts index 8bf2e3cf..f2792b5d 100644 --- a/test/unit/commands/smapi/appended-commands/export-package/index-test.ts +++ b/test/unit/commands/smapi/appended-commands/export-package/index-test.ts @@ -5,7 +5,7 @@ import AuthorizationController from "../../../../../../lib/controllers/authoriza import CONSTANTS from "../../../../../../lib/utils/constants"; import ExportPackageCommand from "../../../../../../lib/commands/smapi/appended-commands/export-package"; import helper from "../../../../../../lib/commands/smapi/appended-commands/export-package/helper"; -import httpClient from "../../../../../../lib/clients/http-client"; +import * as httpClient from "../../../../../../lib/clients/http-client"; import jsonView from "../../../../../../lib/view/json-view"; import Messenger from "../../../../../../lib/view/messenger"; import optionModel from "../../../../../../lib/commands/option-model.json"; @@ -79,13 +79,13 @@ describe("Commands export-package test - command class test", () => { sinon.stub(fs, "existsSync").returns(true); // call await expect(instance.handle(TEST_CMD)).rejectedWith( - `A ${CONSTANTS.FILE_PATH.SKILL_PACKAGE.PACKAGE} fold already exists in the current working directory.`, + `A ${CONSTANTS.FILE_PATH.SKILL_PACKAGE.PACKAGE} folder already exists in the current working directory.`, ); // verify expect(errorStub).calledOnceWith( sinon.match({ - message: `A ${CONSTANTS.FILE_PATH.SKILL_PACKAGE.PACKAGE} ` + "fold already exists in the current working directory.", + message: `A ${CONSTANTS.FILE_PATH.SKILL_PACKAGE.PACKAGE} ` + "folder already exists in the current working directory.", }), ); expect(infoStub).not.called; @@ -119,9 +119,9 @@ describe("Commands export-package test - command class test", () => { it("| export skill package response with status code >= 300, expect throw error", async () => { // setup sinon.stub(fs, "existsSync").returns(false); - sinon.stub(httpClient, "request").callsArgWith(3, null, EXPORT_ERROR); // stub smapi request + sinon.stub(httpClient, "request").callsArgWith(3, EXPORT_ERROR, null); // stub smapi request // call - await expect(instance.handle(TEST_CMD)).rejectedWith(jsonView.toString({error: TEST_ERROR_MESSAGE})); + await expect(instance.handle(TEST_CMD)).rejectedWith(jsonView.toString(EXPORT_ERROR)); // verify expect(infoStub).not.called; diff --git a/test/unit/commands/smapi/appended-commands/get-task/index-test.ts b/test/unit/commands/smapi/appended-commands/get-task/index-test.ts index 245fb370..feb2f9bc 100644 --- a/test/unit/commands/smapi/appended-commands/get-task/index-test.ts +++ b/test/unit/commands/smapi/appended-commands/get-task/index-test.ts @@ -2,7 +2,7 @@ import {expect} from "chai"; import sinon from "sinon"; import AuthorizationController from "../../../../../../lib/controllers/authorization-controller"; import GetTaskCommand from "../../../../../../lib/commands/smapi/appended-commands/get-task"; -import httpClient from "../../../../../../lib/clients/http-client"; +import * as httpClient from "../../../../../../lib/clients/http-client"; import jsonView from "../../../../../../lib/view/json-view"; import Messenger from "../../../../../../lib/view/messenger"; import optionModel from "../../../../../../lib/commands/option-model.json"; @@ -55,10 +55,10 @@ describe("Command get-task test ", () => { }); it("| should display error thrown by smapi server", async () => { - const body = {message: "Bad request."}; - sinon.stub(httpClient, "request").yields(null, {body, statusCode: 400}); + const response = {message: "Bad request.", statusCode: 400, body: {}}; + sinon.stub(httpClient, "request").callsArgWith(3, response); - await expect(instance.handle(cmdOptions)).eventually.rejected.include('"message": "Bad request."'); + await expect(instance.handle(cmdOptions)).eventually.rejected.include(response); }); afterEach(() => { diff --git a/test/unit/commands/smapi/appended-commands/search-task/index-test.ts b/test/unit/commands/smapi/appended-commands/search-task/index-test.ts index 0f34b875..ba1d8bc3 100644 --- a/test/unit/commands/smapi/appended-commands/search-task/index-test.ts +++ b/test/unit/commands/smapi/appended-commands/search-task/index-test.ts @@ -2,7 +2,7 @@ import {expect} from "chai"; import sinon from "sinon"; import AuthorizationController from "../../../../../../lib/controllers/authorization-controller"; import SearchTaskCommand from "../../../../../../lib/commands/smapi/appended-commands/search-task"; -import httpClient from "../../../../../../lib/clients/http-client"; +import * as httpClient from "../../../../../../lib/clients/http-client"; import jsonView from "../../../../../../lib/view/json-view"; import Messenger from "../../../../../../lib/view/messenger"; import optionModel from "../../../../../../lib/commands/option-model.json"; @@ -72,10 +72,10 @@ describe("Command search-task test ", () => { }); it("| should display error thrown by smapi server", async () => { - const body = {message: "Bad request."}; - sinon.stub(httpClient, "request").yields(null, {body, statusCode: 400}); + const response = {message: "Bad request.", statusCode: 400, body: {}}; + sinon.stub(httpClient, "request").callsArgWith(3, response); - await expect(instance.handle(cmdOptions)).eventually.rejected.include('"message": "Bad request."'); + await expect(instance.handle(cmdOptions)).eventually.rejected.include(response); }); afterEach(() => { diff --git a/test/unit/commands/smapi/smapi-command-handler-test.js b/test/unit/commands/smapi/smapi-command-handler-test.js index 1d0dcdee..b20a4068 100644 --- a/test/unit/commands/smapi/smapi-command-handler-test.js +++ b/test/unit/commands/smapi/smapi-command-handler-test.js @@ -22,17 +22,13 @@ describe("Smapi test - smapiCommandHandler function", () => { const arrayValue = ["test", "test1", "test2"]; const arrayValueStr = arrayValue.join(ARRAY_SPLIT_DELIMITER); const fakeResponse = { - body: {someProperty: "x"}, - headers: [ - { - key: "x", - value: "y", - }, - { - key: "z", - value: "b", - }, - ], + body: { + someProperty: "x" + }, + headers: { + "x": "y", + "z": "b", + }, statusCode: 200, }; @@ -62,7 +58,9 @@ describe("Smapi test - smapiCommandHandler function", () => { }, _name: commandName, }; - sinon.stub(AuthorizationController.prototype, "_getAuthClientInstance").returns({config: {}}); + sinon + .stub(AuthorizationController.prototype, "_getAuthClientInstance") + .returns({config: {}, isValidToken: () => true, refreshToken: () => "testtoken"}); sinon.stub(profileHelper, "runtimeProfile").returns("test"); sinon.stub(AppConfig.prototype, "_validateFilePath"); sinon.stub(AppConfig.prototype, "read"); @@ -209,15 +207,21 @@ describe("Smapi test - smapiCommandHandler function", () => { describe("Smapi test - parseSmapiResponse function", () => { let warnStub; + beforeEach(() => { warnStub = sinon.stub(); sinon.stub(Messenger, "getInstance").returns({ warn: warnStub, }); }); + + afterEach(() => { + sinon.restore(); + }); + it("| should parse text/csv response", () => { const content = "foo bar\n foo"; - const response = {headers: [{key: "content-type", value: "text/csv"}], body: content}; + const response = {headers: {"content-type": "text/csv"}, body: content}; const result = parseSmapiResponse(response); @@ -226,15 +230,15 @@ describe("Smapi test - parseSmapiResponse function", () => { it("| should parse application/json response", () => { const content = {foo: "bar"}; - const response = {headers: [{key: "content-type", value: "application/json"}], body: content}; + const response = {headers: {"content-type": "application/json"}, body: content}; const result = parseSmapiResponse(response); - expect(result).eql(jsonView.toString(content)); + expect(result).deep.eql(JSON.stringify(content, null, 2)); }); it("| should return command executed successfully if not response body", () => { - const response = {headers: []}; + const response = {headers: {}}; const result = parseSmapiResponse(response); @@ -246,7 +250,7 @@ describe("Smapi test - parseSmapiResponse function", () => { const resource = "someResource"; const profile = "test"; const url = `/v1/skills/${skillId}/status?resource=${resource}`; - const response = {headers: [{key: "location", value: url}], statusCode: 202}; + const response = {headers: {"location": url}, statusCode: 202}; parseSmapiResponse(response, profile); expect(warnStub.firstCall.lastArg).eql( @@ -262,7 +266,7 @@ describe("Smapi test - parseSmapiResponse function", () => { sinon.stub(Map.prototype, "get").withArgs("vendorId").returns({skip: true}).withArgs("resource").returns("someCustomName"); const url = `/v1/skills/${skillId}/status?resource=${resource}&vendorId=${vendorId}`; - const response = {headers: [{key: "location", value: url}], statusCode: 202}; + const response = {headers: {"location": url}, statusCode: 202}; parseSmapiResponse(response); expect(warnStub.firstCall.lastArg).eql( @@ -273,13 +277,10 @@ describe("Smapi test - parseSmapiResponse function", () => { it("| should not show warning with status hint command when not able to find one", () => { const url = "/some-random-non-smapi-url"; - const response = {headers: [{key: "location", value: url}], statusCode: 202}; + const response = {headers: {"location": url}, statusCode: 202}; parseSmapiResponse(response); expect(warnStub.firstCall.lastArg).eql("This is an asynchronous operation. Check the progress " + `using the following url: ${url}`); }); - afterEach(() => { - sinon.restore(); - }); }); diff --git a/test/unit/commands/util/git-credentials-helper/index-test.ts b/test/unit/commands/util/git-credentials-helper/index-test.ts index e11717d3..d60bcfa3 100644 --- a/test/unit/commands/util/git-credentials-helper/index-test.ts +++ b/test/unit/commands/util/git-credentials-helper/index-test.ts @@ -3,8 +3,7 @@ import path from "path"; import sinon from "sinon"; import AuthorizationController from "../../../../../lib/controllers/authorization-controller"; import GitCredentialsHelperCommand from "../../../../../lib/commands/util/git-credentials-helper"; -import httpClient from "../../../../../lib/clients/http-client"; -import jsonView from "../../../../../lib/view/json-view"; +import * as httpClient from "../../../../../lib/clients/http-client"; import Messenger from "../../../../../lib/view/messenger"; import optionModel from "../../../../../lib/commands/option-model.json"; import profileHelper from "../../../../../lib/utils/profile-helper"; @@ -150,13 +149,14 @@ describe("Commands git-credentials-helper test - command class test", () => { body: { error: TEST_ERROR_MESSAGE, }, + headers: {}, }; sinon.stub(path, "join").returns(FIXTURE_RESOURCES_CONFIG_FILE_PATH); - sinon.stub(httpClient, "request").callsArgWith(3, null, GET_STATUS_ERROR); // stub getGitCredentials request + sinon.stub(httpClient, "request").callsArgWith(3, GET_STATUS_ERROR); // stub getGitCredentials request // call await expect(instance.handle(TEST_CMD, undefined)).rejected; //verify - expect(errorStub).calledOnceWith(jsonView.toString({error: TEST_ERROR_MESSAGE})); + expect(errorStub).calledOnceWith(GET_STATUS_ERROR); }); it("| get git credentials succeed, expect correct output", async () => { diff --git a/test/unit/commands/util/util-commander-test.ts b/test/unit/commands/util/util-commander-test.ts index 88514c11..80e50eca 100644 --- a/test/unit/commands/util/util-commander-test.ts +++ b/test/unit/commands/util/util-commander-test.ts @@ -2,7 +2,7 @@ import {commander} from "../../../../lib/commands/util/util-commander"; import UpdateProjectCommand from "../../../../lib/commands/util/upgrade-project"; import sinon from "sinon"; import Messenger from "../../../../lib/view/messenger"; -import httpClient from "../../../../lib/clients/http-client"; +import * as httpClient from "../../../../lib/clients/http-client"; /** * Simple test which loads the util commander while running tests. diff --git a/test/unit/controller/authorization-controller/index-test.js b/test/unit/controller/authorization-controller/index-test.js index 51faae43..19d198a7 100644 --- a/test/unit/controller/authorization-controller/index-test.js +++ b/test/unit/controller/authorization-controller/index-test.js @@ -14,6 +14,7 @@ const CONSTANTS = require("../../../../lib/utils/constants"); const LocalHostServer = require("../../../../lib/utils/local-host-server"); const Messenger = require("../../../../lib/view/messenger"); const SpinnerView = require("../../../../lib/view/spinner-view"); +const ui = require("../../../../lib/controllers/authorization-controller/ui"); describe("Controller test - Authorization controller test", () => { const DEFAULT_CLIENT_ID = CONSTANTS.LWA.CLI_INTERNAL_ONLY_LWA_CLIENT.CLIENT_ID; @@ -421,6 +422,7 @@ describe("Controller test - Authorization controller test", () => { // setup sinon.stub(LocalHostServer.prototype, "listen"); sinon.stub(LocalHostServer.prototype, "registerEvent"); + const informReceivedErrorStub = sinon.stub(ui, "informReceivedError").callsArgWith(0, null, "Ok"); const requestDestroyStub = sinon.stub(); const request = { url: "/cb?error", @@ -446,50 +448,69 @@ describe("Controller test - Authorization controller test", () => { // call authorizationController._listenResponseFromLWA(TEST_PORT, (err) => { // verify - const EXPECTED_ERR_MESSAGE = `Error: ${requestQuery.query.error}\nReason: ${requestQuery.query.error_description}`; + const EXPECTED_ERR_MESSAGE = `Error: ${requestQuery.query.error}\nReason: ${requestQuery.query.error_description}`.split("\n").join(". "); expect(spinnerTerminateStub.callCount).eq(1); expect(serverDestroyStub.callCount).eq(1); expect(endStub.callCount).eq(1); expect(endStub.args[0][0].includes(EXPECTED_ERR_MESSAGE)).equal(true); expect(err).eq(EXPECTED_ERR_MESSAGE); + expect(informReceivedErrorStub.called).to.be.true; done(); }); }); - it("| local server returns valid authCode", (done) => { - // setup - sinon.stub(LocalHostServer.prototype, "listen"); - sinon.stub(LocalHostServer.prototype, "registerEvent"); - const requestDestroyStub = sinon.stub(); - const request = { - url: "/cb?code", - socket: { - destroy: requestDestroyStub, - }, - }; - const endStub = sinon.stub(); - const response = { - on: sinon.stub().callsArgWith(1), - end: endStub, - }; - sinon.stub(SpinnerView.prototype, "terminate"); - const requestQuery = { - query: { - code: TEST_AUTH_CODE, - }, - }; - sinon.stub(url, "parse").returns(requestQuery); - sinon.stub(LocalHostServer.prototype, "destroy"); - sinon.stub(LocalHostServer.prototype, "create").callsArgWith(0, request, response); + describe("local server ", () => { + let endStub; + beforeEach(() => { + sinon.stub(LocalHostServer.prototype, "listen"); + sinon.stub(LocalHostServer.prototype, "registerEvent"); + const requestDestroyStub = sinon.stub(); + const request = { + url: "/cb?code", + socket: { + destroy: requestDestroyStub, + }, + }; + endStub = sinon.stub(); + const response = { + on: sinon.stub().callsArgWith(1), + end: endStub, + }; + sinon.stub(SpinnerView.prototype, "terminate"); + const requestQuery = { + query: { + code: TEST_AUTH_CODE, + }, + }; + sinon.stub(url, "parse").returns(requestQuery); + sinon.stub(LocalHostServer.prototype, "destroy"); + sinon.stub(LocalHostServer.prototype, "create").callsArgWith(0, request, response); + }); - // call - authorizationController._listenResponseFromLWA(TEST_PORT, (err, authCode) => { - // verify - expect(endStub.callCount).eq(1); - expect(endStub.args[0][0]).eq(messages.ASK_SIGN_IN_SUCCESS_MESSAGE); - expect(err).eq(null); - expect(authCode).eq(TEST_AUTH_CODE); - done(); + it("| returns valid authCode", (done) => { + sinon.stub(ui, "confirmAllowSignIn").callsArgWith(0, null, true); + // call + authorizationController._listenResponseFromLWA(TEST_PORT, (err, authCode) => { + // verify + expect(endStub.callCount).eq(1); + expect(endStub.args[0][0]).eq(messages.ASK_SIGN_IN_SUCCESS_MESSAGE); + expect(err).eq(null); + expect(authCode).eq(TEST_AUTH_CODE); + done(); + }); + }); + + it("| returns error for unconfirmed browser sign in", (done) => { + sinon.stub(ui, "confirmAllowSignIn").callsArgWith(0, null, false); + // call + authorizationController._listenResponseFromLWA(TEST_PORT, (err, authCode) => { + // verify + expect(endStub.callCount).eq(1); + expect(endStub.args[0][0]).eq(messages.ASK_SIGN_IN_SUCCESS_MESSAGE); + expect(err).eq(messages.STOP_UNCONFIRMED_BROWSER_SIGNIN); + expect(authCode).eq(undefined); + done(); + }); }); }); }); diff --git a/test/unit/controller/hosted-skill-controller/index-test.js b/test/unit/controller/hosted-skill-controller/index-test.js index 9e431f3c..d1bdca83 100644 --- a/test/unit/controller/hosted-skill-controller/index-test.js +++ b/test/unit/controller/hosted-skill-controller/index-test.js @@ -392,6 +392,7 @@ describe("Controller test - hosted skill controller test", () => { const stubTestFunc = sinon.stub(httpClient, "request"); // stub getSkillStatus smapi request stubTestFunc.onCall(0).callsArgWith(3, null, TEST_STATUS_RESPONSE_0); stubTestFunc.onCall(1).callsArgWith(3, null, TEST_STATUS_RESPONSE_1); + sinon.useFakeTimers().tickAsync(CONSTANTS.CONFIGURATION.RETRY.MAX_RETRY_INTERVAL); // call hostedSkillController.checkSkillStatus(TEST_SKILL_ID, (err, res) => { expect(err).equal(null); @@ -400,6 +401,58 @@ describe("Controller test - hosted skill controller test", () => { }); }); + it("| polling to get skill status until one resource FAILED, expect error thrown ", (done) => { + // setup + const TEST_STATUS_RESPONSE_0 = { + statusCode: 200, + headers: {}, + body: { + [CONSTANTS.HOSTED_SKILL.RESOURCES.MANIFEST]: { + lastUpdateRequest: { + status: "SUCCEEDED", + }, + }, + }, + }; + const TEST_STATUS_RESPONSE_1 = { + statusCode: 200, + headers: {}, + body: { + [CONSTANTS.HOSTED_SKILL.RESOURCES.MANIFEST]: { + lastUpdateRequest: { + status: "SUCCEEDED", + }, + }, + [CONSTANTS.HOSTED_SKILL.RESOURCES.INTERACTION_MODEL]: { + [TEST_LOCALE]: { + lastUpdateRequest: { + status: "SUCCEEDED", + }, + }, + }, + [CONSTANTS.HOSTED_SKILL.RESOURCES.PROVISIONING]: { + lastUpdateRequest: { + status: "FAILED", + }, + }, + }, + }; + const stubTestFunc = sinon.stub(httpClient, "request"); // stub getSkillStatus smapi request + stubTestFunc.onCall(0).callsArgWith(3, null, TEST_STATUS_RESPONSE_0); + stubTestFunc.onCall(1).callsArgWith(3, null, TEST_STATUS_RESPONSE_1); + sinon.useFakeTimers().tickAsync(CONSTANTS.CONFIGURATION.RETRY.MAX_RETRY_INTERVAL); + const callback = (err, res) => { + expect(err).equal( + "Check skill status failed for the following reason:\n" + + "Skill provisioning step failed.\nInfrastructure provision for the hosted skill failed. Please try again.", + ); + expect(res).equal(undefined); + done(); + }; + // call + hostedSkillController.checkSkillStatus(TEST_SKILL_ID, callback); + }); + it("| polling to get skill status response is null, expect error thrown ", (done) => { // setup const TEST_RESPONSE = null; diff --git a/test/unit/controller/skill-infrastructure-controller-test.js b/test/unit/controller/skill-infrastructure-controller-test.js index bf9abc46..11276d22 100644 --- a/test/unit/controller/skill-infrastructure-controller-test.js +++ b/test/unit/controller/skill-infrastructure-controller-test.js @@ -763,40 +763,60 @@ describe("Controller test - skill infrastructure controller test", () => { describe("# test class method: _ensureSkillManifestGotUpdated", () => { const skillInfraController = new SkillInfrastructureController(TEST_CONFIGURATION); + let deploySkillPackageStub, updateSkillManifestStub; beforeEach(() => { - new ResourcesConfig(FIXTURE_RESOURCES_CONFIG_FILE_PATH); new Manifest(FIXTURE_MANIFEST_FILE_PATH); - sinon.stub(fs, "writeFileSync"); + deploySkillPackageStub = sinon.stub(SkillMetadataController.prototype, "deploySkillPackage").yields(); + updateSkillManifestStub = sinon.stub(SkillMetadataController.prototype, "updateSkillManifest").yields(); }); afterEach(() => { - ResourcesConfig.dispose(); Manifest.dispose(); sinon.restore(); }); - it("| update skill manifest fails, expect error called back", (done) => { + it("| resolve vendor id fails, expect error called back", (done) => { + // setup + const TEST_ERROR = new Error("error"); + sinon.stub(profileHelper, "resolveVendorId").throws(TEST_ERROR); + // call + skillInfraController._ensureSkillManifestGotUpdated((err, res) => { + // verify + expect(res).equal(undefined); + expect(err).equal(TEST_ERROR); + expect(deploySkillPackageStub.calledOnce).equal(false); + expect(updateSkillManifestStub.calledOnce).equal(false); + done(); + }); + }); + + it("| skill manifest has no icon file uri, expect updateSkillManifest to be called with no error", (done) => { // setup sinon.stub(profileHelper, "resolveVendorId"); - sinon.stub(SkillMetadataController.prototype, "updateSkillManifest").yields("error"); + sinon.stub(Manifest.prototype, "hasIconFileUri").returns(false); // call skillInfraController._ensureSkillManifestGotUpdated((err, res) => { // verify expect(res).equal(undefined); - expect(err).equal("error"); + expect(err).equal(undefined); + expect(deploySkillPackageStub.calledOnce).equal(false); + expect(updateSkillManifestStub.calledOnce).equal(true); done(); }); }); - it("| update skill manifest succeeds, expect call back with no error", (done) => { + it("| skill manifest has icon file uri, expect deploySkillPackage to be called with no error", (done) => { + // setup sinon.stub(profileHelper, "resolveVendorId"); - sinon.stub(SkillMetadataController.prototype, "updateSkillManifest").yields(); + sinon.stub(Manifest.prototype, "hasIconFileUri").returns(true); // call skillInfraController._ensureSkillManifestGotUpdated((err, res) => { // verify expect(res).equal(undefined); expect(err).equal(undefined); + expect(deploySkillPackageStub.calledOnce).equal(true); + expect(updateSkillManifestStub.calledOnce).equal(false); done(); }); }); diff --git a/test/unit/controller/skill-metadata-controller-test.js b/test/unit/controller/skill-metadata-controller-test.js index 52476e3b..042a09db 100644 --- a/test/unit/controller/skill-metadata-controller-test.js +++ b/test/unit/controller/skill-metadata-controller-test.js @@ -61,6 +61,7 @@ describe("Controller test - skill metadata controller test", () => { }); afterEach(() => { + delete process.env.ASK_FORCE_ENABLE; ResourcesConfig.dispose(); Manifest.dispose(); sinon.restore(); @@ -263,6 +264,28 @@ describe("Controller test - skill metadata controller test", () => { expect(() => skillMetaController.validateDomain()).to.throw(CliWarn, expectedErrMessage); }); + it("| skips validation when ASK_FORCE_ENABLE is set", () => { + // setup + process.env.ASK_FORCE_ENABLE = 1; + Manifest.getInstance().setApis({ + custom: {}, + unknownApi: {}, + smartHome: {}, + }); + const getApisSpy = sinon.spy(Manifest.prototype, "getApis"); + const warnStub = sinon.stub(); + sinon.stub(Messenger, "getInstance").returns({ + warn: warnStub, + }); + const expectedWarningMessage = "The ASK_FORCE_ENABLE environment variable is set. Skipping domain validation.\n" + // call + skillMetaController.validateDomain(); + // verify + expect(getApisSpy.callCount).eq(0); + expect(warnStub.callCount).equal(1); + expect(warnStub.args[0][0]).equal(expectedWarningMessage); + }); + it("| callback error when getSkillEnablement return error", (done) => { // setup sinon.stub(httpClient, "request").callsArgWith(3, "getSkillEnablementError"); // stub smapi request @@ -274,7 +297,7 @@ describe("Controller test - skill metadata controller test", () => { }); }); - it("| callback error when getSkillEnablement return error", (done) => { + it("| callback error when getSkillEnablement return error", async () => { // setup const responseBody = { Message: "somehow fails", @@ -283,54 +306,52 @@ describe("Controller test - skill metadata controller test", () => { statusCode: 300, body: responseBody, }; - sinon.stub(httpClient, "request").callsArgWith(3, null, response); // stub smapi request - skillMetaController.enableSkill((err, res) => { + sinon.stub(httpClient, "request").callsArgWith(3, response); // stub smapi request + await skillMetaController.enableSkill((err, res) => { // verify expect(err).equal(jsonView.toString(responseBody)); expect(res).equal(undefined); - done(); }); }); - it("| when skill already enabled, can callback skip enablement message", (done) => { + it("| when skill already enabled, can callback skip enablement message", async () => { // setup const response = { statusCode: 200, }; sinon.stub(httpClient, "request").callsArgWith(3, null, response); // stub smapi request sinon.stub(Messenger.getInstance(), "info"); - skillMetaController.enableSkill((err, res) => { + await skillMetaController.enableSkill((err, res) => { // verify expect(err).equal(undefined); expect(res).equal(undefined); - expect(Messenger.getInstance().info.args[0][0]).equal("Skill is already enabled, skipping the enable process.\n"); - done(); + expect(Messenger.getInstance().info.args[0][0]).equal("The skill is already enabled, skipping skill enablement.\n"); }); }); - it("| when skill is not enabled, can callback error when enable skill fail", (done) => { + it("| when skill is not enabled, can callback error when enable skill fail", async () => { // setup const getEnablementResponse = { statusCode: 404, body: {}, }; - sinon.stub(httpClient, "request").withArgs(sinon.match.any, "get-skill-enablement").callsArgWith(3, null, getEnablementResponse); // stub smapi request + const httpClientRequestStub = sinon.stub(httpClient, "request"); + httpClientRequestStub.withArgs(sinon.match.any, "get-skill-enablement").callsArgWith(3, getEnablementResponse); // stub smapi request + httpClientRequestStub.withArgs(sinon.match.any, "enable-skill").callsArgWith(3, "enableSkillError"); // stub smapi request - httpClient.request.withArgs(sinon.match.any, "enable-skill").callsArgWith(3, "enableSkillError"); // stub smapi request - - skillMetaController.enableSkill((err, res) => { + await skillMetaController.enableSkill((err, res) => { // verify expect(err).equal("enableSkillError"); expect(res).equal(undefined); - done(); }); }); - it("| when skill is not enabled, can callback error when statusCode >= 300", (done) => { + it("| when skill is not enabled, can callback error when statusCode >= 300", async () => { // setup const getEnablementResponse = { statusCode: 404, body: {}, + Message: "not found", }; const enableSkillResponseBody = { Message: "somehow fail", @@ -338,20 +359,20 @@ describe("Controller test - skill metadata controller test", () => { const enableSkillResponse = { statusCode: 300, body: enableSkillResponseBody, + Message: enableSkillResponseBody.Message, }; - sinon.stub(httpClient, "request").withArgs(sinon.match.any, "get-skill-enablement").callsArgWith(3, null, getEnablementResponse); // stub smapi request + const httpClientRequestStub = sinon.stub(httpClient, "request"); + httpClientRequestStub.withArgs(sinon.match.any, "get-skill-enablement").callsArgWith(3, getEnablementResponse); // stub smapi request + httpClientRequestStub.withArgs(sinon.match.any, "enable-skill").callsArgWith(3, enableSkillResponse); // stub smapi request - httpClient.request.withArgs(sinon.match.any, "enable-skill").callsArgWith(3, null, enableSkillResponse); // stub smapi request - - skillMetaController.enableSkill((err, res) => { + await skillMetaController.enableSkill((err, res) => { // verify expect(err).equal(jsonView.toString(enableSkillResponseBody)); expect(res).equal(undefined); - done(); }); }); - it("| when skill is not enabled, can callback success enable skill message", (done) => { + it("| when skill is not enabled, can callback success enable skill message", async () => { // setup const getEnablementResponse = { statusCode: 404, @@ -361,16 +382,15 @@ describe("Controller test - skill metadata controller test", () => { statusCode: 200, }; sinon.stub(Messenger.getInstance(), "info"); - sinon.stub(httpClient, "request").withArgs(sinon.match.any, "get-skill-enablement").callsArgWith(3, null, getEnablementResponse); // stub smapi request + sinon.stub(httpClient, "request").withArgs(sinon.match.any, "get-skill-enablement").callsArgWith(3, getEnablementResponse, null); httpClient.request.withArgs(sinon.match.any, "enable-skill").callsArgWith(3, null, enableSkillResponse); // stub smapi request - skillMetaController.enableSkill((err, res) => { + await skillMetaController.enableSkill((err, res) => { // verify expect(err).equal(undefined); expect(res).equal(undefined); - expect(Messenger.getInstance().info.args[0][0]).equal("Skill is enabled successfully.\n"); - done(); + expect(Messenger.getInstance().info.args[0][0]).equal("The skill has been enabled.\n"); }); }); }); @@ -380,6 +400,7 @@ describe("Controller test - skill metadata controller test", () => { beforeEach(() => { skillMetaController = new SkillMetadataController(TEST_CONFIGURATION); + sinon.stub(ResourcesConfig.prototype, "write").returns(""); }); @@ -1107,6 +1128,7 @@ describe("Controller test - skill metadata controller test", () => { it("| poll status retries with getImportStatus warnings, expects warnings logged once", (done) => { // setup + sinon.useFakeTimers().tickAsync(CONSTANTS.CONFIGURATION.RETRY.MAX_RETRY_INTERVAL); requestStub .onCall(0) .callsArgWith(3, null, smapiImportStatusResponseWithWarningsInProgress) @@ -1376,6 +1398,7 @@ describe("Controller test - skill metadata controller test", () => { it("| poll import status with multiple retries, expect callback with correct response", (done) => { // setup + sinon.useFakeTimers().tickAsync(CONSTANTS.CONFIGURATION.RETRY.MAX_RETRY_INTERVAL); requestStub .onCall(0) .callsArgWith(3, null, smapiImportStatusResponseInProgress) @@ -1427,6 +1450,7 @@ describe("Controller test - skill metadata controller test", () => { it("| poll import status with getSkillStatus build failures", (done) => { // setup + sinon.useFakeTimers().tickAsync(CONSTANTS.CONFIGURATION.RETRY.MAX_RETRY_INTERVAL); requestStub .onCall(0) .callsArgWith(3, null, smapiImportStatusResponseInProgress) @@ -1448,6 +1472,7 @@ describe("Controller test - skill metadata controller test", () => { it("| poll status smapi calls return success, expect GetSkillStatus calls", (done) => { // setup + sinon.useFakeTimers().tickAsync(CONSTANTS.CONFIGURATION.RETRY.MAX_RETRY_INTERVAL); requestStub .onCall(0) .callsArgWith(3, null, smapiImportStatusResponseInProgress) @@ -1468,6 +1493,7 @@ describe("Controller test - skill metadata controller test", () => { it("| poll status smapi calls return empty SkillID, expect no GetSkillStatus calls", (done) => { // setup + sinon.useFakeTimers().tickAsync(CONSTANTS.CONFIGURATION.RETRY.MAX_RETRY_INTERVAL); requestStub .onCall(0) .callsArgWith(3, null, smapiImportStatusResponse200EmptySkillID) @@ -1589,7 +1615,7 @@ describe("Controller test - skill metadata controller test", () => { it("| update manifest callback with error when poll skill status fails", (done) => { // setup sinon.stub(httpClient, "request").callsArgWith(3, null, {}); - sinon.stub(SkillMetadataController.prototype, "_pollSkillManifestStatus").callsArgWith(2, "TEST_ERROR"); + sinon.stub(SkillMetadataController.prototype, "_pollSkillManifestStatus").callsArgWith(1, "TEST_ERROR"); // call skillMetaController.updateSkillManifest((err, res) => { @@ -1611,7 +1637,7 @@ describe("Controller test - skill metadata controller test", () => { }, }; - sinon.stub(SkillMetadataController.prototype, "_pollSkillManifestStatus").callsArgWith(2, undefined, pollResponse); + sinon.stub(SkillMetadataController.prototype, "_pollSkillManifestStatus").callsArgWith(1, undefined, pollResponse); sinon.stub(httpClient, "request").callsArgWith(3, null, {}); // call @@ -1634,7 +1660,7 @@ describe("Controller test - skill metadata controller test", () => { }, }; - sinon.stub(SkillMetadataController.prototype, "_pollSkillManifestStatus").callsArgWith(2, undefined, pollResponse); + sinon.stub(SkillMetadataController.prototype, "_pollSkillManifestStatus").callsArgWith(1, undefined, pollResponse); sinon.stub(httpClient, "request").callsArgWith(3, null, {}); // call diff --git a/test/unit/fixture/model/regular-proj/.ask/ask-states.json b/test/unit/fixture/model/regular-proj/.ask/ask-states.json index 3307a494..3d74fd7f 100644 --- a/test/unit/fixture/model/regular-proj/.ask/ask-states.json +++ b/test/unit/fixture/model/regular-proj/.ask/ask-states.json @@ -5,7 +5,9 @@ "skillId": "amzn1.ask.skill.1234567890", "skillMetadata": { "lastDeployHash": "hash==", - "lastDeployType": "interaction-model" + "lastDeployType": "interaction-model", + "lastImportId": "amzn1.ask-package.import.123abc", + "lastImportTimestamp": "2023-11-21T04:01:31.047Z" }, "code": { "default": { @@ -16,7 +18,8 @@ }, "NA": { "lastDeployHash": "hash==" - } + }, + "lastDeployTimestamp": "2023-11-21T03:07:07.820Z" }, "skillInfrastructure": { "@ask-cli/cfn-deployer": { @@ -47,7 +50,8 @@ } } } - } + }, + "deploymentStatus": "COMPLETE" } } } \ No newline at end of file diff --git a/test/unit/model/manifest-test.js b/test/unit/model/manifest-test.js index a9663acb..c3190fa8 100644 --- a/test/unit/model/manifest-test.js +++ b/test/unit/model/manifest-test.js @@ -211,5 +211,37 @@ describe("Model test - manifest file test", () => { Manifest.dispose(); }); }); + + describe("# verify function hasIconFileUri", () => { + it("| icon https uri, expect false", () => { + new Manifest(MANIFEST_FILE); + Manifest.getInstance().setPublishingLocales({ + "en-US": { + name: "skillName", + summary: "one sentence description", + description: "skill description", + smallIconUri: "https://some.url.com/images/en-US_smallIcon.png", + largeIconUri: "https://some.url.com/images/en-US_largeIconUri.png", + }, + }); + expect(Manifest.getInstance().hasIconFileUri()).equal(false); + Manifest.dispose(); + }); + + it("| icon file uri relative to skill package assets, expect true", () => { + new Manifest(MANIFEST_FILE); + Manifest.getInstance().setPublishingLocales({ + "en-US": { + name: "skillName", + summary: "one sentence description", + description: "skill description", + smallIconUri: "file://assets/images/en-US_smallIcon.png", + largeIconUri: "file://assets/images/en-US_largeIconUri.png", + }, + }); + expect(Manifest.getInstance().hasIconFileUri()).equal(true); + Manifest.dispose(); + }); + }); }); }); diff --git a/test/unit/model/resources-config/resources-config-test.js b/test/unit/model/resources-config/resources-config-test.js index a1208a34..9109397e 100644 --- a/test/unit/model/resources-config/resources-config-test.js +++ b/test/unit/model/resources-config/resources-config-test.js @@ -155,6 +155,18 @@ describe("Model test - resources config test", () => { newValue: "skillId new", oldValue: TEST_ASK_STATES.profiles[TEST_PROFILE].skillId, }, + { + field: "LastImportId", + params: [TEST_PROFILE], + newValue: "LastImportId new", + oldValue: TEST_ASK_STATES.profiles[TEST_PROFILE].skillMetadata.lastImportId, + }, + { + field: "LastImportTimestamp", + params: [TEST_PROFILE], + newValue: "LastImportTimestamp new", + oldValue: TEST_ASK_STATES.profiles[TEST_PROFILE].skillMetadata.lastImportTimestamp, + }, { field: "SkillMetaSrc", params: [TEST_PROFILE], @@ -167,6 +179,18 @@ describe("Model test - resources config test", () => { newValue: "==hash", oldValue: TEST_ASK_STATES.profiles[TEST_PROFILE].skillMetadata.lastDeployHash, }, + { + field: "CodeLastDeployTimestamp", + params: [TEST_PROFILE], + newValue: "CodeLastDeployTimestamp new", + oldValue: TEST_ASK_STATES.profiles[TEST_PROFILE].code.lastDeployTimestamp, + }, + { + field: "DeploymentStatus", + params: [TEST_PROFILE], + newValue: "deploymentStatus new", + oldValue: TEST_ASK_STATES.profiles[TEST_PROFILE].deploymentStatus, + }, ].forEach(({field, params, newValue, oldValue}) => { it(`| test get${field} function successfully`, () => { expect(ResourcesConfig.getInstance()[`get${field}`](...params)).deep.equal(oldValue); diff --git a/test/unit/view/messenger-test.js b/test/unit/view/messenger-test.js index 38951a6d..76be0af4 100644 --- a/test/unit/view/messenger-test.js +++ b/test/unit/view/messenger-test.js @@ -4,11 +4,13 @@ const chalk = require("chalk"); const fs = require("fs"); const path = require("path"); const Messenger = require("../../../lib/view/messenger"); +const jsonView = require("../../../lib/view/json-view"); describe("View test - messenger file test", () => { const TEST_MESSAGE = "TEST_MESSAGE"; + const TEST_OBJECT = { foo: 1, bar: 2 }; + const TEST_ERROR = new Error("TEST_ERROR"); const TEST_TIME = "TEST_TIME"; - const TEST_ERROR_OBJ = new Error("TEST_ERROR"); describe("# inspect correctness for constructor, getInstance and dispose", () => { beforeEach(() => { @@ -130,6 +132,42 @@ describe("View test - messenger file test", () => { expect(stub.args[0][0]).equal(chalk`{bold.yellow [Warn]: ${TEST_MESSAGE}}`); }); + it("| warn function correctly push stringify object to buffer and display", () => { + const stub = sinon.stub(console, "warn"); + const expectedMessage = jsonView.toString(TEST_OBJECT); + const expectedItem = { + time: TEST_TIME, + operation: "WARN", + level: 40, + msg: expectedMessage, + }; + + // call + Messenger.getInstance().warn(TEST_OBJECT); + + // verify + expect(Messenger.getInstance()._buffer[0]).deep.equal(expectedItem); + expect(stub.args[0][0]).equal(chalk`{bold.yellow [Warn]: ${expectedMessage}}`); + }); + + it("| warn function correctly push error message to buffer and display", () => { + const stub = sinon.stub(console, "warn"); + const expectedMessage = TEST_ERROR.message; + const expectedItem = { + time: TEST_TIME, + operation: "WARN", + level: 40, + msg: expectedMessage, + }; + + // call + Messenger.getInstance().warn(TEST_ERROR); + + // verify + expect(Messenger.getInstance()._buffer[0]).deep.equal(expectedItem); + expect(stub.args[0][0]).equal(chalk`{bold.yellow [Warn]: ${expectedMessage}}`); + }); + it("| error function correctly push message to buffer and display", () => { const stub = sinon.stub(console, "error"); const expectedItem = { @@ -147,6 +185,42 @@ describe("View test - messenger file test", () => { expect(stub.args[0][0]).equal(chalk`{bold.red [Error]: ${TEST_MESSAGE}}`); }); + it("| error function correctly push stringify object to buffer and display", () => { + const stub = sinon.stub(console, "error"); + const expectedMessage = jsonView.toString(TEST_OBJECT); + const expectedItem = { + time: TEST_TIME, + operation: "ERROR", + level: 50, + msg: expectedMessage, + }; + + // call + Messenger.getInstance().error(TEST_OBJECT); + + // verify + expect(Messenger.getInstance()._buffer[0]).deep.equal(expectedItem); + expect(stub.args[0][0]).equal(chalk`{bold.red [Error]: ${expectedMessage}}`); + }); + + it("| error function correctly push error message to buffer and display", () => { + const stub = sinon.stub(console, "error"); + const expectedMessage = TEST_ERROR.message; + const expectedItem = { + time: TEST_TIME, + operation: "ERROR", + level: 50, + msg: expectedMessage, + }; + + // call + Messenger.getInstance().error(TEST_ERROR); + + // verify + expect(Messenger.getInstance()._buffer[0]).deep.equal(expectedItem); + expect(stub.args[0][0]).equal(chalk`{bold.red [Error]: ${expectedMessage}}`); + }); + it("| fatal function correctly push message to buffer and display", () => { const stub = sinon.stub(console, "error"); const expectedItem = { @@ -166,19 +240,20 @@ describe("View test - messenger file test", () => { it("| fatal function correctly push error stack to buffer and display", () => { const stub = sinon.stub(console, "error"); + const expectedMessage = TEST_ERROR.stack.substring(7); const expectedItem = { time: TEST_TIME, operation: "FATAL", level: 60, - msg: TEST_ERROR_OBJ.stack.substring(7), + msg: expectedMessage, }; // call - Messenger.getInstance().fatal(TEST_ERROR_OBJ); + Messenger.getInstance().fatal(TEST_ERROR); // verify expect(Messenger.getInstance()._buffer[0]).deep.equal(expectedItem); - expect(stub.args[0][0]).equal(chalk`{bold.rgb(128, 0, 0) [Fatal]: ${TEST_ERROR_OBJ.stack.substring(7)}}`); + expect(stub.args[0][0]).equal(chalk`{bold.rgb(128, 0, 0) [Fatal]: ${expectedMessage}}`); }); it("| trace function correctly push message to buffer and write to file with complete message", () => { @@ -204,7 +279,7 @@ describe("View test - messenger file test", () => { statusMessage: TEST_STATUS_MESSAGE, headers: TEST_HEADERS, }, - error: "TEST_ERROR", + error: TEST_ERROR, "request-id": TEST_REQUEST_ID, body: TEST_BODY, };