diff --git a/.codebuild/release_workflow.yml b/.codebuild/release_workflow.yml index e358275ac..e7d6b7857 100644 --- a/.codebuild/release_workflow.yml +++ b/.codebuild/release_workflow.yml @@ -18,10 +18,6 @@ batch: buildspec: .codebuild/test.yml depend-on: - build_linux - - identifier: lint - buildspec: .codebuild/lint.yml - depend-on: - - build_linux - identifier: verify_api_extract buildspec: .codebuild/verify_api_extract.yml depend-on: diff --git a/package.json b/package.json index 384b9f553..cb72ab0d6 100644 --- a/package.json +++ b/package.json @@ -33,12 +33,16 @@ "refresh-lockfile": "rimraf yarn.lock && yarn", "extract-api": "lerna run extract-api", "verify-api-extract": "yarn extract-api && ./scripts/verify-extract-api.sh", - "trigger-release": "source ./scripts/cloud-release.sh && release", + "trigger-release": "source ./scripts/cloud-release.sh && triggerRelease", + "trigger-tag-release": "source ./scripts/cloud-release.sh && triggerTagRelease", "view-test-artifact": "./scripts/view-test-artifacts.sh", "cleanup-stale-resources": "source ./scripts/cloud-utils.sh && cleanupStaleResources", "cloud-e2e": "source scripts/cloud-utils.sh && cloudE2E", "cloud-e2e-beta": "source scripts/cloud-utils.sh && cloudE2EBeta", - "split-e2e-tests": "yarn ts-node ./scripts/split-e2e-tests.ts && git add .codebuild/e2e_workflow.yml" + "split-e2e-tests": "yarn ts-node ./scripts/split-e2e-tests.ts && git add .codebuild/e2e_workflow.yml", + "view-test-artifacts": "yarn ts-node ./scripts/view-test-artifacts.ts", + "generate-debug-e2e-spec": "./scripts/generate-debug-spec-for-failed-e2e-tests.sh", + "cloud-e2e-debug": "source scripts/cloud-utils.sh && cloudE2EDebug" }, "bugs": { "url": "https://github.com/aws-amplify/amplify-codegen/issues" @@ -71,11 +75,16 @@ "@commitlint/config-conventional": "^17.0.3", "@commitlint/config-lerna-scopes": "^17.0.2", "@microsoft/api-extractor": "^7.33.5", + "@types/cli-progress": "3.11.0", + "@types/fs-extra": "^8.0.1", + "@types/glob": "^7.2.0", "@types/jest": "^27.0.0", "@types/js-yaml": "^4.0.0", "@typescript-eslint/eslint-plugin": "^4.0.0", "@typescript-eslint/parser": "^4.0.0", "amplify-headless-interface": "^1.13.1", + "aws-sdk": "2.1414.0", + "cli-progress": "3.12.0", "cmd-shim": "^3.0.3", "codecov": "^3.7.0", "commitizen": "^4.2.4", @@ -92,6 +101,7 @@ "eslint-plugin-prettier": "^3.1.2", "eslint-plugin-react": "^7.21.5", "eslint-plugin-spellcheck": "^0.0.17", + "execa": "^5.1.1", "glob": "^7.1.6", "graphql-transformer-core": "^8.0.0", "husky": "^3.0.3", @@ -106,8 +116,7 @@ "rimraf": "^3.0.0", "ts-jest": "^27.0.0", "ts-node": "^8.10.1", - "typescript": "4.7.4", - "execa": "^5.1.1" + "typescript": "4.7.4" }, "resolutions": { "@aws-amplify/amplify-cli-core": "4.0.4", diff --git a/scripts/cloud-release.sh b/scripts/cloud-release.sh index f35eb7dc2..724644361 100644 --- a/scripts/cloud-release.sh +++ b/scripts/cloud-release.sh @@ -4,8 +4,19 @@ export RELEASE_ROLE_NAME=CodebuildDeveloper export RELEASE_PROFILE_NAME=AmplifyAPIPluginRelease export RELEASE_PROJECT_NAME=amplify-codegen-release-workflow -function release { +function triggerRelease { + triggerProjectBatch $RELEASE_ACCOUNT_PROD $RELEASE_ROLE_NAME "${RELEASE_PROFILE_NAME}Prod" $RELEASE_PROJECT_NAME "release" +} + +function triggerTagRelease { branch_name=$(git branch --show-current) - echo "Running release workflow from branch ${branch_name}" + echo "Running tag release workflow from branch ${branch_name}" + + git fetch origin + if [ $(git rev-parse HEAD) != $(git rev-parse origin/${branch_name}) ] + then + echo "You have local commits on branch ${branch_name} that are not pushed to origin. Push them before running the tag release workflow." + exit 1 + fi triggerProjectBatch $RELEASE_ACCOUNT_PROD $RELEASE_ROLE_NAME "${RELEASE_PROFILE_NAME}Prod" $RELEASE_PROJECT_NAME $branch_name } diff --git a/scripts/cloud-utils.sh b/scripts/cloud-utils.sh index 7d1a702bb..7be28a7cb 100644 --- a/scripts/cloud-utils.sh +++ b/scripts/cloud-utils.sh @@ -85,3 +85,30 @@ function cleanupStaleResources { TARGET_BRANCH=$CURR_BRANCH triggerProject $E2E_ACCOUNT_PROD $CLEANUP_ROLE_NAME $CLEANUP_PROFILE_NAME $CLEANUP_PROJECT_NAME $TARGET_BRANCH } + +function triggerProjectBatchWithDebugSession { + account_number=$1 + role_name=$2 + profile_name=$3 + project_name=$4 + target_branch=$5 + authenticate $account_number $role_name $profile_name + echo AWS Account: $account_number + echo Project: $project_name + echo Target Branch: $target_branch + RESULT=$(aws codebuild start-build-batch --region=$REGION --profile="${profile_name}" --project-name $project_name --source-version=$target_branch \ + --debug-session-enabled \ + --buildspec-override "codebuild_specs/debug_workflow.yml" \ + --environment-variables-override name=BRANCH_NAME,value=$target_branch,type=PLAINTEXT \ + --query 'buildBatch.id' --output text) + echo "https://$REGION.console.aws.amazon.com/codesuite/codebuild/$account_number/projects/$project_name/batch/$RESULT?region=$REGION" +} + +function cloudE2EDebug { + echo Running Prod E2E Test Suite + E2E_ROLE_NAME=CodebuildDeveloper + E2E_PROFILE_NAME=AmplifyAPIE2EProd + E2E_PROJECT_NAME=amplify-category-api-e2e-workflow + TARGET_BRANCH=$CURR_BRANCH + triggerProjectBatchWithDebugSession $E2E_ACCOUNT_PROD $E2E_ROLE_NAME $E2E_PROFILE_NAME $E2E_PROJECT_NAME $TARGET_BRANCH +} diff --git a/scripts/generate-debug-spec-for-failed-e2e-tests.sh b/scripts/generate-debug-spec-for-failed-e2e-tests.sh new file mode 100644 index 000000000..4c0464adb --- /dev/null +++ b/scripts/generate-debug-spec-for-failed-e2e-tests.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +source ./scripts/cloud-utils.sh + +function generatedDebugSpecForFailedTests { + # Check if an batch build name is provided + if [ $# -eq 0 ]; then + echo "Please provide the batch build id of codebuild" + exit 1 + fi + # Get temporary access for the account + E2E_ROLE_NAME=CodebuildDeveloper + E2E_PROFILE_NAME=AmplifyAPIE2EProd + authenticate $E2E_ACCOUNT_PROD $E2E_ROLE_NAME "$E2E_PROFILE_NAME" + local batch_build_id=$1 + echo "Getting failed test suites" + failed_tests=$(aws codebuild batch-get-build-batches --profile="$E2E_PROFILE_NAME" --ids "$batch_build_id" --region us-east-1 --query 'buildBatches[0].buildGroups' | jq -c '.[] | select(.currentBuildSummary.buildStatus == "FAILED").identifier') + if [ -z "$failed_tests" ]; then + echo "No failed tests found in batch $1" + exit 0 + fi + echo $failed_tests | xargs yarn ts-node ./scripts/split-e2e-tests-codebuild.ts --debug + echo "" + echo "Next steps:" + echo "- add 'codebuild-breakpoint' to desired location in build specs or shared scripts" + echo "- git commit and push your changes" + echo "- run command 'yarn cloud-e2e-debug'" +} + +generatedDebugSpecForFailedTests "$@" diff --git a/scripts/split-e2e-tests.ts b/scripts/split-e2e-tests.ts index d072c7948..7a0083b59 100644 --- a/scripts/split-e2e-tests.ts +++ b/scripts/split-e2e-tests.ts @@ -21,18 +21,20 @@ const REPO_ROOT = join(__dirname, '..'); const TEST_TIMINGS_PATH = join(REPO_ROOT, 'scripts', 'test-timings.data.json'); const CODEBUILD_CONFIG_BASE_PATH = join(REPO_ROOT, '.codebuild', 'e2e_workflow_base.yml'); const CODEBUILD_GENERATE_CONFIG_PATH = join(REPO_ROOT, '.codebuild', 'e2e_workflow.yml'); +const CODEBUILD_DEBUG_CONFIG_PATH = join (REPO_ROOT, 'codebuild_specs', 'debug_workflow.yml'); const RUN_SOLO = []; const EXCLUDE_TESTS = [ 'src/__tests__/build-app-swift.test.ts', 'src/__tests__/build-app-android.test.ts', ]; +const DEBUG_FLAG = '--debug'; export function loadConfigBase() { return yaml.load(fs.readFileSync(CODEBUILD_CONFIG_BASE_PATH, 'utf8')); } -export function saveConfig(config: any): void { +export function saveConfig(config: any, outputPath: string): void { const output = ['# auto generated file. DO NOT EDIT manually', yaml.dump(config, { noRefs: true })]; - fs.writeFileSync(CODEBUILD_GENERATE_CONFIG_PATH, output.join('\n')); + fs.writeFileSync(outputPath, output.join('\n')); } export function loadTestTimings(): { timingData: { test: string; medianRuntime: number }[] } { return JSON.parse(fs.readFileSync(TEST_TIMINGS_PATH, 'utf-8')); @@ -174,6 +176,7 @@ const splitTests = ( }; function main(): void { + const filteredTests = process.argv.slice(2); const configBase: any = loadConfigBase(); const baseBuildGraph = configBase.batch['build-graph']; const splitE2ETests = splitTests( @@ -189,19 +192,30 @@ function main(): void { (testSuites) => testSuites.filter((ts) => !EXCLUDE_TESTS.includes(ts)), ); + let outputPath = CODEBUILD_GENERATE_CONFIG_PATH; let allBuilds = [...splitE2ETests]; + if (filteredTests.length > 0) { + allBuilds = allBuilds.filter(build => filteredTests.includes(build.identifier)); + if (filteredTests.includes(DEBUG_FLAG)) { + allBuilds = allBuilds.map(build => { + return { ...build, 'debug-session': true} + }); + outputPath = CODEBUILD_DEBUG_CONFIG_PATH; + } + } const cleanupResources = { identifier: 'cleanup_e2e_resources', buildspec: '.codebuild/cleanup_e2e_resources.yml', env: { 'compute-type': 'BUILD_GENERAL1_MEDIUM' }, - 'depend-on': [allBuilds[0].identifier] + 'depend-on': allBuilds.length > 0 ? [allBuilds[0].identifier] : 'publish_to_local_registry', } console.log(`Total number of splitted jobs: ${allBuilds.length}`) let currentBatch = [...baseBuildGraph, ...allBuilds, cleanupResources]; configBase.batch['build-graph'] = currentBatch; - saveConfig(configBase); + saveConfig(configBase, outputPath); + console.log(`Successfully generated the buildspec at ${outputPath}`); } main(); diff --git a/scripts/view-test-artifacts.ts b/scripts/view-test-artifacts.ts new file mode 100644 index 000000000..461075e45 --- /dev/null +++ b/scripts/view-test-artifacts.ts @@ -0,0 +1,189 @@ +/** + * Usage: `yarn view-test-artifacts ` + * + * N.B. It is important to have your local environment configured for the correct codebuild account before running the script. + * This script caches resources, but in the case the local resource state is out of sync, you may need to wipe the asset directory + * that is printed when the script begins. + */ + +import * as process from 'process'; +import * as path from 'path'; +import * as os from 'os'; +import * as fs from 'fs-extra'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { CodeBuild, S3 } from 'aws-sdk'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { SingleBar, Presets } from 'cli-progress'; +import * as execa from 'execa'; + +const s3 = new S3(); +const progressBar = new SingleBar({}, Presets.shades_classic); + +type BuildStatus = 'FAILED' | 'FAULT' | 'IN_PROGRESS' | 'STOPPED' | 'SUCCEEDED' | 'TIMED_OUT'; + +const buildStatusToIcon: Record = { + FAILED: '❌', + FAULT: '🚫', + IN_PROGRESS: '🏃', + STOPPED: '➖', + SUCCEEDED: '✅', + TIMED_OUT: '⏰', +}; + +/** + * Type modelling info we need to retrieve and display test artifacts in the UI. + */ +type TestArtifact = { + jobName: string; + buildStatus: BuildStatus; + artifactLocation?: string; +}; + +/** + * Utility method to filter out incomplete test artifact definitions. + * @param artifact the potentially incomplete artifact to validate + * @returns whether the artifact is complete or not + */ +const testArtifactIsComplete = (artifact: Partial): artifact is TestArtifact => artifact.jobName !== undefined; + +const generateIndexFile = (directory: string, artifacts: TestArtifact[]): void => { + const createArtifactRow = (artifact: TestArtifact): string => ` + ${artifact.jobName} + ${buildStatusToIcon[artifact.buildStatus]}[${artifact.buildStatus}] + ${artifact.artifactLocation ? `Assets` : ''} + `; + + const fileContents = ` + + Test Artifacts + + + +

Test Artifact Directory

+ + + + + + + ${artifacts.map(createArtifactRow).join('\n')} +
Job NameBuild StatusAssets
+ +`; + fs.writeFileSync(path.join(directory, 'index.html'), fileContents); +}; + +/** + * Given a codebuild batch id, download all the builds for that batch, and return the batch name, build status, and artifact location. + * @param batchId the batch to look up. + */ +const retrieveArtifactsForBatch = async (batchId: string): Promise => { + const codeBuild = new CodeBuild({ region: 'us-east-1' }); + const { buildBatches } = await codeBuild.batchGetBuildBatches({ ids: [batchId] }).promise(); + return (buildBatches || []) + .flatMap((batch) => + (batch.buildGroups || []).map( + (buildGroup) => + ({ + jobName: buildGroup.identifier, + buildStatus: buildGroup.currentBuildSummary?.buildStatus, + artifactLocation: buildGroup.currentBuildSummary?.primaryArtifact?.location, + } as Partial), + ), + ) + .filter(testArtifactIsComplete); +}; + +const downloadSingleTestArtifact = async (tempDir: string, artifact: Required): Promise => { + const artifactDownloadPath = path.join(tempDir, artifact.jobName); + fs.mkdirSync(artifactDownloadPath); + const [Bucket, ...rest] = artifact.artifactLocation.split(':::')[1].split('/'); + const Prefix = rest.join('/'); + const listObjectsResponse = await s3.listObjects({ Bucket, Prefix }).promise(); + + const hasKey = (x: any): x is { Key: string } => x.Key !== undefined; + + if (!listObjectsResponse.Contents) { + throw new Error('Expected results'); + } + + return Promise.all( + listObjectsResponse.Contents.filter(hasKey).map(({ Key }) => { + const filePath = path.join(artifactDownloadPath, Key.split('/').pop()!); + return new Promise((resolve, reject) => { + const writer = fs.createWriteStream(filePath); + s3.getObject({ Bucket, Key }).createReadStream().pipe(writer); + writer.on('finish', resolve); + writer.on('close', resolve); + writer.on('error', reject); + }); + }), + ); +}; + +/** + * Given a list of test artifacts, including s3 arns, download each bucket contents to a newly created local temp directory. + * Return the root path of this temp directory as output. + * @param tempDir the temp directory to use for the artifacts to retrieve and download + * @param artifacts the artifacts to retrieve and download + */ +const downloadTestArtifacts = async (tempDir: string, artifacts: Required[]): Promise => { + progressBar.start(artifacts.length, 0); + await Promise.all( + artifacts.map(async (artifact) => { + await downloadSingleTestArtifact(tempDir, artifact); + progressBar.increment(); + return; + }), + ); + progressBar.stop(); +}; + +const inspectableStates = new Set(['FAILED', 'FAULT', 'TIMED_OUT']); + +/** + * Explicitly remove artifact from assets we don't want to download. + */ +const convertToArtifactForDownload = (artifact: TestArtifact): TestArtifact => + inspectableStates.has(artifact.buildStatus) + ? artifact + : { + jobName: artifact.jobName, + buildStatus: artifact.buildStatus, + }; + +const constructLocalState = async (dir: string, buildId: string): Promise => { + const artifacts = await retrieveArtifactsForBatch(buildId); + const testsWithNonDownloadedArtifactsStripped = artifacts.map(convertToArtifactForDownload); + generateIndexFile(dir, testsWithNonDownloadedArtifactsStripped); + const buildsWithArtifacts = testsWithNonDownloadedArtifactsStripped.filter( + (artifact) => artifact.artifactLocation, + ) as Required[]; + return downloadTestArtifacts(dir, buildsWithArtifacts); +}; + +const main = async (buildId: string): Promise => { + try { + if (!buildId || buildId.length === 0) { + throw new Error('Codebuild Batch Build Id is required as input'); + } + const assetDir = path.join(os.tmpdir(), 'test-artifacts', buildId.replace(':', '')); + console.log(`Will download and serve assets from: ${assetDir}`); + fs.removeSync(assetDir); + console.log('Retrieving and Downloading assets'); + fs.mkdirSync(assetDir, { recursive: true }); + await constructLocalState(assetDir, buildId); + await execa('npx', ['http-server', assetDir], { stdio: 'inherit' }); + } catch (e) { + console.error(e); + process.exit(1); + } + process.exit(0); +}; + +// eslint-disable-next-line @typescript-eslint/no-floating-promises +main(process.argv[2]); diff --git a/yarn.lock b/yarn.lock index ecaa6c776..ad6729852 100644 --- a/yarn.lock +++ b/yarn.lock @@ -55,29 +55,11 @@ winston "^3.3.3" winston-daily-rotate-file "^4.5.0" -"@aws-amplify/amplify-cli-logger@1.3.3": - version "1.3.3" - resolved "https://registry.npmjs.org/@aws-amplify/amplify-cli-logger/-/amplify-cli-logger-1.3.3.tgz#d50d006f71b1a8f9e6bfe71f8e691c96d307aa04" - integrity sha512-GTaTMu6p5xJqimiCuzv0NDdx7/APV5YgOFtpX6GQoTIJ7jjCMB1MmKyfUKrt843ATQpfZ0ClokkyGJlzgMvYzw== - dependencies: - winston "^3.3.3" - winston-daily-rotate-file "^4.5.0" - "@aws-amplify/amplify-cli-shared-interfaces@1.2.2": version "1.2.2" resolved "https://registry.npmjs.org/@aws-amplify/amplify-cli-shared-interfaces/-/amplify-cli-shared-interfaces-1.2.2.tgz#e717ef421379837519ed6cba42226874574fe505" integrity sha512-iZZAhfPUBRZr5b4S5YnpN98oYQfZSMMxo0J/fpDQ7mh3CFOGdWcg6vIU3M9tqGZWUNYi3P0MkzreOgDE+9yJ6A== -"@aws-amplify/amplify-cli-shared-interfaces@1.2.3": - version "1.2.3" - resolved "https://registry.npmjs.org/@aws-amplify/amplify-cli-shared-interfaces/-/amplify-cli-shared-interfaces-1.2.3.tgz#01afc1508e11faadeb5d45298e8b5c486dc272b0" - integrity sha512-c/c82OMAFZvgjkfeMFE/h1ycqC7218IfeVNLN7rVGMS98hRs810zRXvFc1w8uI+zwUiDV8+bzAuzODqt5aC9iA== - -"@aws-amplify/amplify-function-plugin-interface@1.11.0": - version "1.11.0" - resolved "https://registry.npmjs.org/@aws-amplify/amplify-function-plugin-interface/-/amplify-function-plugin-interface-1.11.0.tgz#f09bbfdd16677c35e8455a9cb7b0cb658f58a7bc" - integrity sha512-X0Ywl6zBd54XOiWDGakaoCKogTtU7wR+s+8egmQuBMYJK/kW+apvyPGI7wdXGommwXYs1Hs1vr61V+h/+Rbfig== - "@aws-amplify/amplify-prompts@2.6.8": version "2.6.8" resolved "https://registry.npmjs.org/@aws-amplify/amplify-prompts/-/amplify-prompts-2.6.8.tgz#9f5975ffa76d4ea3187b053f39c0d99e96d0d342" @@ -85,15 +67,6 @@ dependencies: amplify-prompts "2.6.8" -"@aws-amplify/amplify-prompts@2.8.0": - version "2.8.0" - resolved "https://registry.npmjs.org/@aws-amplify/amplify-prompts/-/amplify-prompts-2.8.0.tgz#b8ce0a4242a4277c58cbf8a30ffb89546568bc22" - integrity sha512-tc0iVyAYNC+nSQaGs5dYIytpfaD3/Dv27tIMis+skzBPLQYd9BwxF6YlpnayspaksxIITPEzCusZKyg3iXZB7w== - dependencies: - "@aws-amplify/amplify-cli-shared-interfaces" "1.2.3" - chalk "^4.1.1" - enquirer "^2.3.6" - "@aws-amplify/analytics@6.3.2": version "6.3.2" resolved "https://registry.npmjs.org/@aws-amplify/analytics/-/analytics-6.3.2.tgz#22d59edcd3d4b89321190b637118e01f1653a44f" @@ -231,7 +204,7 @@ dependencies: graphql "^15.5.0" -"@aws-amplify/graphql-transformer-interfaces@^2.1.1", "@aws-amplify/graphql-transformer-interfaces@^2.2.2": +"@aws-amplify/graphql-transformer-interfaces@^2.1.1": version "2.3.0" resolved "https://registry.npmjs.org/@aws-amplify/graphql-transformer-interfaces/-/graphql-transformer-interfaces-2.3.0.tgz#fee01fbbcb0572201e1e3553503db9f706fc01dd" integrity sha512-GC3zsT3RGK7XPdt/sLDOS69lY0vcob7ozoAuBtLotA9CrmuxHuSAWwYr3diqyt5Jn0z6c64DGjbiLD3XD00kyg== @@ -5711,6 +5684,13 @@ dependencies: "@babel/types" "^7.20.7" +"@types/cli-progress@3.11.0": + version "3.11.0" + resolved "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.0.tgz#ec79df99b26757c3d1c7170af8422e0fc95eef7e" + integrity sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg== + dependencies: + "@types/node" "*" + "@types/common-tags@^1.8.0": version "1.8.1" resolved "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.1.tgz#a5a49ca5ebbb58e0f8947f3ec98950c8970a68a9" @@ -5726,7 +5706,7 @@ resolved "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== -"@types/fs-extra@^8.1.0": +"@types/fs-extra@^8.0.1", "@types/fs-extra@^8.1.0": version "8.1.2" resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz#7125cc2e4bdd9bd2fc83005ffdb1d0ba00cca61f" integrity sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg== @@ -5741,7 +5721,7 @@ "@types/minimatch" "^5.1.2" "@types/node" "*" -"@types/glob@^7.1.1": +"@types/glob@^7.1.1", "@types/glob@^7.2.0": version "7.2.0" resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== @@ -6722,6 +6702,22 @@ aws-cdk-lib@~2.68.0: semver "^7.3.8" yaml "1.10.2" +aws-sdk@2.1414.0: + version "2.1414.0" + resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1414.0.tgz#5888319adba0e98fc95f7b6044bb598edcbf6713" + integrity sha512-WhqTWiTZRUxWITvUG5VMPYGdCLNAm4zOTDIiotbErR9x+uDExk2CAGbXE8HH11+tD8PhZVXyukymSiG+7rJMMg== + dependencies: + buffer "4.9.2" + events "1.1.1" + ieee754 "1.1.13" + jmespath "0.16.0" + querystring "0.2.0" + sax "1.2.1" + url "0.10.3" + util "^0.12.4" + uuid "8.0.0" + xml2js "0.5.0" + aws-sdk@^2.1413.0: version "2.1413.0" resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1413.0.tgz#5ca9c08bacd3523fd6442dc3849d5f558d4e1f5b" @@ -6750,13 +6746,6 @@ axios@0.26.0: dependencies: follow-redirects "^1.14.8" -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - axios@^1.0.0: version "1.4.0" resolved "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" @@ -7304,18 +7293,11 @@ ci-info@^2.0.0: resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.2.0, ci-info@^3.8.0: +ci-info@^3.2.0: version "3.8.0" resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== -circleci-api@^4.1.3: - version "4.1.4" - resolved "https://registry.npmjs.org/circleci-api/-/circleci-api-4.1.4.tgz#6880a28eb021879d81789b50996640dc6373c5ad" - integrity sha512-49F0P2mhmfqYzJR/V4+oM+1SfI/VjKPcurvkzuuawNqgW5Eo00ZufgpHgdT+qRrvRymk6yt45bWOIP/f0FKhJA== - dependencies: - axios "^0.21.1" - cjs-module-lexer@^1.0.0: version "1.2.3" resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" @@ -7340,6 +7322,13 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-progress@3.12.0: + version "3.12.0" + resolved "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz#807ee14b66bcc086258e444ad0f19e7d42577942" + integrity sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A== + dependencies: + string-width "^4.2.3" + cli-spinners@2.6.1: version "2.6.1" resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" @@ -8988,7 +8977,7 @@ fn.name@1.x.x: resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.14.0, follow-redirects@^1.14.8, follow-redirects@^1.15.0: +follow-redirects@^1.14.8, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -14940,7 +14929,7 @@ yaml@1.10.2, yaml@^1.10.0: resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yaml@^2.2.1, yaml@^2.2.2: +yaml@^2.2.1: version "2.3.1" resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==