diff --git a/.gitattributes b/.gitattributes index 224a319f7..62dc17a2e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,13 +4,16 @@ /.eslintrc.json linguist-generated /.gitattributes linguist-generated /.github/pull_request_template.md linguist-generated +/.github/workflows/auto-approve.yml linguist-generated /.github/workflows/build.yml linguist-generated /.github/workflows/release.yml linguist-generated /.github/workflows/upgrade-dependencies.yml linguist-generated -/.github/workflows/upgrade-projen.yml linguist-generated +/.gitignore linguist-generated /.npmignore linguist-generated /.projen/** linguist-generated +/.projen/deps.json linguist-generated /.projen/jest-snapshot-resolver.js linguist-generated +/.projen/tasks.json linguist-generated /lib/__tests__/devapp/cdk.json linguist-generated /LICENSE linguist-generated /package.json linguist-generated diff --git a/.github/workflows/auto-approve.yml b/.github/workflows/auto-approve.yml new file mode 100644 index 000000000..bc768d007 --- /dev/null +++ b/.github/workflows/auto-approve.yml @@ -0,0 +1,22 @@ +# ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen". + +name: auto-approve +on: + pull_request_target: + types: + - labeled + - opened + - synchronize + - reopened + - ready_for_review +jobs: + approve: + runs-on: ubuntu-latest + permissions: + pull-requests: write + if: contains(github.event.pull_request.labels.*.name, 'auto-approve') && + (github.event.pull_request.user.login == 'aws-cdk-automation') + steps: + - uses: hmarr/auto-approve-action@v2.1.0 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/upgrade-dependencies.yml b/.github/workflows/upgrade-dependencies.yml index 4618272cc..9decccead 100644 --- a/.github/workflows/upgrade-dependencies.yml +++ b/.github/workflows/upgrade-dependencies.yml @@ -79,6 +79,7 @@ jobs: *Automatically created by projen via the "upgrade-dependencies" workflow* branch: github-actions/upgrade-dependencies title: "chore(deps): upgrade dependencies" + labels: auto-approve body: >- Upgrades project dependencies. See details in [workflow run]. diff --git a/.github/workflows/upgrade-projen.yml b/.github/workflows/upgrade-projen.yml deleted file mode 100644 index 7e4635b6f..000000000 --- a/.github/workflows/upgrade-projen.yml +++ /dev/null @@ -1,105 +0,0 @@ -# ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen". - -name: upgrade-projen -on: - workflow_dispatch: {} - schedule: - - cron: 0 6 * * * -jobs: - upgrade: - name: Upgrade - runs-on: ubuntu-latest - permissions: - contents: read - outputs: - conclusion: ${{ steps.build.outputs.conclusion }} - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Setup Node.js - uses: actions/setup-node@v1 - with: - node-version: 12.0.0 - - name: Install dependencies - run: yarn install --check-files --frozen-lockfile - - name: Upgrade dependencies - run: npx projen upgrade-projen - - name: Build - id: build - run: npx projen build && echo "::set-output name=conclusion::success" || echo - "::set-output name=conclusion::failure" - - name: Create Patch - run: |- - git add . - git diff --patch --staged > .upgrade.tmp.patch - - name: Upload patch - uses: actions/upload-artifact@v2 - with: - name: .upgrade.tmp.patch - path: .upgrade.tmp.patch - container: - image: jsii/superchain - pr: - name: Create Pull Request - needs: upgrade - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - checks: write - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Download patch - uses: actions/download-artifact@v2 - with: - name: .upgrade.tmp.patch - path: ${{ runner.temp }} - - name: Apply patch - run: '[ -s ${{ runner.temp }}/.upgrade.tmp.patch ] && git apply ${{ runner.temp - }}/.upgrade.tmp.patch || echo "Empty patch. Skipping."' - - name: Create Pull Request - id: create-pr - uses: peter-evans/create-pull-request@v3 - with: - token: ${{ secrets.CDK_AUTOMATION_GITHUB_TOKEN }} - commit-message: >- - chore(deps): upgrade projen - - - Upgrades project dependencies. See details in [workflow run]. - - - [Workflow Run]: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - - - ------ - - - *Automatically created by projen via the "upgrade-projen" workflow* - branch: github-actions/upgrade-projen - title: "chore(deps): upgrade projen" - body: >- - Upgrades project dependencies. See details in [workflow run]. - - - [Workflow Run]: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - - - ------ - - - *Automatically created by projen via the "upgrade-projen" workflow* - - name: Update status check - if: steps.create-pr.outputs.pull-request-url != '' - run: "curl -i --fail -X POST -H \"Accept: application/vnd.github.v3+json\" -H - \"Authorization: token ${GITHUB_TOKEN}\" - https://api.github.com/repos/${{ github.repository }}/check-runs -d - '{\"name\":\"build\",\"head_sha\":\"github-actions/upgrade-projen\",\ - \"status\":\"completed\",\"conclusion\":\"${{ - needs.upgrade.outputs.conclusion }}\",\"output\":{\"title\":\"Created - via the upgrade-projen workflow.\",\"summary\":\"Action run URL: - https://github.com/${{ github.repository }}/actions/runs/${{ - github.run_id }}\"}}'" - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 4191fb460..f739eadc7 100644 --- a/.gitignore +++ b/.gitignore @@ -35,10 +35,10 @@ yarn-error.log* !/.eslintrc.json !/.gitattributes !/.github/pull_request_template.md +!/.github/workflows/auto-approve.yml !/.github/workflows/build.yml !/.github/workflows/release.yml !/.github/workflows/upgrade-dependencies.yml -!/.github/workflows/upgrade-projen.yml !/.npmignore !/.projen/deps.json !/.projen/jest-snapshot-resolver.js diff --git a/.projen/deps.json b/.projen/deps.json index e82d5bfd4..cdf4d7550 100644 --- a/.projen/deps.json +++ b/.projen/deps.json @@ -206,7 +206,6 @@ }, { "name": "projen", - "version": "^0.22.11", "type": "build" }, { diff --git a/.projen/tasks.json b/.projen/tasks.json index 420de6170..ccb7847bf 100644 --- a/.projen/tasks.json +++ b/.projen/tasks.json @@ -155,34 +155,13 @@ }, "steps": [ { - "exec": "npm-check-updates --upgrade --target=minor --reject='projen'" + "exec": "npm-check-updates --upgrade --target=minor --reject='@aws-cdk/aws-certificatemanager,@aws-cdk/aws-cloudfront-origins,@aws-cdk/aws-cloudfront,@aws-cdk/aws-cloudwatch-actions,@aws-cdk/aws-cloudwatch,@aws-cdk/aws-events-targets,@aws-cdk/aws-events,@aws-cdk/aws-lambda-event-sources,@aws-cdk/aws-lambda,@aws-cdk/aws-logs,@aws-cdk/aws-route53-targets,@aws-cdk/aws-route53,@aws-cdk/aws-s3-deployment,@aws-cdk/aws-s3,@aws-cdk/aws-sns,@aws-cdk/core,@aws-cdk/aws-sqs,@aws-cdk/cx-api,cdk-watchful,constructs,@aws-cdk/assert,aws-cdk'" }, { "exec": "yarn install --check-files" }, { - "exec": "yarn upgrade @aws-cdk/assert @aws-cdk/aws-certificatemanager @aws-cdk/aws-cloudfront @aws-cdk/aws-cloudfront-origins @aws-cdk/aws-cloudwatch @aws-cdk/aws-cloudwatch-actions @aws-cdk/aws-events @aws-cdk/aws-events-targets @aws-cdk/aws-lambda @aws-cdk/aws-lambda-event-sources @aws-cdk/aws-logs @aws-cdk/aws-route53 @aws-cdk/aws-route53-targets @aws-cdk/aws-s3 @aws-cdk/aws-s3-deployment @aws-cdk/aws-sns @aws-cdk/aws-sqs @aws-cdk/core @aws-cdk/cx-api @types/aws-lambda @types/fs-extra @types/jest @types/node @typescript-eslint/eslint-plugin @typescript-eslint/parser aws-cdk aws-sdk aws-sdk-mock cdk-watchful construct-hub-webapp constructs esbuild eslint eslint-import-resolver-node eslint-import-resolver-typescript eslint-plugin-import fs-extra glob got jest jest-junit jsii jsii-diff jsii-docgen jsii-pacmak jsii-rosetta json-schema nano npm-check-updates pascal-case standard-version typescript yaml @aws-cdk/aws-certificatemanager @aws-cdk/aws-cloudfront @aws-cdk/aws-cloudfront-origins @aws-cdk/aws-cloudwatch @aws-cdk/aws-cloudwatch-actions @aws-cdk/aws-events @aws-cdk/aws-events-targets @aws-cdk/aws-lambda @aws-cdk/aws-lambda-event-sources @aws-cdk/aws-logs @aws-cdk/aws-route53 @aws-cdk/aws-route53-targets @aws-cdk/aws-s3 @aws-cdk/aws-s3-deployment @aws-cdk/aws-sns @aws-cdk/aws-sqs @aws-cdk/core @aws-cdk/cx-api cdk-watchful constructs @aws-cdk/aws-certificatemanager @aws-cdk/aws-cloudfront @aws-cdk/aws-cloudfront-origins @aws-cdk/aws-cloudwatch @aws-cdk/aws-cloudwatch-actions @aws-cdk/aws-events @aws-cdk/aws-events-targets @aws-cdk/aws-lambda @aws-cdk/aws-lambda-event-sources @aws-cdk/aws-logs @aws-cdk/aws-route53 @aws-cdk/aws-route53-targets @aws-cdk/aws-s3 @aws-cdk/aws-s3-deployment @aws-cdk/aws-sns @aws-cdk/aws-sqs @aws-cdk/core @aws-cdk/cx-api cdk-watchful constructs" - }, - { - "exec": "npx projen" - } - ] - }, - "upgrade-projen": { - "name": "upgrade-projen", - "description": "upgrade projen", - "env": { - "CI": "0" - }, - "steps": [ - { - "exec": "npm-check-updates --upgrade --target=minor --filter='projen'" - }, - { - "exec": "yarn install --check-files" - }, - { - "exec": "yarn upgrade projen" + "exec": "yarn upgrade @types/aws-lambda @types/fs-extra @types/jest @types/node @typescript-eslint/eslint-plugin @typescript-eslint/parser aws-sdk aws-sdk-mock construct-hub-webapp esbuild eslint eslint-import-resolver-node eslint-import-resolver-typescript eslint-plugin-import fs-extra glob got jest jest-junit jsii jsii-diff jsii-docgen jsii-pacmak jsii-rosetta json-schema nano npm-check-updates pascal-case projen standard-version typescript yaml" }, { "exec": "npx projen" diff --git a/.projenrc.js b/.projenrc.js index 555062667..eabc06e5d 100644 --- a/.projenrc.js +++ b/.projenrc.js @@ -1,7 +1,7 @@ const { basename, join, dirname, relative } = require('path'); const glob = require('glob'); const { pascalCase } = require('pascal-case'); -const { SourceCode, FileBase, JsonFile, JsiiProject } = require('projen'); +const { SourceCode, FileBase, JsonFile, JsiiProject, DependenciesUpgradeMechanism } = require('projen'); const cdkDeps = [ '@aws-cdk/aws-certificatemanager', @@ -26,6 +26,9 @@ const cdkDeps = [ 'constructs', ]; +const cdkAssert = '@aws-cdk/assert'; +const cdkCli = 'aws-cdk'; + const project = new JsiiProject({ name: 'construct-hub', description: 'A construct library that model Construct Hub instances.', @@ -37,19 +40,16 @@ const project = new JsiiProject({ homepage: 'https://github.com/cdklabs', defaultReleaseBranch: 'main', mergify: false, - dependabot: false, author: 'Amazon Web Services, Inc.', authorAddress: 'construct-ecosystem-team@amazon.com', authorOrganization: true, - cdkVersion: '1.100.0', - devDeps: [ - '@aws-cdk/assert', + cdkAssert, '@types/aws-lambda', '@types/fs-extra', - 'aws-cdk', + cdkCli, 'aws-sdk-mock', 'aws-sdk', 'esbuild', @@ -103,6 +103,22 @@ const project = new JsiiProject({ // Exclude handler images from TypeScript compier path excludeTypescript: ['resources/**'], + autoApproveOptions: { + allowedUsernames: ['aws-cdk-automation'], + secret: 'GITHUB_TOKEN', + }, + autoApproveUpgrades: true, + depsUpgrade: DependenciesUpgradeMechanism.githubWorkflow({ + exclude: [...cdkDeps, cdkAssert, cdkCli], + ignoreProjen: false, + workflowOptions: { + labels: ['auto-approve'], + secret: 'CDK_AUTOMATION_GITHUB_TOKEN', + container: { + image: 'jsii/superchain', + }, + }, + }), }); // Required while we vendor-in jsii-rosetta to a pre-release version diff --git a/package.json b/package.json index 3696d8114..d1c156934 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "bump": "npx projen bump", "unbump": "npx projen unbump", "upgrade-dependencies": "npx projen upgrade-dependencies", - "upgrade-projen": "npx projen upgrade-projen", "default": "npx projen default", "watch": "npx projen watch", "package": "npx projen package", @@ -39,104 +38,104 @@ "organization": true }, "devDependencies": { - "@aws-cdk/assert": "^1.100.0", - "@aws-cdk/aws-certificatemanager": "^1.107.0", - "@aws-cdk/aws-cloudfront": "^1.107.0", - "@aws-cdk/aws-cloudfront-origins": "^1.107.0", - "@aws-cdk/aws-cloudwatch": "^1.107.0", - "@aws-cdk/aws-cloudwatch-actions": "^1.107.0", - "@aws-cdk/aws-events": "^1.107.0", - "@aws-cdk/aws-events-targets": "^1.107.0", - "@aws-cdk/aws-lambda": "^1.107.0", - "@aws-cdk/aws-lambda-event-sources": "^1.107.0", - "@aws-cdk/aws-logs": "^1.107.0", - "@aws-cdk/aws-route53": "^1.107.0", - "@aws-cdk/aws-route53-targets": "^1.107.0", - "@aws-cdk/aws-s3": "^1.107.0", - "@aws-cdk/aws-s3-deployment": "^1.107.0", - "@aws-cdk/aws-sns": "^1.107.0", - "@aws-cdk/aws-sqs": "^1.107.0", - "@aws-cdk/core": "^1.107.0", - "@aws-cdk/cx-api": "^1.107.0", + "@aws-cdk/assert": "1.108.0", + "@aws-cdk/aws-certificatemanager": "1.108.0", + "@aws-cdk/aws-cloudfront": "1.108.0", + "@aws-cdk/aws-cloudfront-origins": "1.108.0", + "@aws-cdk/aws-cloudwatch": "1.108.0", + "@aws-cdk/aws-cloudwatch-actions": "1.108.0", + "@aws-cdk/aws-events": "1.108.0", + "@aws-cdk/aws-events-targets": "1.108.0", + "@aws-cdk/aws-lambda": "1.108.0", + "@aws-cdk/aws-lambda-event-sources": "1.108.0", + "@aws-cdk/aws-logs": "1.108.0", + "@aws-cdk/aws-route53": "1.108.0", + "@aws-cdk/aws-route53-targets": "1.108.0", + "@aws-cdk/aws-s3": "1.108.0", + "@aws-cdk/aws-s3-deployment": "1.108.0", + "@aws-cdk/aws-sns": "1.108.0", + "@aws-cdk/aws-sqs": "1.108.0", + "@aws-cdk/core": "1.108.0", + "@aws-cdk/cx-api": "1.108.0", "@types/aws-lambda": "^8.10.77", "@types/fs-extra": "^9.0.11", "@types/jest": "^26.0.23", "@types/node": "^12.0.0", - "@typescript-eslint/eslint-plugin": "^4.25.0", - "@typescript-eslint/parser": "^4.25.0", - "aws-cdk": "^1.100.0", - "aws-sdk": "^2.921.0", + "@typescript-eslint/eslint-plugin": "^4.26.1", + "@typescript-eslint/parser": "^4.26.1", + "aws-cdk": "1.108.0", + "aws-sdk": "^2.927.0", "aws-sdk-mock": "^5.1.0", - "cdk-watchful": "^0.5.140", - "construct-hub-webapp": "^0.1.11", - "constructs": "^3.3.75", - "esbuild": "^0.12.2", - "eslint": "^7.27.0", + "cdk-watchful": "^0.5.154", + "construct-hub-webapp": "^0.1.39", + "constructs": "^3.3.77", + "esbuild": "^0.12.8", + "eslint": "^7.28.0", "eslint-import-resolver-node": "^0.3.4", "eslint-import-resolver-typescript": "^2.4.0", - "eslint-plugin-import": "^2.23.3", + "eslint-plugin-import": "^2.23.4", "fs-extra": "^10.0.0", "glob": "^7.1.7", "got": "^11.8.2", "jest": "^26.6.3", "jest-junit": "^12", - "jsii": "^1.29.0", - "jsii-diff": "^1.29.0", - "jsii-docgen": "^1.8.85", - "jsii-pacmak": "^1.29.0", + "jsii": "^1.30.0", + "jsii-diff": "^1.30.0", + "jsii-docgen": "^1.8.96", + "jsii-pacmak": "^1.30.0", "jsii-rosetta": "./vendor/jsii-rosetta.tgz", "json-schema": "^0.3.0", "nano": "^9.0.3", "npm-check-updates": "^11", "pascal-case": "^3.1.2", - "projen": "^0.22.11", + "projen": "^0.24.7", "standard-version": "^9", "typescript": "^4.3.2", "yaml": "^1.10.2" }, "peerDependencies": { - "@aws-cdk/aws-certificatemanager": "^1.100.0", - "@aws-cdk/aws-cloudfront": "^1.100.0", - "@aws-cdk/aws-cloudfront-origins": "^1.100.0", - "@aws-cdk/aws-cloudwatch": "^1.100.0", - "@aws-cdk/aws-cloudwatch-actions": "^1.100.0", - "@aws-cdk/aws-events": "^1.100.0", - "@aws-cdk/aws-events-targets": "^1.100.0", - "@aws-cdk/aws-lambda": "^1.100.0", - "@aws-cdk/aws-lambda-event-sources": "^1.107.0", - "@aws-cdk/aws-logs": "^1.107.0", - "@aws-cdk/aws-route53": "^1.100.0", - "@aws-cdk/aws-route53-targets": "^1.100.0", - "@aws-cdk/aws-s3": "^1.100.0", - "@aws-cdk/aws-s3-deployment": "^1.100.0", - "@aws-cdk/aws-sns": "^1.100.0", - "@aws-cdk/aws-sqs": "^1.107.0", - "@aws-cdk/core": "^1.100.0", - "@aws-cdk/cx-api": "^1.100.0", - "cdk-watchful": "0.5.140", - "constructs": "^3.2.27" + "@aws-cdk/aws-certificatemanager": "1.108.0", + "@aws-cdk/aws-cloudfront": "1.108.0", + "@aws-cdk/aws-cloudfront-origins": "1.108.0", + "@aws-cdk/aws-cloudwatch": "1.108.0", + "@aws-cdk/aws-cloudwatch-actions": "1.108.0", + "@aws-cdk/aws-events": "1.108.0", + "@aws-cdk/aws-events-targets": "1.108.0", + "@aws-cdk/aws-lambda": "1.108.0", + "@aws-cdk/aws-lambda-event-sources": "1.108.0", + "@aws-cdk/aws-logs": "1.108.0", + "@aws-cdk/aws-route53": "1.108.0", + "@aws-cdk/aws-route53-targets": "1.108.0", + "@aws-cdk/aws-s3": "1.108.0", + "@aws-cdk/aws-s3-deployment": "1.108.0", + "@aws-cdk/aws-sns": "1.108.0", + "@aws-cdk/aws-sqs": "1.108.0", + "@aws-cdk/core": "1.108.0", + "@aws-cdk/cx-api": "1.108.0", + "cdk-watchful": "^0.5.154", + "constructs": "^3.3.77" }, "dependencies": { - "@aws-cdk/aws-certificatemanager": "^1.100.0", - "@aws-cdk/aws-cloudfront": "^1.100.0", - "@aws-cdk/aws-cloudfront-origins": "^1.100.0", - "@aws-cdk/aws-cloudwatch": "^1.100.0", - "@aws-cdk/aws-cloudwatch-actions": "^1.100.0", - "@aws-cdk/aws-events": "^1.100.0", - "@aws-cdk/aws-events-targets": "^1.100.0", - "@aws-cdk/aws-lambda": "^1.100.0", - "@aws-cdk/aws-lambda-event-sources": "^1.107.0", - "@aws-cdk/aws-logs": "^1.107.0", - "@aws-cdk/aws-route53": "^1.100.0", - "@aws-cdk/aws-route53-targets": "^1.100.0", - "@aws-cdk/aws-s3": "^1.100.0", - "@aws-cdk/aws-s3-deployment": "^1.100.0", - "@aws-cdk/aws-sns": "^1.100.0", - "@aws-cdk/aws-sqs": "^1.107.0", - "@aws-cdk/core": "^1.100.0", - "@aws-cdk/cx-api": "^1.100.0", - "cdk-watchful": "0.5.140", - "constructs": "^3.2.27" + "@aws-cdk/aws-certificatemanager": "1.108.0", + "@aws-cdk/aws-cloudfront": "1.108.0", + "@aws-cdk/aws-cloudfront-origins": "1.108.0", + "@aws-cdk/aws-cloudwatch": "1.108.0", + "@aws-cdk/aws-cloudwatch-actions": "1.108.0", + "@aws-cdk/aws-events": "1.108.0", + "@aws-cdk/aws-events-targets": "1.108.0", + "@aws-cdk/aws-lambda": "1.108.0", + "@aws-cdk/aws-lambda-event-sources": "1.108.0", + "@aws-cdk/aws-logs": "1.108.0", + "@aws-cdk/aws-route53": "1.108.0", + "@aws-cdk/aws-route53-targets": "1.108.0", + "@aws-cdk/aws-s3": "1.108.0", + "@aws-cdk/aws-s3-deployment": "1.108.0", + "@aws-cdk/aws-sns": "1.108.0", + "@aws-cdk/aws-sqs": "1.108.0", + "@aws-cdk/core": "1.108.0", + "@aws-cdk/cx-api": "1.108.0", + "cdk-watchful": "^0.5.154", + "constructs": "^3.3.77" }, "bundledDependencies": [], "keywords": [ diff --git a/src/__tests__/__snapshots__/construct-hub.test.ts.snap b/src/__tests__/__snapshots__/construct-hub.test.ts.snap index f802bc718..5e80a5bcb 100644 --- a/src/__tests__/__snapshots__/construct-hub.test.ts.snap +++ b/src/__tests__/__snapshots__/construct-hub.test.ts.snap @@ -33,28 +33,16 @@ Object { }, }, "Parameters": Object { - "AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bArtifactHash5FFA3998": Object { - "Description": "Artifact hash for asset \\"05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13b\\"", + "AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2ArtifactHashAA3DB115": Object { + "Description": "Artifact hash for asset \\"39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2\\"", "Type": "String", }, - "AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3Bucket33203C1D": Object { - "Description": "S3 bucket for asset \\"05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13b\\"", + "AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3Bucket1B6624AE": Object { + "Description": "S3 bucket for asset \\"39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2\\"", "Type": "String", }, - "AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3VersionKey4F4B0727": Object { - "Description": "S3 key for asset version \\"05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13b\\"", - "Type": "String", - }, - "AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eArtifactHash6467026A": Object { - "Description": "Artifact hash for asset \\"28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86e\\"", - "Type": "String", - }, - "AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3BucketF36B6862": Object { - "Description": "S3 bucket for asset \\"28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86e\\"", - "Type": "String", - }, - "AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3VersionKeyB9A97C6A": Object { - "Description": "S3 key for asset version \\"28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86e\\"", + "AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3VersionKey3A7A31C2": Object { + "Description": "S3 key for asset version \\"39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2\\"", "Type": "String", }, "AssetParametersc24b999656e4fe6c609c31bae56a1cf4717a405619c3aa6ba1bc686b8c2c86cfArtifactHash85F58E48": Object { @@ -69,16 +57,40 @@ Object { "Description": "S3 key for asset version \\"c24b999656e4fe6c609c31bae56a1cf4717a405619c3aa6ba1bc686b8c2c86cf\\"", "Type": "String", }, - "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766ArtifactHashB8637A22": Object { - "Description": "Artifact hash for asset \\"c3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766\\"", + "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524ArtifactHashABFB44E7": Object { + "Description": "Artifact hash for asset \\"c9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524\\"", + "Type": "String", + }, + "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3Bucket265D5217": Object { + "Description": "S3 bucket for asset \\"c9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524\\"", "Type": "String", }, - "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3Bucket266B8096": Object { - "Description": "S3 bucket for asset \\"c3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766\\"", + "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3VersionKeyA48E92EB": Object { + "Description": "S3 key for asset version \\"c9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524\\"", "Type": "String", }, - "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3VersionKey12C0054C": Object { - "Description": "S3 key for asset version \\"c3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766\\"", + "AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305ArtifactHashE87E66EE": Object { + "Description": "Artifact hash for asset \\"da254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305\\"", + "Type": "String", + }, + "AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3BucketCED66570": Object { + "Description": "S3 bucket for asset \\"da254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305\\"", + "Type": "String", + }, + "AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3VersionKeyAA8B8FD7": Object { + "Description": "S3 key for asset version \\"da254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305\\"", + "Type": "String", + }, + "AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dArtifactHashF032B9A3": Object { + "Description": "Artifact hash for asset \\"dcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789d\\"", + "Type": "String", + }, + "AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3Bucket8C070E54": Object { + "Description": "S3 bucket for asset \\"dcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789d\\"", + "Type": "String", + }, + "AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3VersionKey4C7389DF": Object { + "Description": "S3 key for asset version \\"dcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789d\\"", "Type": "String", }, "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68ArtifactHashD9A515C3": Object { @@ -233,6 +245,236 @@ Object { }, "Type": "AWS::IAM::Policy", }, + "ConstructHubDiscoveryFunctionDeadLetterQueueFE498555": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "MessageRetentionPeriod": 1209600, + }, + "Type": "AWS::SQS::Queue", + "UpdateReplacePolicy": "Delete", + }, + "ConstructHubDiscoveryFunctionF5E139FD": Object { + "DependsOn": Array [ + "ConstructHubDiscoveryFunctionServiceRoleDefaultPolicyA09546EC", + "ConstructHubDiscoveryFunctionServiceRoleD371794F", + ], + "Properties": Object { + "Code": Object { + "S3Bucket": Object { + "Ref": "AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3Bucket1B6624AE", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3VersionKey3A7A31C2", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3VersionKey3A7A31C2", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "DeadLetterConfig": Object { + "TargetArn": Object { + "Fn::GetAtt": Array [ + "ConstructHubDiscoveryFunctionDeadLetterQueueFE498555", + "Arn", + ], + }, + }, + "Description": "Periodically query npm.js index for new Constructs", + "Environment": Object { + "Variables": Object { + "QUEUE_URL": Object { + "Ref": "ConstructHubIngestionQueue637E4740", + }, + "STAGING_BUCKET_NAME": Object { + "Ref": "ConstructHubStagingBucket29942A98", + }, + }, + }, + "Handler": "index.handler", + "MemorySize": 10240, + "Role": Object { + "Fn::GetAtt": Array [ + "ConstructHubDiscoveryFunctionServiceRoleD371794F", + "Arn", + ], + }, + "Runtime": "nodejs14.x", + "Timeout": 900, + }, + "Type": "AWS::Lambda::Function", + }, + "ConstructHubDiscoveryFunctionScheduleRuleAllowEventRuleTestConstructHubDiscoveryFunctionC36D63A5E62E305C": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ConstructHubDiscoveryFunctionF5E139FD", + "Arn", + ], + }, + "Principal": "events.amazonaws.com", + "SourceArn": Object { + "Fn::GetAtt": Array [ + "ConstructHubDiscoveryFunctionScheduleRuleE32FE899", + "Arn", + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ConstructHubDiscoveryFunctionScheduleRuleE32FE899": Object { + "Properties": Object { + "ScheduleExpression": "rate(5 minutes)", + "State": "ENABLED", + "Targets": Array [ + Object { + "Arn": Object { + "Fn::GetAtt": Array [ + "ConstructHubDiscoveryFunctionF5E139FD", + "Arn", + ], + }, + "Id": "Target0", + }, + ], + }, + "Type": "AWS::Events::Rule", + }, + "ConstructHubDiscoveryFunctionServiceRoleD371794F": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "ConstructHubDiscoveryFunctionServiceRoleDefaultPolicyA09546EC": Object { + "Properties": Object { + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sqs:SendMessage", + "Effect": "Allow", + "Resource": Object { + "Fn::GetAtt": Array [ + "ConstructHubDiscoveryFunctionDeadLetterQueueFE498555", + "Arn", + ], + }, + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + "s3:PutObject*", + "s3:Abort*", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "ConstructHubStagingBucket29942A98", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "ConstructHubStagingBucket29942A98", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "sqs:SendMessage", + "sqs:GetQueueAttributes", + "sqs:GetQueueUrl", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::GetAtt": Array [ + "ConstructHubIngestionQueue637E4740", + "Arn", + ], + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "ConstructHubDiscoveryFunctionServiceRoleDefaultPolicyA09546EC", + "Roles": Array [ + Object { + "Ref": "ConstructHubDiscoveryFunctionServiceRoleD371794F", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "ConstructHubIngestionQueue637E4740": Object { + "DeletionPolicy": "Delete", + "Type": "AWS::SQS::Queue", + "UpdateReplacePolicy": "Delete", + }, "ConstructHubMonitoringDashboard78E057C8": Object { "Properties": Object { "DashboardBody": Object { @@ -336,7 +578,7 @@ Object { "Properties": Object { "Code": Object { "S3Bucket": Object { - "Ref": "AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3BucketF36B6862", + "Ref": "AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3Bucket8C070E54", }, "S3Key": Object { "Fn::Join": Array [ @@ -349,7 +591,7 @@ Object { "Fn::Split": Array [ "||", Object { - "Ref": "AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3VersionKeyB9A97C6A", + "Ref": "AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3VersionKey4C7389DF", }, ], }, @@ -362,7 +604,7 @@ Object { "Fn::Split": Array [ "||", Object { - "Ref": "AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3VersionKeyB9A97C6A", + "Ref": "AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3VersionKey4C7389DF", }, ], }, @@ -571,6 +813,22 @@ Object { }, "Type": "Custom::S3BucketNotifications", }, + "ConstructHubStagingBucket29942A98": Object { + "DeletionPolicy": "Retain", + "Properties": Object { + "LifecycleConfiguration": Object { + "Rules": Array [ + Object { + "ExpirationInDays": 30, + "Prefix": "packages", + "Status": "Enabled", + }, + ], + }, + }, + "Type": "AWS::S3::Bucket", + "UpdateReplacePolicy": "Retain", + }, "ConstructHubTransliterator9C48708A": Object { "DependsOn": Array [ "ConstructHubTransliteratorServiceRoleDefaultPolicyB9C4BE06", @@ -579,7 +837,7 @@ Object { "Properties": Object { "Code": Object { "S3Bucket": Object { - "Ref": "AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3Bucket33203C1D", + "Ref": "AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3BucketCED66570", }, "S3Key": Object { "Fn::Join": Array [ @@ -592,7 +850,7 @@ Object { "Fn::Split": Array [ "||", Object { - "Ref": "AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3VersionKey4F4B0727", + "Ref": "AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3VersionKeyAA8B8FD7", }, ], }, @@ -605,7 +863,7 @@ Object { "Fn::Split": Array [ "||", Object { - "Ref": "AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3VersionKey4F4B0727", + "Ref": "AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3VersionKeyAA8B8FD7", }, ], }, @@ -806,7 +1064,7 @@ Object { }, "SourceBucketNames": Array [ Object { - "Ref": "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3Bucket266B8096", + "Ref": "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3Bucket265D5217", }, ], "SourceObjectKeys": Array [ @@ -821,7 +1079,7 @@ Object { "Fn::Split": Array [ "||", Object { - "Ref": "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3VersionKey12C0054C", + "Ref": "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3VersionKeyA48E92EB", }, ], }, @@ -834,7 +1092,7 @@ Object { "Fn::Split": Array [ "||", Object { - "Ref": "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3VersionKey12C0054C", + "Ref": "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3VersionKeyA48E92EB", }, ], }, @@ -859,6 +1117,13 @@ Object { "TargetOriginId": "TestConstructHubWebAppDistributionOrigin276090F90", "ViewerProtocolPolicy": "allow-all", }, + Object { + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", + "Compress": true, + "PathPattern": "/index/packages.json", + "TargetOriginId": "TestConstructHubWebAppDistributionOrigin276090F90", + "ViewerProtocolPolicy": "allow-all", + }, ], "CustomErrorResponses": Array [ Object { @@ -1086,7 +1351,7 @@ Object { }, ":s3:::", Object { - "Ref": "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3Bucket266B8096", + "Ref": "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3Bucket265D5217", }, ], ], @@ -1101,7 +1366,7 @@ Object { }, ":s3:::", Object { - "Ref": "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3Bucket266B8096", + "Ref": "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3Bucket265D5217", }, "/*", ], @@ -1209,28 +1474,16 @@ Object { }, }, "Parameters": Object { - "AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bArtifactHash5FFA3998": Object { - "Description": "Artifact hash for asset \\"05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13b\\"", + "AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2ArtifactHashAA3DB115": Object { + "Description": "Artifact hash for asset \\"39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2\\"", "Type": "String", }, - "AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3Bucket33203C1D": Object { - "Description": "S3 bucket for asset \\"05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13b\\"", + "AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3Bucket1B6624AE": Object { + "Description": "S3 bucket for asset \\"39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2\\"", "Type": "String", }, - "AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3VersionKey4F4B0727": Object { - "Description": "S3 key for asset version \\"05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13b\\"", - "Type": "String", - }, - "AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eArtifactHash6467026A": Object { - "Description": "Artifact hash for asset \\"28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86e\\"", - "Type": "String", - }, - "AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3BucketF36B6862": Object { - "Description": "S3 bucket for asset \\"28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86e\\"", - "Type": "String", - }, - "AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3VersionKeyB9A97C6A": Object { - "Description": "S3 key for asset version \\"28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86e\\"", + "AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3VersionKey3A7A31C2": Object { + "Description": "S3 key for asset version \\"39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2\\"", "Type": "String", }, "AssetParameters7af6295e521fd55af94332393ceffb3e866aac4dc4956321f7918f21e72199e4ArtifactHash5E28809B": Object { @@ -1257,16 +1510,40 @@ Object { "Description": "S3 key for asset version \\"c24b999656e4fe6c609c31bae56a1cf4717a405619c3aa6ba1bc686b8c2c86cf\\"", "Type": "String", }, - "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766ArtifactHashB8637A22": Object { - "Description": "Artifact hash for asset \\"c3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766\\"", + "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524ArtifactHashABFB44E7": Object { + "Description": "Artifact hash for asset \\"c9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524\\"", + "Type": "String", + }, + "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3Bucket265D5217": Object { + "Description": "S3 bucket for asset \\"c9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524\\"", "Type": "String", }, - "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3Bucket266B8096": Object { - "Description": "S3 bucket for asset \\"c3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766\\"", + "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3VersionKeyA48E92EB": Object { + "Description": "S3 key for asset version \\"c9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524\\"", "Type": "String", }, - "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3VersionKey12C0054C": Object { - "Description": "S3 key for asset version \\"c3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766\\"", + "AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305ArtifactHashE87E66EE": Object { + "Description": "Artifact hash for asset \\"da254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305\\"", + "Type": "String", + }, + "AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3BucketCED66570": Object { + "Description": "S3 bucket for asset \\"da254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305\\"", + "Type": "String", + }, + "AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3VersionKeyAA8B8FD7": Object { + "Description": "S3 key for asset version \\"da254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305\\"", + "Type": "String", + }, + "AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dArtifactHashF032B9A3": Object { + "Description": "Artifact hash for asset \\"dcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789d\\"", + "Type": "String", + }, + "AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3Bucket8C070E54": Object { + "Description": "S3 bucket for asset \\"dcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789d\\"", + "Type": "String", + }, + "AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3VersionKey4C7389DF": Object { + "Description": "S3 key for asset version \\"dcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789d\\"", "Type": "String", }, "AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68ArtifactHashD9A515C3": Object { @@ -1570,6 +1847,236 @@ Object { "Type": "AWS::CloudFormation::CustomResource", "UpdateReplacePolicy": "Delete", }, + "ConstructHubDiscoveryFunctionDeadLetterQueueFE498555": Object { + "DeletionPolicy": "Delete", + "Properties": Object { + "MessageRetentionPeriod": 1209600, + }, + "Type": "AWS::SQS::Queue", + "UpdateReplacePolicy": "Delete", + }, + "ConstructHubDiscoveryFunctionF5E139FD": Object { + "DependsOn": Array [ + "ConstructHubDiscoveryFunctionServiceRoleDefaultPolicyA09546EC", + "ConstructHubDiscoveryFunctionServiceRoleD371794F", + ], + "Properties": Object { + "Code": Object { + "S3Bucket": Object { + "Ref": "AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3Bucket1B6624AE", + }, + "S3Key": Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::Select": Array [ + 0, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3VersionKey3A7A31C2", + }, + ], + }, + ], + }, + Object { + "Fn::Select": Array [ + 1, + Object { + "Fn::Split": Array [ + "||", + Object { + "Ref": "AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3VersionKey3A7A31C2", + }, + ], + }, + ], + }, + ], + ], + }, + }, + "DeadLetterConfig": Object { + "TargetArn": Object { + "Fn::GetAtt": Array [ + "ConstructHubDiscoveryFunctionDeadLetterQueueFE498555", + "Arn", + ], + }, + }, + "Description": "Periodically query npm.js index for new Constructs", + "Environment": Object { + "Variables": Object { + "QUEUE_URL": Object { + "Ref": "ConstructHubIngestionQueue637E4740", + }, + "STAGING_BUCKET_NAME": Object { + "Ref": "ConstructHubStagingBucket29942A98", + }, + }, + }, + "Handler": "index.handler", + "MemorySize": 10240, + "Role": Object { + "Fn::GetAtt": Array [ + "ConstructHubDiscoveryFunctionServiceRoleD371794F", + "Arn", + ], + }, + "Runtime": "nodejs14.x", + "Timeout": 900, + }, + "Type": "AWS::Lambda::Function", + }, + "ConstructHubDiscoveryFunctionScheduleRuleAllowEventRuleTestConstructHubDiscoveryFunctionC36D63A5E62E305C": Object { + "Properties": Object { + "Action": "lambda:InvokeFunction", + "FunctionName": Object { + "Fn::GetAtt": Array [ + "ConstructHubDiscoveryFunctionF5E139FD", + "Arn", + ], + }, + "Principal": "events.amazonaws.com", + "SourceArn": Object { + "Fn::GetAtt": Array [ + "ConstructHubDiscoveryFunctionScheduleRuleE32FE899", + "Arn", + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "ConstructHubDiscoveryFunctionScheduleRuleE32FE899": Object { + "Properties": Object { + "ScheduleExpression": "rate(5 minutes)", + "State": "ENABLED", + "Targets": Array [ + Object { + "Arn": Object { + "Fn::GetAtt": Array [ + "ConstructHubDiscoveryFunctionF5E139FD", + "Arn", + ], + }, + "Id": "Target0", + }, + ], + }, + "Type": "AWS::Events::Rule", + }, + "ConstructHubDiscoveryFunctionServiceRoleD371794F": Object { + "Properties": Object { + "AssumeRolePolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": Object { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": Array [ + Object { + "Fn::Join": Array [ + "", + Array [ + "arn:", + Object { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "ConstructHubDiscoveryFunctionServiceRoleDefaultPolicyA09546EC": Object { + "Properties": Object { + "PolicyDocument": Object { + "Statement": Array [ + Object { + "Action": "sqs:SendMessage", + "Effect": "Allow", + "Resource": Object { + "Fn::GetAtt": Array [ + "ConstructHubDiscoveryFunctionDeadLetterQueueFE498555", + "Arn", + ], + }, + }, + Object { + "Action": Array [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + "s3:PutObject*", + "s3:Abort*", + ], + "Effect": "Allow", + "Resource": Array [ + Object { + "Fn::GetAtt": Array [ + "ConstructHubStagingBucket29942A98", + "Arn", + ], + }, + Object { + "Fn::Join": Array [ + "", + Array [ + Object { + "Fn::GetAtt": Array [ + "ConstructHubStagingBucket29942A98", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + Object { + "Action": Array [ + "sqs:SendMessage", + "sqs:GetQueueAttributes", + "sqs:GetQueueUrl", + ], + "Effect": "Allow", + "Resource": Object { + "Fn::GetAtt": Array [ + "ConstructHubIngestionQueue637E4740", + "Arn", + ], + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "ConstructHubDiscoveryFunctionServiceRoleDefaultPolicyA09546EC", + "Roles": Array [ + Object { + "Ref": "ConstructHubDiscoveryFunctionServiceRoleD371794F", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "ConstructHubIngestionQueue637E4740": Object { + "DeletionPolicy": "Delete", + "Type": "AWS::SQS::Queue", + "UpdateReplacePolicy": "Delete", + }, "ConstructHubMonitoringDashboard78E057C8": Object { "Properties": Object { "DashboardBody": Object { @@ -1673,7 +2180,7 @@ Object { "Properties": Object { "Code": Object { "S3Bucket": Object { - "Ref": "AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3BucketF36B6862", + "Ref": "AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3Bucket8C070E54", }, "S3Key": Object { "Fn::Join": Array [ @@ -1686,7 +2193,7 @@ Object { "Fn::Split": Array [ "||", Object { - "Ref": "AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3VersionKeyB9A97C6A", + "Ref": "AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3VersionKey4C7389DF", }, ], }, @@ -1699,7 +2206,7 @@ Object { "Fn::Split": Array [ "||", Object { - "Ref": "AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3VersionKeyB9A97C6A", + "Ref": "AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3VersionKey4C7389DF", }, ], }, @@ -1908,6 +2415,22 @@ Object { }, "Type": "Custom::S3BucketNotifications", }, + "ConstructHubStagingBucket29942A98": Object { + "DeletionPolicy": "Retain", + "Properties": Object { + "LifecycleConfiguration": Object { + "Rules": Array [ + Object { + "ExpirationInDays": 30, + "Prefix": "packages", + "Status": "Enabled", + }, + ], + }, + }, + "Type": "AWS::S3::Bucket", + "UpdateReplacePolicy": "Retain", + }, "ConstructHubTransliterator9C48708A": Object { "DependsOn": Array [ "ConstructHubTransliteratorServiceRoleDefaultPolicyB9C4BE06", @@ -1916,7 +2439,7 @@ Object { "Properties": Object { "Code": Object { "S3Bucket": Object { - "Ref": "AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3Bucket33203C1D", + "Ref": "AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3BucketCED66570", }, "S3Key": Object { "Fn::Join": Array [ @@ -1929,7 +2452,7 @@ Object { "Fn::Split": Array [ "||", Object { - "Ref": "AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3VersionKey4F4B0727", + "Ref": "AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3VersionKeyAA8B8FD7", }, ], }, @@ -1942,7 +2465,7 @@ Object { "Fn::Split": Array [ "||", Object { - "Ref": "AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3VersionKey4F4B0727", + "Ref": "AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3VersionKeyAA8B8FD7", }, ], }, @@ -2195,7 +2718,7 @@ Object { }, "SourceBucketNames": Array [ Object { - "Ref": "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3Bucket266B8096", + "Ref": "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3Bucket265D5217", }, ], "SourceObjectKeys": Array [ @@ -2210,7 +2733,7 @@ Object { "Fn::Split": Array [ "||", Object { - "Ref": "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3VersionKey12C0054C", + "Ref": "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3VersionKeyA48E92EB", }, ], }, @@ -2223,7 +2746,7 @@ Object { "Fn::Split": Array [ "||", Object { - "Ref": "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3VersionKey12C0054C", + "Ref": "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3VersionKeyA48E92EB", }, ], }, @@ -2251,6 +2774,13 @@ Object { "TargetOriginId": "TestConstructHubWebAppDistributionOrigin276090F90", "ViewerProtocolPolicy": "allow-all", }, + Object { + "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6", + "Compress": true, + "PathPattern": "/index/packages.json", + "TargetOriginId": "TestConstructHubWebAppDistributionOrigin276090F90", + "ViewerProtocolPolicy": "allow-all", + }, ], "CustomErrorResponses": Array [ Object { @@ -2488,7 +3018,7 @@ Object { }, ":s3:::", Object { - "Ref": "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3Bucket266B8096", + "Ref": "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3Bucket265D5217", }, ], ], @@ -2503,7 +3033,7 @@ Object { }, ":s3:::", Object { - "Ref": "AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3Bucket266B8096", + "Ref": "AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3Bucket265D5217", }, "/*", ], diff --git a/src/__tests__/backend/transliterator/transliterator.lambda.test.ts b/src/__tests__/backend/transliterator/transliterator.lambda.test.ts index eaa755b0e..91ebf9bb2 100644 --- a/src/__tests__/backend/transliterator/transliterator.lambda.test.ts +++ b/src/__tests__/backend/transliterator/transliterator.lambda.test.ts @@ -11,7 +11,7 @@ import * as AWSMock from 'aws-sdk-mock'; import { TargetLanguage } from 'jsii-rosetta'; import type { transliterateAssembly } from 'jsii-rosetta/lib/commands/transliterate'; -import { handler } from '../../../backend/transliterator/transliterator.lambda'; +import { handler, reset } from '../../../backend/transliterator/transliterator.lambda'; jest.mock('child_process'); jest.mock('jsii-rosetta/lib/commands/transliterate'); @@ -23,11 +23,118 @@ beforeEach((done) => { afterEach((done) => { AWSMock.restore(); - jest.resetAllMocks(); + reset(); done(); }); -test('basic usage', async () => { +test('scoped package', async () => { + // GIVEN + const packageScope = 'scope'; + const packageName = 'package-name'; + const packageVersion = '1.2.3-dev.4'; + const payload: S3Event = { + Records: [{ + awsRegion: 'bemuda-triangle-1', + eventVersion: '1337', + eventSource: 's3:DummySource', + eventName: 's3:DummyEvent', + eventTime: '1789-07-14T00:00:00+02:00', + userIdentity: { principalId: 'aws::principal::id' }, + requestParameters: { sourceIPAddress: '127.0.0.1' }, + responseElements: { + 'x-amz-id-2': '456', + 'x-amz-request-id': '123', + }, + s3: { + bucket: { + name: 'dummy-bucket', + arn: 'arn:aws:s3:::dummy-bucket', + ownerIdentity: { principalId: 'aws::principal::id' }, + }, + configurationId: '42', + object: { + eTag: 'eTag', + key: `packages/%40${packageScope}/${packageName}/v${packageVersion}/package.tgz`, + sequencer: 'Seq', + size: 1337, + versionId: 'VersionId', + }, + s3SchemaVersion: '1', + }, + }], + }; + const mockContext = {} as any; + const mockTarballBytes = randomBytes(128); + const mockOutputAssembly = randomBytes(128); + + AWSMock.mock('S3', 'getObject', (request: AWS.S3.GetObjectRequest, callback: Response) => { + try { + expect(request.Bucket).toBe(payload.Records[0].s3.bucket.name); + expect(request.Key).toBe(payload.Records[0].s3.object.key.split('/').map((comp) => decodeURIComponent(comp)).join('/')); + expect(request.VersionId).toBe(payload.Records[0].s3.object.versionId); + } catch (e) { + callback(e); + } + + callback(null, { + Body: mockTarballBytes, + }); + }); + + // eslint-disable-next-line @typescript-eslint/no-require-imports + const mockSpawn = require('child_process').spawn as jest.MockedFunction; + mockSpawn.mockImplementation((cmd: string, args: readonly string[], opts: child_process.SpawnOptions) => { + expect(cmd).toBe('npm'); + expect(args).toContain('install'); + expect(args).toContain('--ignore-scripts'); // Ensures lifecycle hooks don't run + expect(args).toContain('--no-bin-links'); // Ensures we don't attempt to add bin-links to $PATH + expect(opts.cwd).toBeDefined(); + expect(opts.stdio).toEqual(['ignore', 'inherit', 'inherit']); + + const tarballPath = args[args.length - 1]; + // eslint-disable-next-line @typescript-eslint/no-require-imports + expect(require('fs').readFileSync(tarballPath)).toEqual(mockTarballBytes); + + return new MockChildProcess(cmd, Array.from(args), fs.mkdir(path.join(opts.cwd!, 'node_modules', `@${packageScope}`, packageName), { recursive: true })); + }); + + // eslint-disable-next-line @typescript-eslint/no-require-imports + const mockTransliterateAssembly = require('jsii-rosetta/lib/commands/transliterate').transliterateAssembly as jest.MockedFunction; + mockTransliterateAssembly.mockImplementation(async ([dir, ...otherDirs], languages) => { + expect(languages).toEqual([TargetLanguage.PYTHON]); + expect(dir).toMatch(new RegExp(path.join('', 'node_modules', `@${packageScope}`, packageName) + '$')); + expect(otherDirs).toEqual([]); + + return fs.writeFile(path.resolve(dir, '.jsii.python'), mockOutputAssembly); + }); + + const key = payload.Records[0].s3.object.key + // The key is not URI-encoded when it's sent to the S3 SDK... + .split('/').map((comp) => decodeURIComponent(comp)).join('/') + .replace(/\/package\.tgz$/, '/assembly-python.json'); + AWSMock.mock('S3', 'putObject', (request: AWS.S3.PutObjectRequest, callback: Response) => { + try { + expect(request.Bucket).toBe(payload.Records[0].s3.bucket.name); + expect(request.Key).toBe(key); + expect(request.Body).toEqual(mockOutputAssembly); + } catch (e) { + return callback(e); + } + + callback(null, { VersionId: 'New-VersionID' }); + }); + + // WHEN + const result = handler(payload, mockContext); + + // THEN + await expect(result).resolves.toEqual([{ bucket: payload.Records[0].s3.bucket.name, key, versionId: 'New-VersionID' }]); + + expect(mockSpawn).toHaveBeenCalled(); + expect(mockTransliterateAssembly).toHaveBeenCalled(); +}); + +test('unscoped package', async () => { // GIVEN const packageName = 'package-name'; const packageVersion = '1.2.3-dev.4'; @@ -125,7 +232,7 @@ test('basic usage', async () => { // THEN await expect(result).resolves.toEqual([{ bucket: payload.Records[0].s3.bucket.name, key, versionId: 'New-VersionID' }]); - debugger; + expect(mockSpawn).toHaveBeenCalled(); expect(mockTransliterateAssembly).toHaveBeenCalled(); }); diff --git a/src/__tests__/devapp/__snapshots__/snapshot.test.ts.snap b/src/__tests__/devapp/__snapshots__/snapshot.test.ts.snap index 0ec4bcf0b..8dc026399 100644 --- a/src/__tests__/devapp/__snapshots__/snapshot.test.ts.snap +++ b/src/__tests__/devapp/__snapshots__/snapshot.test.ts.snap @@ -45,7 +45,7 @@ Resources: Properties: Code: S3Bucket: - Ref: AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3BucketF36B6862 + Ref: AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3Bucket8C070E54 S3Key: Fn::Join: - "" @@ -53,12 +53,12 @@ Resources: - 0 - Fn::Split: - "||" - - Ref: AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3VersionKeyB9A97C6A + - Ref: AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3VersionKey4C7389DF - Fn::Select: - 1 - Fn::Split: - "||" - - Ref: AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3VersionKeyB9A97C6A + - Ref: AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3VersionKey4C7389DF Role: Fn::GetAtt: - ConstructHubMonitoringWebCanaryHomePageHttpGetFunctionServiceRole9AAAD93C @@ -198,6 +198,150 @@ Resources: Fn::GetAtt: - ConstructHubPackageDataDC5EF35E - Arn + ConstructHubStagingBucket29942A98: + Type: AWS::S3::Bucket + Properties: + LifecycleConfiguration: + Rules: + - ExpirationInDays: 30 + Prefix: packages + Status: Enabled + UpdateReplacePolicy: Retain + DeletionPolicy: Retain + ConstructHubIngestionQueue637E4740: + Type: AWS::SQS::Queue + UpdateReplacePolicy: Delete + DeletionPolicy: Delete + ConstructHubDiscoveryFunctionServiceRoleD371794F: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Statement: + - Action: sts:AssumeRole + Effect: Allow + Principal: + Service: lambda.amazonaws.com + Version: 2012-10-17 + ManagedPolicyArns: + - Fn::Join: + - "" + - - "arn:" + - Ref: AWS::Partition + - :iam::aws:policy/service-role/AWSLambdaBasicExecutionRole + ConstructHubDiscoveryFunctionServiceRoleDefaultPolicyA09546EC: + Type: AWS::IAM::Policy + Properties: + PolicyDocument: + Statement: + - Action: sqs:SendMessage + Effect: Allow + Resource: + Fn::GetAtt: + - ConstructHubDiscoveryFunctionDeadLetterQueueFE498555 + - Arn + - Action: + - s3:GetObject* + - s3:GetBucket* + - s3:List* + - s3:DeleteObject* + - s3:PutObject* + - s3:Abort* + Effect: Allow + Resource: + - Fn::GetAtt: + - ConstructHubStagingBucket29942A98 + - Arn + - Fn::Join: + - "" + - - Fn::GetAtt: + - ConstructHubStagingBucket29942A98 + - Arn + - /* + - Action: + - sqs:SendMessage + - sqs:GetQueueAttributes + - sqs:GetQueueUrl + Effect: Allow + Resource: + Fn::GetAtt: + - ConstructHubIngestionQueue637E4740 + - Arn + Version: 2012-10-17 + PolicyName: ConstructHubDiscoveryFunctionServiceRoleDefaultPolicyA09546EC + Roles: + - Ref: ConstructHubDiscoveryFunctionServiceRoleD371794F + ConstructHubDiscoveryFunctionDeadLetterQueueFE498555: + Type: AWS::SQS::Queue + Properties: + MessageRetentionPeriod: 1209600 + UpdateReplacePolicy: Delete + DeletionPolicy: Delete + ConstructHubDiscoveryFunctionF5E139FD: + Type: AWS::Lambda::Function + Properties: + Code: + S3Bucket: + Ref: AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3Bucket1B6624AE + S3Key: + Fn::Join: + - "" + - - Fn::Select: + - 0 + - Fn::Split: + - "||" + - Ref: AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3VersionKey3A7A31C2 + - Fn::Select: + - 1 + - Fn::Split: + - "||" + - Ref: AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3VersionKey3A7A31C2 + Role: + Fn::GetAtt: + - ConstructHubDiscoveryFunctionServiceRoleD371794F + - Arn + DeadLetterConfig: + TargetArn: + Fn::GetAtt: + - ConstructHubDiscoveryFunctionDeadLetterQueueFE498555 + - Arn + Description: Periodically query npm.js index for new Constructs + Environment: + Variables: + STAGING_BUCKET_NAME: + Ref: ConstructHubStagingBucket29942A98 + QUEUE_URL: + Ref: ConstructHubIngestionQueue637E4740 + Handler: index.handler + MemorySize: 10240 + Runtime: nodejs14.x + Timeout: 900 + DependsOn: + - ConstructHubDiscoveryFunctionServiceRoleDefaultPolicyA09546EC + - ConstructHubDiscoveryFunctionServiceRoleD371794F + ConstructHubDiscoveryFunctionScheduleRuleE32FE899: + Type: AWS::Events::Rule + Properties: + ScheduleExpression: rate(5 minutes) + State: ENABLED + Targets: + - Arn: + Fn::GetAtt: + - ConstructHubDiscoveryFunctionF5E139FD + - Arn + Id: Target0 + ConstructHubDiscoveryFunctionScheduleRuleAllowEventRuledevConstructHubDiscoveryFunction9006704D902BB631: + Type: AWS::Lambda::Permission + Properties: + Action: lambda:InvokeFunction + FunctionName: + Fn::GetAtt: + - ConstructHubDiscoveryFunctionF5E139FD + - Arn + Principal: events.amazonaws.com + SourceArn: + Fn::GetAtt: + - ConstructHubDiscoveryFunctionScheduleRuleE32FE899 + - Arn ConstructHubTransliteratorServiceRole0F8A20C8: Type: AWS::IAM::Role Properties: @@ -258,7 +402,7 @@ Resources: Properties: Code: S3Bucket: - Ref: AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3Bucket33203C1D + Ref: AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3BucketCED66570 S3Key: Fn::Join: - "" @@ -266,12 +410,12 @@ Resources: - 0 - Fn::Split: - "||" - - Ref: AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3VersionKey4F4B0727 + - Ref: AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3VersionKeyAA8B8FD7 - Fn::Select: - 1 - Fn::Split: - "||" - - Ref: AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3VersionKey4F4B0727 + - Ref: AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3VersionKeyAA8B8FD7 Role: Fn::GetAtt: - ConstructHubTransliteratorServiceRole0F8A20C8 @@ -336,6 +480,11 @@ Resources: PathPattern: /packages/* TargetOriginId: devConstructHubWebAppDistributionOrigin2A726FD66 ViewerProtocolPolicy: allow-all + - CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6 + Compress: true + PathPattern: /index/packages.json + TargetOriginId: devConstructHubWebAppDistributionOrigin2A726FD66 + ViewerProtocolPolicy: allow-all CustomErrorResponses: - ErrorCode: 404 ResponseCode: 200 @@ -398,7 +547,7 @@ Resources: - CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536 - Arn SourceBucketNames: - - Ref: AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3Bucket266B8096 + - Ref: AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3Bucket265D5217 SourceObjectKeys: - Fn::Join: - "" @@ -406,12 +555,12 @@ Resources: - 0 - Fn::Split: - "||" - - Ref: AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3VersionKey12C0054C + - Ref: AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3VersionKeyA48E92EB - Fn::Select: - 1 - Fn::Split: - "||" - - Ref: AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3VersionKey12C0054C + - Ref: AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3VersionKeyA48E92EB DestinationBucketName: Ref: ConstructHubWebAppWebsiteBucket4B2B9DB2 Prune: true @@ -561,13 +710,13 @@ Resources: - - "arn:" - Ref: AWS::Partition - ":s3:::" - - Ref: AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3Bucket266B8096 + - Ref: AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3Bucket265D5217 - Fn::Join: - "" - - "arn:" - Ref: AWS::Partition - ":s3:::" - - Ref: AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3Bucket266B8096 + - Ref: AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3Bucket265D5217 - /* - Action: - s3:GetObject* @@ -644,18 +793,30 @@ Outputs: Export: Name: ConstructHubDomainName Parameters: - AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3Bucket33203C1D: + AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3Bucket1B6624AE: + Type: String + Description: S3 bucket for asset + "39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2" + AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2S3VersionKey3A7A31C2: + Type: String + Description: S3 key for asset version + "39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2" + AssetParameters39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2ArtifactHashAA3DB115: + Type: String + Description: Artifact hash for asset + "39dfa980beb6ec79ed5fc097276858af56f73316603b87c217b3eea012202cd2" + AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3BucketCED66570: Type: String Description: S3 bucket for asset - "05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13b" - AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bS3VersionKey4F4B0727: + "da254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305" + AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305S3VersionKeyAA8B8FD7: Type: String Description: S3 key for asset version - "05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13b" - AssetParameters05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13bArtifactHash5FFA3998: + "da254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305" + AssetParametersda254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305ArtifactHashE87E66EE: Type: String Description: Artifact hash for asset - "05a4032ed8a2cf958bb5e3ca79a7a1c6d2e7fe5b2eec42cc092416afb1efe13b" + "da254f731d96f448a42b847d5e631a6a426b230b48eab5b0862307875334e305" AssetParameterse9882ab123687399f934da0d45effe675ecc8ce13b40cb946f3e1d6141fe8d68S3BucketAEADE8C7: Type: String Description: S3 bucket for asset @@ -680,29 +841,29 @@ Parameters: Type: String Description: Artifact hash for asset "c24b999656e4fe6c609c31bae56a1cf4717a405619c3aa6ba1bc686b8c2c86cf" - AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3Bucket266B8096: + AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3Bucket265D5217: Type: String Description: S3 bucket for asset - "c3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766" - AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766S3VersionKey12C0054C: + "c9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524" + AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524S3VersionKeyA48E92EB: Type: String Description: S3 key for asset version - "c3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766" - AssetParametersc3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766ArtifactHashB8637A22: + "c9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524" + AssetParametersc9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524ArtifactHashABFB44E7: Type: String Description: Artifact hash for asset - "c3b739927b8d8e5b21b3e4282d406c32e80e5dd46e260bd74498542a9ccdb766" - AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3BucketF36B6862: + "c9cd5cf7cd05639608564a28ce3c6ce732dcfba9df2045d125302637301dc524" + AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3Bucket8C070E54: Type: String Description: S3 bucket for asset - "28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86e" - AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eS3VersionKeyB9A97C6A: + "dcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789d" + AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dS3VersionKey4C7389DF: Type: String Description: S3 key for asset version - "28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86e" - AssetParameters28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86eArtifactHash6467026A: + "dcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789d" + AssetParametersdcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789dArtifactHashF032B9A3: Type: String Description: Artifact hash for asset - "28199ce19bb6ddd0979b7fc89cc508c978ddae4336397e5321fae5ed56a0d86e" + "dcc427ad1a9c4d2a63344256acec911f0ef035359b814054fe1485aeb59e789d" `; diff --git a/src/backend/discovery/discovery.lambda.ts b/src/backend/discovery/discovery.lambda.ts index dd9de2e27..00a459de0 100644 --- a/src/backend/discovery/discovery.lambda.ts +++ b/src/backend/discovery/discovery.lambda.ts @@ -1,15 +1,17 @@ - import * as console from 'console'; import * as https from 'https'; +import * as process from 'process'; +import { URL } from 'url'; // eslint-disable-next-line import/no-unresolved import type { Context } from 'aws-lambda'; import * as AWS from 'aws-sdk'; import * as Nano from 'nano'; +import { IngestionInput, integrity } from '../shared'; -const TIMEOUT_MILLISECONDS = 10000; -const CONSTRUCT_KEYWORDS = ['cdk', 'aws-cdk', 'cdk8s', 'cdktf']; -const MARKER_FILE_NAME = 'marker'; +const TIMEOUT_MILLISECONDS = 10_000; +const CONSTRUCT_KEYWORDS: ReadonlySet = new Set(['cdk', 'aws-cdk', 'cdk8s', 'cdktf']); +const MARKER_FILE_NAME = 'couchdb-last-transaction-id'; const NPM_REPLICA_REGISTRY_URL = 'https://replicate.npmjs.com/'; /** @@ -17,12 +19,11 @@ const NPM_REPLICA_REGISTRY_URL = 'https://replicate.npmjs.com/'; */ const FAILED_CHANGE_PREFIX = 'failed'; -let s3: AWS.S3; -let sqs: AWS.SQS; +let s3: AWS.S3 | undefined; +let sqs: AWS.SQS | undefined; let stagingBucket: string; let queueUrl: string; -let functionContext: Context; /** * This function triggers on a fixed schedule and reads a stream of changes frm npmjs couchdb _changes endpoint. @@ -36,34 +37,32 @@ let functionContext: Context; * npm registry API docs: https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md * @param context a Lambda execution context */ -export async function handler(context: Context) { - s3 = new AWS.S3(); - sqs = new AWS.SQS(); - functionContext = context; +export async function handler(_request: unknown, context: Context) { + if (s3 == null) { + s3 = new AWS.S3(); + } + if (sqs == null) { + sqs = new AWS.SQS(); + } - if (!process.env?.STAGING_BUCKET_NAME) { - throw new Error('The STAGING_BUCKET environment variable is not set'); + if (!process.env.STAGING_BUCKET_NAME) { + throw new Error('The STAGING_BUCKET_NAME environment variable is not set'); } - stagingBucket = stagingBucket; + stagingBucket = process.env.STAGING_BUCKET_NAME; - if (!process.env?.QUEUE_URL) { - throw new Error('The NOTIFICATION_QUEUE_URL environment variable is not set'); + if (!process.env.QUEUE_URL) { + throw new Error('The QUEUE_URL environment variable is not set'); } queueUrl = process.env.QUEUE_URL; - AWS.config.update({ - region: process.env.AWS_REGION, - }); - // load marker from the staging bucket let marker; try { - const client = new AWS.S3(); - await client.getObject({ + await s3.getObject({ Bucket: stagingBucket, Key: MARKER_FILE_NAME, }).promise().then(function(data) { - marker = data.Body?.toString(); + marker = data.Body?.toString('utf-8'); }); } catch (error) { console.log(`Failed to load marker for bucket: ${stagingBucket}, will start read from latest`); @@ -75,7 +74,7 @@ export async function handler(context: Context) { includeDocs: true, // pause the changes reader after each request wait: true, - since: marker ?? 'now', + since: marker ?? '139369', // `changesReader.get` stops once a response with zero changes is received, however it waits too long // since we want to terminate the Lambda function we define a timeout shorter than the default timeout: TIMEOUT_MILLISECONDS, @@ -86,101 +85,96 @@ export async function handler(context: Context) { db.changesReader.get(config) .on('batch', async (batch: Change[]) => { - console.log(`Received a batch of ${batch.length} length`); + console.log(`Received a batch of ${batch.length} element(s)`); const batchPromises = batch // ignores changes which are not package update, see https://github.com/cdklabs/construct-hub/issues/3#issuecomment-858246275 .filter(change => change.doc.name) - .map(change => { - return processPackageUpdate(change) - .catch(err => { - Object.defineProperty(change, '_construct_hub_failure_reason', err); - return s3.putObject({ + .map(change => + processPackageUpdate(change, context) + .catch((err) => + s3!.putObject({ Bucket: stagingBucket, Key: `${FAILED_CHANGE_PREFIX}/${change.id}`, - Body: JSON.stringify(change, null, 2), + Body: JSON.stringify({ ...change, _construct_hub_failure_reason: err }, null, 2), Metadata: { - 'Lambda-Log-Group': functionContext.logGroupName, - 'Lambda-Log-Stream': functionContext.logStreamName, - 'Lambda-Run-Id': functionContext.awsRequestId, + 'Lambda-Log-Group': context.logGroupName, + 'Lambda-Log-Stream': context.logStreamName, + 'Lambda-Run-Id': context.awsRequestId, }, - }).promise().then(() => (void undefined)); - }); - }); + }).promise().then(() => (void undefined)))); - await Promise.all(batchPromises).then(function() { + await Promise.all(batchPromises).then(function () { // write the last sequence to the marker file in S3 const lastSequence = batch[batch.length - 1].seq; - return writeMarkerToS3(lastSequence); - }).then(function() { + return writeMarkerToS3(lastSequence, context); + }).then( // resume reader - (db.changesReader as any).resume(); - }).catch(function (error) { - throw Error(`Error while processing batch, marker will not be updated, exiting.\n ${error}`); - }); + () => (db.changesReader as any).resume(), + (error) => Promise.reject(new Error(`Error while processing batch, marker will not be updated, exiting.\n${error}`)), + ); }) .on('end', () => { console.log('Changes feed monitoring has stopped'); }); } -async function writeMarkerToS3(sequence: Number) { - const client = new AWS.S3(); - await client.putObject({ +async function writeMarkerToS3(sequence: Number, context: Context) { + if (process.env.SKIP_MARKER) { + return; + } + await s3!.putObject({ Bucket: stagingBucket, Key: MARKER_FILE_NAME, Body: sequence.toString(), Metadata: { - 'Lambda-Log-Group': functionContext.logGroupName, - 'Lambda-Log-Stream': functionContext.logStreamName, - 'Lambda-Run-Id': functionContext.awsRequestId, + 'Lambda-Log-Group': context.logGroupName, + 'Lambda-Log-Stream': context.logStreamName, + 'Lambda-Run-Id': context.awsRequestId, }, }).promise(); } -async function processPackageUpdate(change: Change) { - let latestVersion: VersionInfo; - try { - // we assume that the change is concerning the latest version - latestVersion = getLatestVersion(change); - if (!isJsiiModule(latestVersion) || !isConstruct(latestVersion)) { - return; - } - } catch (error) { - console.error(`Could not parse change for ${change.id}`); - throw error; +async function processPackageUpdate(change: Change, context: Context) { + console.log(`Processing transaction: ${change.seq}`); + if (Object.keys(change.doc.versions).length === 0) { + console.log(`Ignoring document ${change.id}, as it contains no versions`); + return; } - return new Promise((ok, ko) => { - // change.dist.tarball => https://registry.npmjs.org/<@scope>//-/-.tgz - // staging bucket key => packages/<@scope>//-/-.tgz - const key = latestVersion.dist.tarball.replace('https://registry.npmjs.org', 'packages'); - copyPackageToS3(latestVersion, key).then(() => { - return sendSqsMessage(latestVersion, key); - }).catch(function(reason) { - console.error(`Error processing change for ${change.id}:\n ${reason}`); - ko(); - }); - }); + const [latestVersion, publishTime] = getLatestVersion(change); + if (latestVersion == null || !isJsiiModule(latestVersion) || !isConstruct(latestVersion)) { + console.log(`Ignoring document ${change.id}, as it is not relevant`); + return; + } + + // change.dist.tarball => https://registry.npmjs.org/<@scope>//-/-.tgz + // staging bucket key => packages/<@scope>//-/-.tgz + const key = `packages/${new URL(latestVersion.dist.tarball).pathname}`; + const tarball = await copyPackageToS3(latestVersion, key, context); + await sendSqsMessage(latestVersion, tarball, publishTime, change.seq, key); } /** * Copy the tarball from the npm registry to S3 */ -async function copyPackageToS3(versionInfo: VersionInfo, key: string): Promise { +async function copyPackageToS3(versionInfo: VersionInfo, key: string, context: Context): Promise { console.log(`uploading tarball to s3, key: ${key}`); - return new Promise((ok, ko) => { - https.get(versionInfo.dist.tarball, function (response /* Readable */) { - s3.putObject({ + return new Promise((ok, ko) => { + https.get(versionInfo.dist.tarball, (response) => { + const buffer = Buffer.from(response); + s3!.putObject({ Bucket: stagingBucket, Key: key, - Body: response, + Body: buffer, + ContentType: 'application/x-gtar', Metadata: { - 'Lambda-Log-Group': functionContext.logGroupName, - 'Lambda-Log-Stream': functionContext.logStreamName, - 'Lambda-Run-Id': functionContext.awsRequestId, + 'Lambda-Log-Group': context.logGroupName, + 'Lambda-Log-Stream': context.logStreamName, + 'Lambda-Run-Id': context.awsRequestId, + 'Origin-Uri': versionInfo.dist.tarball, }, - }).promise().then(() => ok(), ko); - }).on('error', function (error) { + }).promise().then(() => ok(buffer), ko); + }).on('error', (error) => { console.error(`Error attempting to stage tarball in S3: ${error}`); ko(`Failed downloading file from ${versionInfo.dist.tarball}`); }); @@ -192,20 +186,22 @@ async function copyPackageToS3(versionInfo: VersionInfo, key: string): Promise { - console.log(`posting sqs message for ${versionInfo.packageName}`); - const message: Message = { - packageName: versionInfo.name, - time: new Date(versionInfo.time.modified), +async function sendSqsMessage(versionInfo: VersionInfo, tarball: Buffer, publishTime: Date, transactionId: number, key: string): Promise { + console.log(`Posting sqs message for ${versionInfo.packageName}`); + const messageBase = { tarballUri: `s3://${stagingBucket}/${key}`, + metadata: { tid: transactionId.toFixed() }, + time: publishTime.toUTCString(), + }; + const message: IngestionInput = { + ...messageBase, + integrity: integrity(messageBase, tarball), }; - await sqs.sendMessage({ - MessageBody: JSON.stringify(message), + await sqs!.sendMessage({ + MessageBody: JSON.stringify(message, null, 2), QueueUrl: queueUrl, - }).promise().catch(function(error) { - throw Error(`Failed sending message to SQS\n ${error}`); - }); + }).promise(); } /** @@ -213,20 +209,32 @@ async function sendSqsMessage(versionInfo: VersionInfo, key: string): Promise key !== 'created' && key !== 'modified') + // Sort by timestamp, descending + .sort(([, ld], [, rd]) => new Date(rd).getTime() - new Date(ld).getTime()) + // First entry is most recently changed version + [0]; + + return [ + update.doc.versions[lastModifiedVersion], + new Date(update.doc.time[lastModifiedVersion]), + ]; } /** @@ -236,7 +244,7 @@ function getLatestVersion(update: Change): VersionInfo { */ function isConstruct(pkgJason: VersionInfo): boolean { // currently we only check for specific keywords - return pkgJason.keywords?.some(k => CONSTRUCT_KEYWORDS.includes(k)); + return pkgJason.keywords?.some(k => CONSTRUCT_KEYWORDS.has(k)); } /** @@ -246,7 +254,7 @@ function isConstruct(pkgJason: VersionInfo): boolean { interface VersionInfo { readonly devDependencies: { readonly [name: string]: string }; readonly dependencies: { readonly [name: string]: string }; - readonly jsii: {}; + readonly jsii: unknown; readonly name: string; readonly [key: string]: unknown; readonly keywords: string[]; @@ -255,37 +263,34 @@ interface VersionInfo { readonly tarball: string; }; readonly version: string; - readonly time: { - readonly modified: string; - readonly created: string; - readonly [key: string]: string; - }; } interface Document { /** - * a List of all Version objects for the package - */ - readonly versions: {[key:string]: VersionInfo}; + * a List of all Version objects for the package + */ + readonly versions: { [key:string]: VersionInfo | undefined }; /** - * An object with at least one key, latest, representing dist-tags - */ - readonly 'dist-tags': {latest: string}; - + * The package's name. + */ readonly name: string; + + /** + * Timestamps associated with this document. The values are ISO-8601 encoded + * timestamps. + */ + readonly time: { + readonly created: string; + readonly modified: string; + readonly [version: string]: string; + }; } interface Change { - readonly seq: Number; + readonly seq: number; readonly doc: Document; readonly id: string; readonly deleted: boolean; } - -interface Message { - readonly packageName: string; - readonly tarballUri?: string; - readonly time: Date; -} \ No newline at end of file diff --git a/src/backend/discovery/index.ts b/src/backend/discovery/index.ts index 00408c65b..1e026cd7d 100644 --- a/src/backend/discovery/index.ts +++ b/src/backend/discovery/index.ts @@ -1,7 +1,7 @@ import { Rule, Schedule } from '@aws-cdk/aws-events'; import { LambdaFunction } from '@aws-cdk/aws-events-targets'; import { RetentionDays } from '@aws-cdk/aws-logs'; -import { Bucket, EventType } from '@aws-cdk/aws-s3'; +import { Bucket } from '@aws-cdk/aws-s3'; import { Queue } from '@aws-cdk/aws-sqs'; import { Construct, Duration } from '@aws-cdk/core'; diff --git a/src/backend/shared/index.ts b/src/backend/shared/index.ts new file mode 100644 index 000000000..dbd0b3ff7 --- /dev/null +++ b/src/backend/shared/index.ts @@ -0,0 +1,2 @@ +export * from './ingestion-input'; +export * from './integrity'; diff --git a/src/backend/shared/ingestion-input.ts b/src/backend/shared/ingestion-input.ts new file mode 100644 index 000000000..69147b5dd --- /dev/null +++ b/src/backend/shared/ingestion-input.ts @@ -0,0 +1,25 @@ +/** + * Input payload for the Ingestion function. This is the format of the message + * the discovery function should use when signalling the intake queue. + */ +export interface IngestionInput { + /** + * The integrity checksum of this message. + */ + readonly integrity: string; + + /** + * Any metadata associated with the package by the discovery function. + */ + readonly metadata: { readonly [key: string]: string }; + + /** + * The URI to an npm package tarball. + */ + readonly tarballUri: string; + + /** + * The time at which the version was published, encoded in ISO-8601 format. + */ + readonly time: string; +} diff --git a/src/backend/shared/integrity.ts b/src/backend/shared/integrity.ts new file mode 100644 index 000000000..ab052ace8 --- /dev/null +++ b/src/backend/shared/integrity.ts @@ -0,0 +1,30 @@ +import { createHash } from 'crypto'; +import type { IngestionInput } from './ingestion-input'; + +/** + * Computes an integrity checksum for the provided `IngestionInput`. + * + * @param input the `IngestionInput` for which to make a checksum. + * @param tarball the content of the `.tgz` npm package + * @param alg the hash algorithm to use (e.g: 'sha384') + * + * @returns the computed checksum. + */ +export function integrity(input: Input, tarball: Buffer, alg = input.integrity?.split('-')[0] ?? 'sha384'): string { + const hash = createHash(alg); + const addField = (name: string, data: string | Buffer) => + // $name $data + hash.update('\x01').update(name).update('\x02').update(data).update('\x03'); + + for (const [name, value] of Object.entries(input.metadata ?? {}).sort(([l], [r]) => l.localeCompare(r))) { + addField(`metadata/${name}`, value); + } + addField('tarball', tarball); + addField('time', input.time); + + return `${alg}-${hash.digest('base64')}`; +} + +interface Input extends Omit { + readonly integrity?: string; +} diff --git a/src/backend/transliterator/transliterator.lambda.ts b/src/backend/transliterator/transliterator.lambda.ts index 851cde814..178baf507 100644 --- a/src/backend/transliterator/transliterator.lambda.ts +++ b/src/backend/transliterator/transliterator.lambda.ts @@ -12,7 +12,9 @@ import { TargetLanguage } from 'jsii-rosetta'; import { transliterateAssembly } from 'jsii-rosetta/lib/commands/transliterate'; const clients = new Map(); + const PACKAGE_KEY_REGEX = /^packages\/((?:@[^/]+\/)?[^/]+)\/v([^/]+)\/package.tgz$/; +// Capture groups: ┗━━━━━━━━1━━━━━━━━┛ ┗━━2━━┛ /** * This function receives an S3 event, and for each record, proceeds to download @@ -25,14 +27,19 @@ const PACKAGE_KEY_REGEX = /^packages\/((?:@[^/]+\/)?[^/]+)\/v([^/]+)\/package.tg * @returns nothing */ export async function handler(event: S3Event, context: Context): Promise { - console.error(JSON.stringify(event, null, 2)); + console.log(JSON.stringify(event, null, 2)); const created = new Array(); for (const record of event.Records) { - const [, packageName, packageVersion] = record.s3.object.key.match(PACKAGE_KEY_REGEX) ?? []; + // Key names are escaped (`@` as `%40`) in the input payload... Decode it here... We cannot use + // `decodeURI` here because it does not undo encoding that `encodeURI` would not have done, and + // that would not replace `@` in the position where it is in the keys... So we have to work on + // the URI components instead. + const inputKey = record.s3.object.key.split('/').map((comp) => decodeURIComponent(comp)).join('/'); + const [, packageName, packageVersion] = inputKey.match(PACKAGE_KEY_REGEX) ?? []; if (packageName == null) { - throw new Error(`Invalid object key: "${record.s3.object.key}". It was expected to match ${PACKAGE_KEY_REGEX}!`); + throw new Error(`Invalid object key: "${inputKey}". It was expected to match ${PACKAGE_KEY_REGEX}!`); } const client = (clients.has(record.awsRegion) @@ -40,9 +47,13 @@ export async function handler(event: S3Event, context: Context): Promise packages/[<@scope>/]/v/package.tgz // Output object key => packages/[<@scope>/]/v/assembly-python.json - const key = record.s3.object.key.replace(/\/[^/]+$/, '/assembly-python.json'); + const key = inputKey.replace(/\/[^/]+$/, '/assembly-python.json'); const response = await client.putObject({ Bucket: record.s3.bucket.name, Key: key, @@ -105,6 +116,13 @@ export async function handler(event: S3Event, context: Context): Promise=6.0.0 <=6.1.1": - version "6.1.1" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" - integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4= - emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -7096,11 +6950,6 @@ enquirer@^2.3.5: dependencies: ansi-colors "^4.1.1" -entities@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" @@ -7218,10 +7067,10 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" -esbuild@^0.12.2: - version "0.12.6" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.12.6.tgz#85bc755c7cf3005d4f34b4f10f98049ce0ee67ce" - integrity sha512-RDvVLvAjsq/kIZJoneMiUOH7EE7t2QaW7T3Q7EdQij14+bZbDq5sndb0tTanmHIFSqZVMBMMyqzVHkS3dJobeA== +esbuild@^0.12.8: + version "0.12.8" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.12.8.tgz#ac90da77cb3bfbf49ab815200bcef7ffe1a3348f" + integrity sha512-sx/LwlP/SWTGsd9G4RlOPrXnIihAJ2xwBUmzoqe2nWwbXORMQWtAGNJNYLBJJqa3e9PWvVzxdrtyFZJcr7D87g== escalade@^3.0.2, escalade@^3.1.1: version "3.1.1" @@ -7319,7 +7168,7 @@ eslint-plugin-flowtype@^5.2.0: lodash "^4.17.15" string-natural-compare "^3.0.1" -eslint-plugin-import@^2.22.1, eslint-plugin-import@^2.23.3: +eslint-plugin-import@^2.22.1, eslint-plugin-import@^2.23.4: version "2.23.4" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz#8dceb1ed6b73e46e50ec9a5bb2411b645e7d3d97" integrity sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ== @@ -7446,7 +7295,7 @@ eslint-webpack-plugin@^2.5.2: normalize-path "^3.0.0" schema-utils "^3.0.0" -eslint@^7.11.0, eslint@^7.27.0: +eslint@^7.11.0, eslint@^7.28.0: version "7.28.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.28.0.tgz#435aa17a0b82c13bb2be9d51408b617e49c1e820" integrity sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g== @@ -7710,15 +7559,6 @@ extend@^3.0.0, extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" @@ -7796,7 +7636,7 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== -figures@^3.0.0, figures@^3.1.0: +figures@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -8306,13 +8146,6 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" -github-slugger@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.3.0.tgz#9bd0a95c5efdfc46005e82a906ef8e2a059124c9" - integrity sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q== - dependencies: - emoji-regex ">=6.0.0 <=6.1.1" - glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -8410,13 +8243,6 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -good-listener@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" - integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= - dependencies: - delegate "^3.1.2" - got@^11.8.2: version "11.8.2" resolved "https://registry.yarnpkg.com/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599" @@ -8652,11 +8478,6 @@ hast-util-to-parse5@^6.0.0: xtend "^4.0.0" zwitch "^1.0.0" -hast-util-to-string@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz#9b24c114866bdb9478927d7e9c36a485ac728378" - integrity sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w== - hastscript@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" @@ -8803,17 +8624,15 @@ html-webpack-plugin@4.5.0: tapable "^1.1.3" util.promisify "1.0.0" -htmlparser2@^3.10.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: version "4.1.0" @@ -8932,7 +8751,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -9113,25 +8932,6 @@ inline-style-parser@0.1.1: resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== -inquirer@^7.3.3: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -9894,13 +9694,13 @@ jest-jasmine2@^26.6.3: throat "^5.0.0" jest-junit@^12: - version "12.1.0" - resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-12.1.0.tgz#f27173529e7f8f10eac37beb30f8b9bc97e8f3c3" - integrity sha512-Z45INyzEAqTkCHX/hGCPgVFfZP3hQVgI68CgoEwkCiBuxETsPsniq5yPd8oxbMMHtDCpUlxXzoq7jY35dcuLKw== + version "12.2.0" + resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-12.2.0.tgz#cff7f9516e84f8e30f6bdea04cd84db6b095a376" + integrity sha512-ecGzF3KEQwLbMP5xMO7wqmgmyZlY/5yWDvgE/vFa+/uIT0KsU5nluf0D2fjIlOKB+tb6DiuSSpZuGpsmwbf7Fw== dependencies: mkdirp "^1.0.4" strip-ansi "^5.2.0" - uuid "^3.3.3" + uuid "^8.3.2" xml "^1.0.1" jest-leak-detector@^26.6.2: @@ -10251,7 +10051,7 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -jsii-diff@^1.29.0: +jsii-diff@^1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/jsii-diff/-/jsii-diff-1.30.0.tgz#b905760ddf5e29c6c6ef31b8c670a2d1db7291c0" integrity sha512-74GeV8ab8BrS3k8h8HKnI8f5PecsRahflElxJuc6bI9xA5AhRAzBF/Lrt5HibuYPuSsyLAmhTU1GTHdRvKq8aA== @@ -10263,17 +10063,17 @@ jsii-diff@^1.29.0: typescript "~3.9.9" yargs "^16.2.0" -jsii-docgen@^1.8.85: - version "1.8.89" - resolved "https://registry.yarnpkg.com/jsii-docgen/-/jsii-docgen-1.8.89.tgz#81f71da20161e293ef9d08de2b6a8153cbf12584" - integrity sha512-gb6N86ePVwGlQqZjkOzR70z0QpTh51P6/+gPGlRva5ndVIO5CzRv7qAFQhHcBgv7dTkH34qu8ncIUkMxMXCzpw== +jsii-docgen@^1.8.96: + version "1.8.96" + resolved "https://registry.yarnpkg.com/jsii-docgen/-/jsii-docgen-1.8.96.tgz#e8684288b5116868a9e4c9e1c9743eeb4f31c102" + integrity sha512-5FqDTBR/Bu5RUZ3/EIuD8ElaBuy9WXp0AbNP3tyi46HaLwRCYMlkz1myesVLMp66TD+uqUjeF9XrqQG2UkByxA== dependencies: "@jsii/spec" "^1.30.0" fs-extra "^9.1.0" jsii-reflect "^1.30.0" yargs "^16.2.0" -jsii-pacmak@^1.29.0: +jsii-pacmak@^1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/jsii-pacmak/-/jsii-pacmak-1.30.0.tgz#a6a7570da1388027ce4e5ca1603d4144f341d307" integrity sha512-hYvISYBXZ5WL/+LtG3HpVrimguqAoWa3D8jaqsnoiIGrdmaxKCZ0VnioJYxEX7wVamYuCwXu5NFx/b31BspU6A== @@ -10325,7 +10125,7 @@ jsii-rosetta@^1.30.0: xmldom "^0.6.0" yargs "^16.2.0" -jsii@^1.29.0: +jsii@^1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/jsii/-/jsii-1.30.0.tgz#fe20f60e33d0beaae24bc6537fb623333e913da4" integrity sha512-TfVHhGjP0QiTEkyfnxrDIE8Da+itxnNUK2YoD69qIPAzmZ58goKVqK4sbXrXz2urHSToGLDmWI8+H69cLeVjJw== @@ -10798,11 +10598,6 @@ loglevel@^1.6.8: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== -longest-streak@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" - integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== - loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -10929,13 +10724,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown-table@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" - integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== - dependencies: - repeat-string "^1.0.0" - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -10961,15 +10749,6 @@ mdast-util-definitions@^4.0.0: dependencies: unist-util-visit "^2.0.0" -mdast-util-find-and-replace@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" - integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA== - dependencies: - escape-string-regexp "^4.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - mdast-util-from-markdown@^0.8.0: version "0.8.5" resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" @@ -10981,48 +10760,6 @@ mdast-util-from-markdown@^0.8.0: parse-entities "^2.0.0" unist-util-stringify-position "^2.0.0" -mdast-util-gfm-autolink-literal@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7" - integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A== - dependencies: - ccount "^1.0.0" - mdast-util-find-and-replace "^1.1.0" - micromark "^2.11.3" - -mdast-util-gfm-strikethrough@^0.2.0: - version "0.2.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" - integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA== - dependencies: - mdast-util-to-markdown "^0.6.0" - -mdast-util-gfm-table@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf" - integrity sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ== - dependencies: - markdown-table "^2.0.0" - mdast-util-to-markdown "~0.6.0" - -mdast-util-gfm-task-list-item@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10" - integrity sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A== - dependencies: - mdast-util-to-markdown "~0.6.0" - -mdast-util-gfm@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c" - integrity sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ== - dependencies: - mdast-util-gfm-autolink-literal "^0.1.0" - mdast-util-gfm-strikethrough "^0.2.0" - mdast-util-gfm-table "^0.1.0" - mdast-util-gfm-task-list-item "^0.1.0" - mdast-util-to-markdown "^0.6.1" - mdast-util-to-hast@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" @@ -11037,23 +10774,6 @@ mdast-util-to-hast@^10.2.0: unist-util-position "^3.0.0" unist-util-visit "^2.0.0" -mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0: - version "0.6.5" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" - integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== - dependencies: - "@types/unist" "^2.0.0" - longest-streak "^2.0.0" - mdast-util-to-string "^2.0.0" - parse-entities "^2.0.0" - repeat-string "^1.0.0" - zwitch "^1.0.0" - -mdast-util-to-string@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527" - integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== - mdast-util-to-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" @@ -11161,52 +10881,7 @@ microevent.ts@~0.1.1: resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== -micromark-extension-gfm-autolink-literal@~0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" - integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw== - dependencies: - micromark "~2.11.3" - -micromark-extension-gfm-strikethrough@~0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" - integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm-table@~0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b" - integrity sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm-tagfilter@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad" - integrity sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q== - -micromark-extension-gfm-task-list-item@~0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8" - integrity sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm@^0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz#36d1a4c089ca8bdfd978c9bd2bf1a0cb24e2acfe" - integrity sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A== - dependencies: - micromark "~2.11.0" - micromark-extension-gfm-autolink-literal "~0.5.0" - micromark-extension-gfm-strikethrough "~0.6.5" - micromark-extension-gfm-table "~0.4.0" - micromark-extension-gfm-tagfilter "~0.3.0" - micromark-extension-gfm-task-list-item "~0.3.0" - -micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: +micromark@~2.11.0: version "2.11.4" resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== @@ -11493,7 +11168,7 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" -mute-stream@0.0.8, mute-stream@~0.0.4: +mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== @@ -11733,6 +11408,11 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== +normalize-url@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.0.1.tgz#a4f27f58cf8c7b287b440b8a8201f42d0b00d256" + integrity sha512-VU4pzAuh7Kip71XEmO9aNREYAdMHFGTVj/i+CaTImS8x0i1d3jUZkXhqluy/PRgjPLMgsLQulYY3PJ/aSbSjpQ== + npm-bundled@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" @@ -11857,6 +11537,13 @@ nth-check@^1.0.2: dependencies: boolbase "~1.0.0" +nth-check@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" + integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== + dependencies: + boolbase "^1.0.0" + null-check@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" @@ -12070,11 +11757,6 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -13208,18 +12890,18 @@ postcss@7.0.21: supports-color "^6.1.0" postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.35" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" - integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + version "7.0.36" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" + integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== dependencies: chalk "^2.4.2" source-map "^0.6.1" supports-color "^6.1.0" postcss@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.0.tgz#b1a713f6172ca427e3f05ef1303de8b65683325f" - integrity sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ== + version "8.3.3" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.3.tgz#ef412a7a67e85c5b2c9f0ab3c4d9e8a3814d55cc" + integrity sha512-gnXd9C4bGKevvlNFd80I8WfxHX+g6MR+W2h19PlDNHUuT9248rHTvCIDeZI3Hvs5mB3gzXiNDwVK3S153WJbZA== dependencies: colorette "^1.2.2" nanoid "^3.1.23" @@ -13273,13 +12955,6 @@ printj@~1.1.0: resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== -prismjs@~1.23.0: - version "1.23.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.23.0.tgz#d3b3967f7d72440690497652a9d40ff046067f33" - integrity sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA== - optionalDependencies: - clipboard "^2.0.0" - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -13295,10 +12970,10 @@ progress@^2.0.0, progress@^2.0.3: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -projen@^0.22.11: - version "0.22.11" - resolved "https://registry.yarnpkg.com/projen/-/projen-0.22.11.tgz#9d792838bb8f427008bd0570b4f3feb8bcefad64" - integrity sha512-i7PMJg0znJ+bnxB34wPn9QZwU2uAhmsT9qfzPBrAvvHVXYkzHRTJhI9usE2w+WJmHD5bYNGb4qVcVXOeKXsYqQ== +projen@^0.24.7: + version "0.24.7" + resolved "https://registry.yarnpkg.com/projen/-/projen-0.24.7.tgz#b3a46103470db9621a3652b5e0591086a6c3e297" + integrity sha512-2nSpzCrQKH2M7KfSyS758tpH0ZWJsbe9HK7xs+Rjlk8fUrKts/T77WsI+5kL1JzkCW7H9rQjI4qmYmG5pYyQpA== dependencies: "@iarna/toml" "^2.2.5" chalk "^4.1.1" @@ -13306,7 +12981,6 @@ projen@^0.22.11: fs-extra "^9.1.0" glob "^7" ini "^2.0.0" - inquirer "^7.3.3" semver "^7.3.5" shx "^0.3.3" xmlbuilder2 "^2.4.1" @@ -13690,7 +13364,7 @@ react-is@^17.0.0, react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-markdown@6.0.2: +react-markdown@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-6.0.2.tgz#d89be45c278b1e5f0196f851fffb11e30c69f027" integrity sha512-Et2AjXAsbmPP1nLQQRqmVgcqzfwcz8uQJ8VAdADs8Nk/aaUA0YeU9RDLuCtD+GwajCnm/+Iiu2KPmXzmD/M3vA== @@ -13998,15 +13672,6 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -refractor@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.3.1.tgz#ebbc04b427ea81dc25ad333f7f67a0b5f4f0be3a" - integrity sha512-vaN6R56kLMuBszHSWlwTpcZ8KTMG6aUCok4GrxYDT20UIOXxOc5o6oDc8tNTzSlH3m2sI+Eu9Jo2kVdDcUTWYw== - dependencies: - hastscript "^6.0.0" - parse-entities "^2.0.0" - prismjs "~1.23.0" - regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -14058,9 +13723,9 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0, regexp.prototype.f define-properties "^1.1.3" regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^4.7.1: version "4.7.1" @@ -14100,42 +13765,18 @@ regjsparser@^0.6.4: dependencies: jsesc "~0.5.0" -rehype-raw@5.1.0: +rehype-raw@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-5.1.0.tgz#66d5e8d7188ada2d31bc137bc19a1000cf2c6b7e" integrity sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA== dependencies: hast-util-raw "^6.1.0" -rehype-rewrite@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/rehype-rewrite/-/rehype-rewrite-1.0.2.tgz#3534a954f56246e68e8b7fdaa1ea29c5d9734b12" - integrity sha512-B0cf4ziX1jJ0T2Dn6h8yA+CsUepFPrXlaNaFKTXJVRdKhpJWerMryzR5NlTjUEDPkTQb5euo3HNuJ8RFTH7qnQ== - dependencies: - ts-mdast "1.0.0" - unified "9.2.1" - relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= -remark-autolink-headings@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/remark-autolink-headings/-/remark-autolink-headings-6.0.1.tgz#074470b8ec7714a0f06fa151e293152bf9723df9" - integrity sha512-LTV5G5NMjypHEr14tMNJ36yrP+xwT7mejJelZOPXKiF5WvRH9o36zXnr2QGqfms2yVASNpDaC9NBOwKlJJKuQw== - dependencies: - extend "^3.0.0" - unist-util-visit "^2.0.0" - -remark-gfm@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-1.0.0.tgz#9213643001be3f277da6256464d56fd28c3b3c0d" - integrity sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA== - dependencies: - mdast-util-gfm "^0.1.0" - micromark-extension-gfm "^0.3.0" - remark-parse@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" @@ -14150,15 +13791,6 @@ remark-rehype@^8.0.0: dependencies: mdast-util-to-hast "^10.2.0" -remark-slug@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-6.0.0.tgz#2b54a14a7b50407a5e462ac2f376022cce263e2c" - integrity sha512-ln67v5BrGKHpETnm6z6adlJPhESFJwfuZZ3jrmi+lKTzeZxh2tzFzUfDD4Pm2hRGOarHLuGToO86MNMZ/hA67Q== - dependencies: - github-slugger "^1.0.0" - mdast-util-to-string "^1.0.0" - unist-util-visit "^2.0.0" - remote-git-tags@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remote-git-tags/-/remote-git-tags-3.0.0.tgz#424f8ec2cdea00bb5af1784a49190f25e16983c3" @@ -14170,22 +13802,22 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= renderkid@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.5.tgz#483b1ac59c6601ab30a7a596a5965cabccfdd0a5" - integrity sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ== + version "2.0.7" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" + integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== dependencies: - css-select "^2.0.2" - dom-converter "^0.2" - htmlparser2 "^3.10.1" - lodash "^4.17.20" - strip-ansi "^3.0.0" + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^3.0.1" repeat-element@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== -repeat-string@^1.0.0, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -14341,14 +13973,6 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -14454,11 +14078,6 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -14473,13 +14092,6 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -14590,11 +14202,6 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -select@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" - integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= - selfsigned@^1.10.8: version "1.10.11" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" @@ -15651,7 +15258,7 @@ through2@^4.0.0: dependencies: readable-stream "3" -through@2, "through@>=2.2.7 <3", through@^2.3.6: +through@2, "through@>=2.2.7 <3": version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -15673,11 +15280,6 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" - integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== - tiny-invariant@^1.0.2, tiny-invariant@^1.0.6: version "1.1.0" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" @@ -15693,13 +15295,6 @@ tinycolor2@1.4.2: resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -15816,14 +15411,6 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -ts-mdast@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ts-mdast/-/ts-mdast-1.0.0.tgz#62c1b5cb0c63dcab044f7f998f280700d504b57e" - integrity sha512-FmT5GbMU629/ty64741v7TdO8jm5xW09okr2VNExkLuRk5ngjKIDdn/woTB8lDtcgCMRS8lUNubImen0MkdF6g== - dependencies: - "@types/mdast" "^3.0.3" - "@types/unist" "^2.0.3" - ts-pnp@1.2.0, ts-pnp@^1.1.6: version "1.2.0" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" @@ -15839,16 +15426,21 @@ tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.0.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@^1.0.0, tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0: +tslib@^2.0.1: version "2.2.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== +tslib@^2.0.3, tslib@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -16000,7 +15592,7 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== -unified@9.2.1, unified@^9.0.0: +unified@^9.0.0: version "9.2.1" resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3" integrity sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA== @@ -16095,7 +15687,7 @@ unist-util-visit-parents@^3.0.0: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: +unist-util-visit@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== @@ -16279,7 +15871,7 @@ uuid@3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== -uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: +uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==