diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..402505f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 7b35f35..d8b9147 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -1,25 +1,42 @@ name: Typedoc build and deploy doc to GH pages on: - push: - branches: ["main"] + push: + branches: ["main"] - workflow_dispatch: + workflow_dispatch: permissions: - contents: write + contents: write jobs: - build-and-deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 + build-and-deploy: + runs-on: ubuntu-latest + steps: + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT + - uses: actions/cache@v4 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- - - name: Install and Build - run: | - npm ci - npm run doc + - uses: actions/checkout@v4 + - name: Enable Corepack + run: corepack enable + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: "yarn" - - name: Deploy - uses: JamesIves/github-pages-deploy-action@v4 - with: - folder: dist/docs + - name: Install and Build + run: | + yarn install --immutable + yarn run doc + + - name: Deploy + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: dist/docs diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml index d0b5a17..f13b419 100644 --- a/.github/workflows/shellcheck.yml +++ b/.github/workflows/shellcheck.yml @@ -13,4 +13,4 @@ jobs: - name: Install shellcheck run: sudo apt-get install shellcheck - name: Run shellcheck - run: shellcheck assets/*.sh + run: for file in $(find ./source-repo -type f -iname "*.sh"); do shellcheck $file; done; diff --git a/.github/workflows/test-cdk.yml b/.github/workflows/test-cdk.yml index 1e41c1d..35327de 100644 --- a/.github/workflows/test-cdk.yml +++ b/.github/workflows/test-cdk.yml @@ -13,13 +13,26 @@ jobs: node-version: [22.x] steps: - - name: Check out repository code - uses: actions/checkout@v3 + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "dir=$(yarn config get cacheFolder)" >> $GITHUB_OUTPUT + - uses: actions/cache@v4 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - uses: actions/checkout@v4 + - name: Enable Corepack + run: corepack enable - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - - run: npm ci - - run: npm run check - - run: npm run build --if-present - - run: npm test + cache: "yarn" + - run: yarn install --immutable + - run: yarn run check + - run: yarn run build + - run: yarn test diff --git a/.gitignore b/.gitignore index 0c7cc51..a566ebf 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,15 @@ node_modules dist +# yarn asset +yarn-install.log +.yarn/* +!.yarn/releases/ +!.yarn/plugins/ +!.yarn/versions/ +!.yarn/sdks/ +.pnp.* + # CDK asset staging directory .cdk.staging cdk.out @@ -16,3 +25,6 @@ cdk.context.json # Ignore Mac DS_Store files **/.DS_Store + +assets +source-zip diff --git a/.yarn/sdks/eslint/package.json b/.yarn/sdks/eslint/package.json new file mode 100644 index 0000000..f8cd8f7 --- /dev/null +++ b/.yarn/sdks/eslint/package.json @@ -0,0 +1,27 @@ +{ + "name": "eslint", + "version": "9.20.1-sdk", + "main": "./lib/api.js", + "type": "commonjs", + "bin": { + "eslint": "./bin/eslint.js" + }, + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "default": "./lib/api.js" + }, + "./package.json": "./package.json", + "./use-at-your-own-risk": { + "types": "./lib/types/use-at-your-own-risk.d.ts", + "default": "./lib/unsupported-api.js" + }, + "./rules": { + "types": "./lib/types/rules/index.d.ts" + }, + "./universal": { + "types": "./lib/types/universal.d.ts", + "default": "./lib/universal.js" + } + } +} diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..3186f3f --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/README.md b/README.md index 0a268b0..657fbfd 100644 --- a/README.md +++ b/README.md @@ -1,122 +1,401 @@ # aws4embeddedlinux-ci -This [cdk](https://github.com/aws/aws-cdk) IaC library helps you to deploy AWS cloud infrastructure to allow embedded Linux builds for your project. +The `aws4embeddedlinux-ci` library helps you deploy an AWS cloud infrastructure supporting the Embedded Linux builds for your project using [AWS CDK](https://github.com/aws/aws-cdk). + +## Table of Contents + +1. [Architecture](#architecture) +1. [API documentation](#api-documentation) +1. [Project Build with AWS CodePipeline](#project-build-with-aws-codepipeline) +1. [Project Build with AWS CodeBuild as Action Runner](#project-build-with-aws-codebuild-as-action-runner) +1. [Setup](#setup) +1. [Development Setup](#development-setup) +1. [Known issues](#known-issues) +1. [Security](#security) +1. [Contributing](#contributing) +1. [License](#license) ## Architecture -![architecture overview](images/architecture.svg "Architecture") + +This is the overall architecture pattern used to deploy the build pipeline: + +![architecture overview](images/architecture-v0.2.x.svg "Architecture") + +[Bask to the top](#aws4embeddedlinux-ci) ## API documentation -[API documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci/) generated by `npm run doc` -# Setting Up -In order to use this library, you must set up the [CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html), including -installing the CDK tool and bootstrapping the account you wish to deploy to. Additionally, you must have [Node](https://nodejs.org/en/) installed. +The [API documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci/) is generated automatically using [Typedoc](https://typedoc.org/). + +[Bask to the top](#aws4embeddedlinux-ci) + +## Project Build with AWS CodePipeline + +Several pipelines are provided in this library, each one demonstrating a different aspect of how to build a Yocto image with AWS. + +Once deployed, ou can review the pipeline execution from the `Developer Tools > Pipeline - CodePipeline > Pipelines` page in the AWS Console. + +From the pipeline page, you can find the source repository (S3), the CodeBuild Project (with the build logs), and the S3 bucket that the image is uploaded to, at the end. + +Each pipelines will refresh/re-run automatically every week using AWS EventBridge in order to grab the latest updates. + +### __Poky__ + +The pipeline name will end with **`poky`**. + +This example will build the `core-image-minimal` image from Poky using the repo tool to manage layers. CVE checking is also enabled in the buildspec file. + +**_Expected build times_**: + +- First build: **32 minutes** +- Rebuild (without any change, just use sstate cache): **8 minutes** + +### __Poky EC2 AMI__ + +The pipeline name will end with **`poky-ami`**. + +Yocto can be used to create an EC2 AMI. This example builds an AMI based on Poky and meta-aws and exports it to your AMI registry using the [VM Import/Export Service](https://docs.aws.amazon.com/vm-import/latest/userguide/what-is-vmimport.html). + +**_Expected build times_**: + +- First build: **52 minutes** +- Rebuild (without any change, just use sstate cache): **17 minutes** + +### __Kas__ + +The pipeline name will end with **`kas`**. + +The Kas example shows how to use a [Kas Config](https://github.com/aws4embeddedlinux/aws4embeddedlinux-ci/blob/main/source-repo/kas/kas.yml) to manage layers. + +This tool can help programatically manage layers and config with tighter Yocto integration than Git Submodules or the Repo tool. + +**_Expected build times_**: + +- First build: **36 minutes** +- Rebuild (without any change, just use sstate cache): **11 minutes** + +### __QEmu__ + +The pipeline name will end with **`qemu`**. + +This example builds a Qemu based image using [meta-aws-demos](https://github.com/aws4embeddedlinux/meta-aws-demos). + +The Qemu image can be run in the CodeBuild environment. Using SLIRP networking, [OEQA testing](https://docs.yoctoproject.org/singleindex.html#performing-automated-runtime-testing) such as ptest can be run in the pipeline. + +**_Expected build times_**: + +- First build: **45 minutes** +- Rebuild (without any change, just use sstate cache): **14 minutes** + +### __NXP / IMX__ + +The pipeline name will end with **`nxp`**. + +This example will build an image for the [i.MX 6ULL EVK](https://www.nxp.com/design/development-boards/i-mx-evaluation-and-development-boards/evaluation-kit-for-the-i-mx-6ull-and-6ulz-applications-processor:MCIMX6ULL-EVK) board. + +**NXP requires users to accept and comply with a EULA in order to build** and, for this reason, **the buildspec will require modification before the build succeeds**. + +See the [IMX Yocto Users Guide](https://www.nxp.com/docs/en/user-guide/IMX_YOCTO_PROJECT_USERS_GUIDE.pdf) for more detail. + +**_Expected build times_**: + +- First build: **xx minutes** +- Rebuild (without any change, just use sstate cache): **xx minutes** + +### __Renesas__ + +This example is based on the [Yocto / Renesas R-Car work](https://elinux.org/R-Car/Boards/Yocto-Gen3/v5.9.0) to build an image for Renesas R-Car-H3 Starter Kit Premier board (unofficial name - H3ULCB) including the proprietary graphics and multimedia drivers from Renesas. + +You will need to download the Multimedia and Graphics library and related Linux drivers from the following link (registration necessary): + +- https://www.renesas.com/us/en/application/automotive/r-car-h3-m3-h2-m2-e2-documents-software + +**Download the following files:** + +- R-Car_Gen3_Series_Evaluation_Software_Package_for_Linux-20220121 +- R-Car_Gen3_Series_Evaluation_Software_Package_of_Linux_Drivers-20220121 + +Graphic drivers are required for Wayland. Multimedia drivers are optional. + +**Steps to build the image:** + +- Create a folder named `proprietary` in the root of the source repo +- Copy the downloaded files into the `proprietary` folder +- Uncomment the `#TODO` line in the `build.sh` file in the source repo +- Deploy the build pipeline + +A build should automatically start. Once it succeeds you will get an image containing the proprietary graphics and multimedia drivers. + +**_Expected build times_**: + +- First build: **30 minutes** +- Rebuild (without any change, just use sstate cache): **9 minutes** + +[Bask to the top](#aws4embeddedlinux-ci) + + +## Project Build with AWS CodeBuild as Action Runner + + +This will create an AWS CodeBuild project ready to build Embedded Linux which can be used to connect to an external source, e.g. [GitHub Actions](https://docs.aws.amazon.com/codebuild/latest/userguide/action-runner.html). This is not using any AWS CodePipeline as in the the Pipeline examples section. + +You can use the following [example](https://github.com/aws4embeddedlinux/meta-aws-demos/blob/master/.github/workflows/build-gg.yml) for your GitHub Action. + +We recommend you to clone the created AWS CodeBuild project and then proceed with the GitHub Action configuration. +However, this will result in the use of the same EFS file system across projects. + +Using the AWS CodeBuild project requires a source to be configured manually in the AWS Console at `Developer Tools > Build - CodeBuild > Projects`. + +To configure the AWS CodeBuild source connection to a GitHub repository, you will need to: + +- Select the AWS CodeBuild project (`aws4el-ci-codebuild-project`) +- Select the `Project Details` tab +- Scroll to the `Source` section and click on **Edit**. +- Select **`GitHub`** as a **Source provider**. Configure the access to your repository +- Scroll to the **Primary source webhook events** section, enable **Rebuild every time a code change is pushed to this repository** +- Expand the **Webhook event filter groups** section and click on **Add filter group** if no group is present, then select **WORKFLOW_JOB_QUEUED** as **Filter group 1** + + +Modify your repository GitHub action by replacing the following line: +``` +runs-on: ${{ vars.CODEBUILD_RUNNER_NAME }}-${{ github.run_id }}-${{ github.run_attempt }} +``` + +with: + +``` +runs-on: codebuild--${{ github.run_id }}-${{ github.run_attempt }} +``` + +`` should be replaced by your AWS CodeBuild project name (`aws4el-ci-codebuild-project`). +There might be more than one occuerence to replace in the file. + +Refer to the following [example](https://github.com/aws4embeddedlinux/meta-aws-demos/blob/master/.github/workflows/build-gg.yml) for more details. + +[Bask to the top](#aws4embeddedlinux-ci) + +## Setup + +In order to use this library, you must first set up an [AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html) project, including +installing the CDK tool and bootstrapping the account you wish to deploy to. + +Additionally, you must have [NodeJS](https://nodejs.org/en/) installed. > [!NOTE] -> This library is tested against Node Versions 22. If these version is not available for your system, we recommend -> using [NVM](https://github.com/nvm-sh/nvm) to install a compatible version +> +> This library is tested against Node Versions 22. If these version is not available for your system, we recommend using [NVM](https://github.com/nvm-sh/nvm) to install a compatible version. +> -## Quickstart -Use the [examples](https://github.com/aws4embeddedlinux/aws4embeddedlinux-ci-examples) in our examples repo. +You can also use the [sample project code](https://github.com/aws4embeddedlinux/aws4embeddedlinux-ci-examples) provided to get started and deploy the stacks. +[Bask to the top](#aws4embeddedlinux-ci) -## Setting Up A New Project +### Setting Up A New Project -1. Create a CDK project. More details can be found in the [CDK Getting Started Documentation](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html). - ``` - mkdir my-project - cd my-project - cdk init app --language typescript - ``` -2. Add the cdk library with `npm install aws4embeddedlinux/aws4embeddedlinux-ci`. -3. Create your application using the library. Refer to the [API Documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci) - and the [Examples](github.com/aws4embeddedlinux/aws4embeddedlinux-ci-examples) for more details. -4. Deploy your application using `cdk deploy`. -5. After the application is deployed, the 'Build Image' Pipeline needs to be run. This will create an Ubuntu based container for - building Yocto. This container is used by the other pipelines. If the other pipelines are run before this container is created - and pushed to [ECR](https://aws.amazon.com/ecr/), they will fail. This Build Image Pipeline will run weekly by default to keep - this container patched. -6. Now the application pipeline can be run. This will push the contents of the Yocto deploy directory into S3. +In order to create a new project, you will need to initialize a new CDK project. -## Viewing Changes +More details can be found in the [CDK Getting Started Documentation](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html). -The `cdk diff` command can be used to preview changes before deployment. This will allow the user to review what is being created. +The following commands will create a new CDK project named `my-project`: -## Development Setup -You can use [`npm link`](https://docs.npmjs.com/cli/v10/commands/npm-link) to develop with a local copy of this repo. +```bash +mkdir my-project +cd my-project +cdk init app --language typescript +``` -### In this library repo: +Then you will need to install the CDK library including the `aws4embeddedlinux-ci` library either using `npm`: ```bash -npm install +npm install aws4embeddedlinux/aws4embeddedlinux-ci ``` -### In your-project folder: +of `yarn': ```bash -npm install -npm link ../aws4embeddedlinux-ci +yarn add github:aws4embeddedlinux/aws4embeddedlinux-ci +yarn install ``` -This will link through the system `node_modules` install. When using a system node install on Linux, this can require sudo access. To avoid this, use -a [node version manager](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm#using-a-node-version-manager-to-install-nodejs-and-npm) -or [set a node prefix](https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally). +> If you are not familliar with Yarn, please refer to the [documentation](https://yarnpkg.com/getting-started). -## Known issues -- Windows is currently not supported. -- When using AWS Cloud9 a micro instance type will run out of memory. -- Deletion of stacks while a CodePipeline is running can lead to unexpected failures. +Once added, you can start creatin your application using the library. -## Security +For example, you can start by importing classes using: -See [SECURITY](SECURITY.md) for more information about reporting issues with this project. +```ts +import { + EmbeddedLinuxCodePipelineBaseImageStack, + EmbeddedLinuxCodePipelineStack, + EmbeddedLinuxCodeBuildProjectStack, + PipelineResourcesStack, + ProjectType, +} from "aws4embeddedlinux-cdk-lib"; +``` -### Git Credentials and Build Time Secrets -[AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) is the preferred method of adding secrets -to your pipeline. This service provides a structured means of access and avoids the pitfalls of putting secrets in environment variables, -source repos, etc. +Then deploy the base resources and base image pipeline stacks: -1. Create a _Secret_ in Secrets Manager and add your secret value. -1. Grant access permissions to the CodeBuild pipeline project. -11. Create a [Policy Statement](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_iam.PolicyStatement.html) which allows `secretsmanager:GetSecretValue` for your secret. -11. Add this policy statement to the `buildPolicyAdditions` props for the `EmbeddedLinuxPipelineStack`. e.g. +```typescript +const pipelineResourcesStack = new PipelineResourcesStack(app, `demo-resources`, {...}); +const baseImageStack = new EmbeddedLinuxCodePipelineBaseImageStack(app, `demo-pipeline-base-image`, {...}); +``` +And ultimately deploy the target pipeline: ```typescript -import * as iam from "aws-cdk-lib/aws-iam"; - -const pipeline = new EmbeddedLinuxPipelineStack(app, "MyPokyPipeline", { - imageRepo: buildImageRepo.repository, - imageTag: ImageKind.Ubuntu22_04, - vpc: vpc.vpc, - buildPolicyAdditions: [ - iam.PolicyStatement.fromJson({ - Effect: "Allow", - Action: "secretsmanager:GetSecretValue", - Resource: - "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-secret-??????", - }), - ], +const projectPipeline = new EmbeddedLinuxCodePipelineStack(app, "demo-project", { + projectType: ProjectType.Poky, + ecrRepository: , + ecrRepositoryImageTag: , + pipelineSourceBucket: , + pipelineArtifactBucket: , + pipelineOutputBucket: , + vpc: , + encryptionKey: , }); - ``` +``` + +Refer to the [API Documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci) and the [sample](github.com/aws4embeddedlinux/aws4embeddedlinux-ci-examples) for more details. + +Once you have completed the code of your application, you can deploy the CDK stack using: + +```bash +cdk deploy +``` -The secret can then be used in the CodeBuild Project by adding it to the BuildSpec. See -the [CodeBuild Documentation](https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html) for more details. +After the CDK application is successfully deployed, the 'Base Image' pipeline needs to complete successfully. -```yaml -env: - secrets-manager: - SECRET_VALUE: "" +This will create an Ubuntu based container for building the Yocto images. + +> [!NOTE] +> +> This container is used by the other pipelines. If the other pipelines are run before this container is created and pushed to [ECR](https://aws.amazon.com/ecr/), they will fail. +> +> The 'Base Image' pipeline will run weekly by default to keep the container patched and up to date. +> + +> [!NOTE] +> +> We recommend you to deploy first the 'Base Image' pipeline and once the pipeline completes successfully, then you can deploy the other pipelines in you application as described in the [sample](github.com/aws4embeddedlinux/aws4embeddedlinux-ci-examples). +> + +Once your pipelines completes successfully, the Yocto deploy directory generated content will be pushed into a S3 bucket. + +[Bask to the top](#aws4embeddedlinux-ci) + +## Development Setup + +The repository is leveraging Yarn 2 and if you are not familliar with Yarn, please refer to the [documentation](https://yarnpkg.com/getting-started). + +If you are looking to develop new feature, you can use [`yarn link`](https://classic.yarnpkg.com/lang/en/docs/cli/link/k) to develop with a local copy of this repo. + +In this library repo, execute the following: + +```bash +yarn install +yarn run build +yarn link +``` + +and in your project folder: + +```bash +yarn install +yarn link "aws4embeddedlinux-cdk-lib" +yarn run build ``` +This will link through the system `node_modules` install. + +> _Note:_ +> +> You should not install / reference the `aws4embeddedlinux/aws4embeddedlinux-ci` library in your `package.json` when using this approach. +> + + +> _Note:_ +> +> After changing the code for the `aws4embeddedlinux/aws4embeddedlinux-ci` library, you will need to run `yarn run build` for changes to be available in your current project. +> + + +> _Note:_ +> +> When using a system node install on Linux, this can require sudo access. +> To avoid this, use a [node version manager](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm#using-a-node-version-manager-to-install-nodejs-and-npm) or [set a node prefix](https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally). + +### Using Git Credentials and Build Time Secrets + +[AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) is the preferred method for adding and using secrets in your pipelines. + +The service provides a structured means of access and avoids the pitfalls of putting secrets in environment variables, source repos, etc. + +The following steps detaisl at a high level, how you can enable the use of AWS Secrets Manager in your pipelines: + +- Create a _Secret_ in Secrets Manager and add your secret value. +- Grant access permissions to the CodeBuild pipeline project. +- Create a [Policy Statement](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_iam.PolicyStatement.html) which allows `secretsmanager:GetSecretValue` for your secret. +- Add this policy statement to the `buildPolicyAdditions` props for the `EmbeddedLinuxPipelineStack`. e.g. + + ```typescript + import * as iam from "aws-cdk-lib/aws-iam"; + const projectPipeline = new EmbeddedLinuxCodePipelineStack(app, "MyPokyPipeline", { + projectType: ProjectType.Poky, + ecrRepository: , + ecrRepositoryImageTag: , + pipelineSourceBucket: , + pipelineArtifactBucket: , + pipelineOutputBucket: , + vpc: , + encryptionKey: , + buildPolicyAdditions: [ + iam.PolicyStatement.fromJson({ + Effect: "Allow", + Action: "secretsmanager:GetSecretValue", + Resource: + "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-secret-??????", + }), + ], + }); + ``` + +- The secret can then be used in the CodeBuild Project by adding it to the BuildSpec. + + ```yaml + env: + secrets-manager: + SECRET_VALUE: "" + ``` +See the [CodeBuild Documentation](https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html) for more details. + ### CVE Checking With Yocto -CVE checking is enabled in the reference implementations. Details on this can be found in -the [yocto documentation](https://docs.yoctoproject.org/4.0.13/singleindex.html#checking-for-vulnerabilities). +CVE checking is enabled in the reference implementations. Details on this can be found in the [Yocto documentation](https://docs.yoctoproject.org/4.0.13/singleindex.html#checking-for-vulnerabilities). + +[Bask to the top](#aws4embeddedlinux-ci) + +## Known issues + +- The use of this CDK library is currently not supported in Windows environments (you can still use WSL). +- When using AWS Cloud9, a micro instance type will run out of memory. +- Deletion of stacks while a CodePipeline is running can lead to unexpected behaviours. +- The NXP-IMX pipeline will fail unless you adjust the build spec file and address the licence acceptance requirement. + +[Bask to the top](#aws4embeddedlinux-ci) + +## Security + +See [SECURITY](SECURITY.md) for more information about reporting issues with this project. + +[Bask to the top](#aws4embeddedlinux-ci) ## Contributing See [CONTRIBUTING](CONTRIBUTING.md) for more information. +[Bask to the top](#aws4embeddedlinux-ci) + ## License This library is licensed under the MIT-0 License. See the [LICENSE](LICENSE) file. + +[Bask to the top](#aws4embeddedlinux-ci) diff --git a/eslint.config.mjs b/eslint.config.mjs index 61853b1..a9f6154 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,79 +1,89 @@ -import typescriptEslintEslintPlugin from "@typescript-eslint/eslint-plugin"; -import tsdoc from "eslint-plugin-tsdoc"; -import globals from "globals"; -import tsParser from "@typescript-eslint/parser"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import js from "@eslint/js"; -import { FlatCompat } from "@eslint/eslintrc"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -import { includeIgnoreFile } from "@eslint/compat"; -const gitignorePath = path.resolve(__dirname, ".gitignore"); - -const compat = new FlatCompat({ - baseDirectory: __dirname, - recommendedConfig: js.configs.recommended, - allConfig: js.configs.all -}); - -export default [...compat.extends( - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended", -), { - plugins: { - "@typescript-eslint": typescriptEslintEslintPlugin, - tsdoc, - }, - - languageOptions: { - globals: { - ...globals.browser, - ...globals.node, - ...globals.jest, - }, - - parser: tsParser, - ecmaVersion: "latest", - sourceType: "module", - - parserOptions: { - sourceType: 'module', - project: './tsconfig.json', - }, - }, - - rules: { - "tsdoc/syntax": "warn", - - "max-len": ["error", { - code: 150, - ignoreUrls: true, - ignoreStrings: true, - ignoreTemplateLiterals: true, - ignoreComments: true, - ignoreRegExpLiterals: true, - }], - - "prettier/prettier": ["error", { - singleQuote: true, - trailingComma: "es5", - }], - }, - - ignores: [ - "jest.config.js", - "package.json", - "package-lock.json", - "tsconfig.json", - "typedoc.json", - ], -}, -includeIgnoreFile(gitignorePath), -{ - // your overrides -}, -]; +import typescriptEslintEslintPlugin from "@typescript-eslint/eslint-plugin"; +import tsdoc from "eslint-plugin-tsdoc"; +import globals from "globals"; +import tsParser from "@typescript-eslint/parser"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import eslint from "@eslint/js"; +import tseslint from "typescript-eslint"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +import { includeIgnoreFile } from "@eslint/compat"; +const gitignorePath = path.resolve(__dirname, ".gitignore"); + +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: eslint.configs.recommended, + allConfig: eslint.configs.all, +}); + +export default [ + { + plugins: { + "@typescript-eslint": typescriptEslintEslintPlugin, + tsdoc, + }, + + languageOptions: { + globals: { + ...globals.node, + ...globals.jest, + }, + + parser: tsParser, + ecmaVersion: "latest", + sourceType: "module", + + parserOptions: { + sourceType: "module", + project: "./tsconfig.json", + }, + }, + + rules: { + "tsdoc/syntax": "warn", + + "max-len": [ + "error", + { + code: 150, + ignoreUrls: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + ignoreComments: true, + ignoreRegExpLiterals: true, + }, + ], + + "prettier/prettier": [ + "error", + { + singleQuote: true, + trailingComma: "es5", + }, + ], + }, + ignores: [ + "jest.config.js", + "package.json", + "package-lock.json", + "tsconfig.json", + "typedoc.json", + "/dist/**", + "/docs/**", + "/test/**", + "/tmp/**", + ], + ...eslint.configs.recommended, + }, + includeIgnoreFile(gitignorePath), + ...compat.extends( + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended", + ), + ...tseslint.configs.recommended, +]; diff --git a/images/architecture.svg b/images/architecture-v0.1.x.svg similarity index 100% rename from images/architecture.svg rename to images/architecture-v0.1.x.svg diff --git a/images/architecture-v0.2.x.svg b/images/architecture-v0.2.x.svg new file mode 100644 index 0000000..30005bf --- /dev/null +++ b/images/architecture-v0.2.x.svg @@ -0,0 +1,4 @@ + + + +
AWS Account
AWS Account
CodePipeline
CodePipeline
Build Artifacts
Build Artifacts
Build and Download Cache
Build and Download Cache
CodeBuild
CodeBuild
Update Config
Update Config
Builder
Build...
S3
Bucket
S3

Bucket
Download Sources
Download Sources
Upstream Package Sources
Upstream Package Sourc...
S3
Bucket
S3
Bucket
EFS
EFS
Download Metadata
Download Metadata
Upstream Layers
Upstream Layers
Text is not SVG - cannot display diff --git a/jest.config.js b/jest.config.js index e993232..000683e 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,8 +1,16 @@ -export default { - testEnvironment: "node", - roots: ["/test"], - testMatch: ["**/*.test.ts"], - transform: { - "^.+\\.tsx?$": "ts-jest", - }, +/* eslint-env node */ +// module.exports = { +// testEnvironment: "node", +// roots: ["/test"], +// testMatch: ["**/*.test.ts"], +// transform: { +// "^.+\\.tsx?$": "ts-jest", +// }, +// }; + +export const testEnvironment = "node"; +export const roots = ["/test"]; +export const testMatch = ["**/*.test.ts"]; +export const transform = { + "^.+\\.tsx?$": "ts-jest", }; diff --git a/lib/build-image-data.ts b/lib/build-image-data.ts deleted file mode 100644 index f81da3b..0000000 --- a/lib/build-image-data.ts +++ /dev/null @@ -1,103 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import * as s3 from 'aws-cdk-lib/aws-s3'; -import { BucketDeployment, Source } from 'aws-cdk-lib/aws-s3-deployment'; -import * as iam from 'aws-cdk-lib/aws-iam'; - -import * as path from 'path'; -import * as kms from 'aws-cdk-lib/aws-kms'; -import { RemovalPolicy } from 'aws-cdk-lib'; - -/** - * Select options for the {@link BuildImageDataStack}. - */ -export interface BuildImageDataProps extends cdk.StackProps { - /** The bucket name for image build sources. This must be globally unique. */ - readonly bucketName: string; -} - -/** - * Input (Source) data for our {@link BuildImagePipelineStack}. - */ -export class BuildImageDataStack extends cdk.Stack { - /** The bucket which will be consumed by the {@link BuildImagePipelineStack}. */ - public readonly bucket: s3.IBucket; - - constructor(scope: Construct, id: string, props: BuildImageDataProps) { - super(scope, id, props); - - this.bucket = this.createDeploymentBucket(props.bucketName); - } - - /** - * Create a bucket and S3 deployment to this bucket. - * - * @param bucketName - The name of the bucket. Must be globally unique. - * @param env - Environment passed to the stack. - */ - private createDeploymentBucket(bucketName: string): s3.IBucket { - const accessLoggingBucket = new s3.Bucket(this, 'LoggingBucket', { - versioned: true, - enforceSSL: true, - autoDeleteObjects: true, - removalPolicy: RemovalPolicy.DESTROY, - }); - - const encryptionKey = new kms.Key(this, 'PipelineArtifactKey', { - removalPolicy: RemovalPolicy.DESTROY, - enableKeyRotation: true, - }); - - // Create a bucket, then allow a deployment Lambda to upload to it. - const dataBucket = new s3.Bucket(this, 'BuildImageDataBucket', { - bucketName, - versioned: true, - encryptionKey: encryptionKey, - enforceSSL: true, - serverAccessLogsBucket: accessLoggingBucket, - autoDeleteObjects: true, - removalPolicy: RemovalPolicy.DESTROY, - }); - - const cwPolicy = new iam.PolicyDocument({ - statements: [ - new iam.PolicyStatement({ - actions: [ - 'logs:CreateLogGroup', - 'logs:CreateLogStream', - 'logs:PutLogEvents', - ], - resources: [ - `arn:aws:logs:${this.region}:${this.account}:log-group:/aws/lambda/BuildImageData-CustomCDKBucketDeployment*"`, - ], - }), - ], - }); - - const dataBucketDeploymentRole = new iam.Role( - this, - 'BuildImageBucketRole', - { - assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), - inlinePolicies: { cwPolicy }, - } - ); - - dataBucketDeploymentRole.addToPolicy( - new iam.PolicyStatement({ - actions: ['kms:Decrypt'], - resources: [encryptionKey.keyArn], - }) - ); - - new BucketDeployment(this, 'BuildImageBucketDeployment', { - // Note: Run `npm run zip-data` before deploying this stack! - sources: [Source.asset(path.join(__dirname, '..', 'assets/build-image'))], - destinationBucket: dataBucket, - role: dataBucketDeploymentRole, - extract: true, - }); - - return dataBucket; - } -} diff --git a/lib/build-image-pipeline.ts b/lib/build-image-pipeline.ts deleted file mode 100644 index fa349b0..0000000 --- a/lib/build-image-pipeline.ts +++ /dev/null @@ -1,172 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import * as codepipeline from 'aws-cdk-lib/aws-codepipeline'; -import * as codepipeline_actions from 'aws-cdk-lib/aws-codepipeline-actions'; -import * as codebuild from 'aws-cdk-lib/aws-codebuild'; -import { IRepository } from 'aws-cdk-lib/aws-ecr'; -import * as s3 from 'aws-cdk-lib/aws-s3'; -import * as events from 'aws-cdk-lib/aws-events'; -import { CodePipeline } from 'aws-cdk-lib/aws-events-targets'; -import { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs'; -import * as kms from 'aws-cdk-lib/aws-kms'; -import { RemovalPolicy } from 'aws-cdk-lib'; - -/** - * The type of Image to build on. - */ -export enum ImageKind { - /** Ubuntu 22.04 (LTS) */ - Ubuntu22_04 = 'ubuntu_22_04', -} - -/** - * Select options for the {@link BuildImagePipelineStack}. - */ -export interface BuildImagePipelineProps extends cdk.StackProps { - /** The Image type to create. */ - readonly imageKind: ImageKind; - /** The data bucket from the {@link BuildImageDataStack} */ - readonly dataBucket: s3.IBucket; - /** The ECR Repository to push to. */ - readonly repository: IRepository; - /** Access logging bucket to use */ - readonly accessLoggingBucket?: s3.Bucket; - /** Access logging prefix to use */ - readonly serverAccessLogsPrefix?: string; - /** Artifact bucket to use */ - readonly artifactBucket?: s3.Bucket; -} - -/** - * The pipeline for building the CodeBuild Image used in other pipelines. This - * will produce an image for an OS based on verified Yocto hosts. - * - * For configuration options see {@link BuildImagePipelineProps}. - */ -export class BuildImagePipelineStack extends cdk.Stack { - constructor(scope: Construct, id: string, props: BuildImagePipelineProps) { - super(scope, id, props); - - // Create a source action. - const sourceOutput = new codepipeline.Artifact('BuildImageSource'); - const sourceAction = new codepipeline_actions.S3SourceAction({ - actionName: 'Build-Image-Source', - bucket: props.dataBucket, - bucketKey: 'data.zip', - output: sourceOutput, - }); - - // Create a build action. - const buildImageProject = new codebuild.PipelineProject( - this, - 'BuildImageProject', - { - buildSpec: codebuild.BuildSpec.fromSourceFilename( - `${props.imageKind}/buildspec.yml` - ), - environment: { - computeType: codebuild.ComputeType.LARGE, - buildImage: codebuild.LinuxBuildImage.STANDARD_7_0, - privileged: true, - }, - environmentVariables: { - ECR_REPOSITORY_URI: { - type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, - value: props.repository.repositoryUri, - }, - AWS_ACCOUNT_ID: { - type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, - value: cdk.Stack.of(this).account, - }, - AWS_DEFAULT_REGION: { - type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, - value: cdk.Stack.of(this).region, - }, - IMAGE_TAG: { - type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, - value: props.imageKind, - }, - }, - logging: { - cloudWatch: { - logGroup: new LogGroup(this, 'BuildImageBuildLogs', { - retention: RetentionDays.TEN_YEARS, - }), - }, - }, - } - ); - props.repository.grantPullPush(buildImageProject); - - const buildAction = new codepipeline_actions.CodeBuildAction({ - actionName: 'Build', - project: buildImageProject, - input: sourceOutput, - }); - - let accessLoggingBucket: s3.IBucket; - - if (props.accessLoggingBucket) { - accessLoggingBucket = props.accessLoggingBucket; - } else { - accessLoggingBucket = new s3.Bucket(this, 'ArtifactAccessLogging', { - versioned: true, - enforceSSL: true, - autoDeleteObjects: true, - removalPolicy: RemovalPolicy.DESTROY, - }); - } - - let artifactBucket: s3.IBucket; - - if (props.artifactBucket) { - artifactBucket = props.artifactBucket; - } else { - const encryptionKey = new kms.Key(this, 'PipelineArtifactKey', { - removalPolicy: RemovalPolicy.DESTROY, - enableKeyRotation: true, - }); - artifactBucket = new s3.Bucket(this, 'PipelineArtifacts', { - versioned: true, - enforceSSL: true, - serverAccessLogsBucket: accessLoggingBucket, - serverAccessLogsPrefix: props.serverAccessLogsPrefix, - encryptionKey, - encryption: s3.BucketEncryption.KMS, - blockPublicAccess: new s3.BlockPublicAccess( - s3.BlockPublicAccess.BLOCK_ALL - ), - autoDeleteObjects: true, - removalPolicy: RemovalPolicy.DESTROY, - }); - } - - const pipeline = new codepipeline.Pipeline(this, 'BuildImagePipeline', { - artifactBucket, - pipelineName: `${props.imageKind}BuildImagePipeline`, - pipelineType: codepipeline.PipelineType.V1, - stages: [ - { - stageName: 'Source', - actions: [sourceAction], - }, - { - stageName: 'Build', - actions: [buildAction], - }, - ], - restartExecutionOnUpdate: true, - }); - - // Run this pipeline weekly to update the image OS. - const pipelineTarget = new CodePipeline(pipeline); - new events.Rule(this, 'WeeklySchedule', { - schedule: events.Schedule.cron({ - weekDay: 'Monday', - minute: '0', - hour: '6', - }), - targets: [pipelineTarget], - }); - } -} diff --git a/lib/build-image-repo.ts b/lib/build-image-repo.ts deleted file mode 100644 index 5b87e01..0000000 --- a/lib/build-image-repo.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import * as ecr from 'aws-cdk-lib/aws-ecr'; - -/** - * The ECR Repository to store build host images. - * - * This is the output of the {@link BuildImagePipelineStack} - */ -export class BuildImageRepoStack extends cdk.Stack { - /** The respository to put the build host container in. */ - public readonly repository: ecr.IRepository; - - constructor(scope: Construct, id: string, props?: cdk.StackProps) { - super(scope, id, props); - - this.repository = new ecr.Repository(this, 'BuildImageRepo', { - removalPolicy: cdk.RemovalPolicy.DESTROY, - emptyOnDelete: true, - }); - } -} diff --git a/lib/codebuild-embedded-linux.ts b/lib/codebuild-embedded-linux.ts new file mode 100644 index 0000000..eda45b1 --- /dev/null +++ b/lib/codebuild-embedded-linux.ts @@ -0,0 +1,205 @@ +import * as cdk from "aws-cdk-lib"; +import { Construct } from "constructs"; +import * as events from "aws-cdk-lib/aws-events"; +import * as targets from "aws-cdk-lib/aws-events-targets"; +import * as lambda from "aws-cdk-lib/aws-lambda"; +import * as iam from "aws-cdk-lib/aws-iam"; +import * as efs from "aws-cdk-lib/aws-efs"; +import * as codebuild from "aws-cdk-lib/aws-codebuild"; +import * as ecr from "aws-cdk-lib/aws-ecr"; +import * as ec2 from "aws-cdk-lib/aws-ec2"; +import * as logs from "aws-cdk-lib/aws-logs"; +import * as kms from "aws-cdk-lib/aws-kms"; + +/** + * Properties to allow customizing the build. + */ +export interface EmbeddedLinuxCodeBuildProjectProps extends cdk.StackProps { + /** ECR Repository where the Build Host Image resides. */ + readonly ecrRepository: ecr.IRepository; + /** Tag for the Build Host Image */ + readonly ecrRepositoryImageTag: string; + /** VPC where the networking setup resides. */ + readonly vpc: ec2.IVpc; + /** Additional policy statements to add to the build project. */ + readonly buildPolicyAdditions?: iam.PolicyStatement[]; + /** The encryption key use across*/ + readonly encryptionKey: kms.Key; +} + +/** + * The stack for creating a build pipeline. + * + * See {@link EmbeddedLinuxCodeBuildProjectProps} for configration options. + */ +export class EmbeddedLinuxCodeBuildProjectStack extends cdk.Stack { + constructor( + scope: Construct, + id: string, + props: EmbeddedLinuxCodeBuildProjectProps, + ) { + super(scope, id, props); + + /** Set up networking access and EFS FileSystems. */ + + const projectSg = new ec2.SecurityGroup( + this, + "EmbeddedLinuxCodeBuildProjectSecurityGroup", + { + vpc: props.vpc, + description: "Security Group to allow attaching EFS", + }, + ); + projectSg.addIngressRule( + ec2.Peer.ipv4(props.vpc.vpcCidrBlock), + ec2.Port.tcp(2049), + "NFS Mount Port", + ); + + const efsFileSystem: efs.FileSystem = new efs.FileSystem( + this, + `EmbeddedLinuxCodeBuildProjectFilesystem`, + { + vpc: props.vpc, + allowAnonymousAccess: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + }, + ); + efsFileSystem.connections.allowFrom(projectSg, ec2.Port.tcp(2049)); + + /** Create our CodeBuild Project. */ + const project = new codebuild.Project( + this, + "EmbeddedLinuxCodeBuildProject", + { + projectName: `${id}`, + buildSpec: codebuild.BuildSpec.fromObject({ + version: "0.2", + phases: { + build: { + commands: ['echo "DUMMY BUILDSPEC - can not be empty"'], + }, + }, + artifacts: { + files: ["**/*"], + "base-directory": ".", + }, + }), + environment: { + computeType: codebuild.ComputeType.X_LARGE, + buildImage: codebuild.LinuxBuildImage.fromEcrRepository( + props.ecrRepository, + props.ecrRepositoryImageTag, + ), + privileged: true, + }, + timeout: cdk.Duration.hours(4), + vpc: props.vpc, + securityGroups: [projectSg], + fileSystemLocations: [ + codebuild.FileSystemLocation.efs({ + identifier: "nfs", + location: `${efsFileSystem.fileSystemId}.efs.${efsFileSystem.env.region}.amazonaws.com:/`, + mountPoint: "/nfs", + }), + ], + logging: { + cloudWatch: { + logGroup: new logs.LogGroup( + this, + "EmbeddedLinuxCodeBuildProjectLogs", + { + logGroupName: `${id}-EmbeddedLinuxCodeBuildProjectLogs`, + retention: logs.RetentionDays.ONE_YEAR, + removalPolicy: cdk.RemovalPolicy.DESTROY, + }, + ), + }, + }, + encryptionKey: props.encryptionKey, + }, + ); + + if (props.buildPolicyAdditions) { + props.buildPolicyAdditions.map((p) => project.addToRolePolicy(p)); + } + + project.addToRolePolicy(this.addProjectPolicies()); + + project.role?.addManagedPolicy( + iam.ManagedPolicy.fromAwsManagedPolicyName("AWSCodeBuildAdminAccess"), + ); + + /** Here we create the logic to check for presence of ECR image on the CodePipeline automatic triggering upon resource creation, + * and stop the execution if the image does not exist. */ + const fnOnPipelineCreate = new lambda.Function( + this, + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStart", + { + runtime: lambda.Runtime.PYTHON_3_10, + handler: "index.handler", + code: lambda.Code.fromInline(` +import boto3 +import json + +ecr_client = boto3.client('ecr') +codepipeline_client = boto3.client('codepipeline') + +def handler(event, context): + print("Received event: " + json.dumps(event, indent=2)) + response = ecr_client.describe_images(repositoryName='${props.ecrRepository.repositoryName}', filter={'tagStatus': 'TAGGED'}) + for i in response['imageDetails']: + if '${props.ecrRepositoryImageTag}' in i['imageTags']: + break + else: + print('OS image not found. Stopping execution.') + response = codepipeline_client.stop_pipeline_execution( + pipelineName=event['detail']['pipeline'], + pipelineExecutionId=event['detail']['execution-id'], + abandon=True, + reason='OS image not found in ECR repository. Stopping pipeline until image is present.') + `), + logRetention: logs.RetentionDays.ONE_YEAR, + }, + ); + + const pipelineCreateRule = new events.Rule( + this, + "EmbeddedLinuxCodeBuildProjectOnPipelineStartRule", + { + eventPattern: { + detailType: ["CodePipeline Pipeline Execution State Change"], + source: ["aws.codepipeline"], + detail: { + state: ["STARTED"], + "execution-trigger": { + "trigger-type": ["CreatePipeline"], + }, + }, + }, + }, + ); + pipelineCreateRule.addTarget( + new targets.LambdaFunction(fnOnPipelineCreate), + ); + } + + private addProjectPolicies(): iam.PolicyStatement { + return new iam.PolicyStatement({ + actions: [ + "ec2:DescribeSecurityGroups", + "codestar-connections:GetConnection", + "codestar-connections:GetConnectionToken", + "codeconnections:GetConnectionToken", + "codeconnections:GetConnection", + "codeconnections:ListConnection", + "codeconnections:UseConnection", + "codebuild:ListConnectedOAuthAccounts", + "codebuild:ListRepositories", + "codebuild:PersistOAuthToken", + "codebuild:ImportSourceCredentials", + ], + resources: ["*"], + }); + } +} diff --git a/lib/codepipeline-embedded-linux-base-image.ts b/lib/codepipeline-embedded-linux-base-image.ts new file mode 100644 index 0000000..0d218ca --- /dev/null +++ b/lib/codepipeline-embedded-linux-base-image.ts @@ -0,0 +1,229 @@ +import * as path from "path"; + +import * as cdk from "aws-cdk-lib"; +import { Construct } from "constructs"; +import { BucketDeployment, Source } from "aws-cdk-lib/aws-s3-deployment"; +import { Asset } from "aws-cdk-lib/aws-s3-assets"; +import * as codepipeline from "aws-cdk-lib/aws-codepipeline"; +import * as codepipeline_actions from "aws-cdk-lib/aws-codepipeline-actions"; +import * as codebuild from "aws-cdk-lib/aws-codebuild"; +import * as ecr from "aws-cdk-lib/aws-ecr"; +import * as s3 from "aws-cdk-lib/aws-s3"; +import * as events from "aws-cdk-lib/aws-events"; +import * as events_target from "aws-cdk-lib/aws-events-targets"; +import * as logs from "aws-cdk-lib/aws-logs"; +import * as iam from "aws-cdk-lib/aws-iam"; +import * as kms from "aws-cdk-lib/aws-kms"; + +/** + * Select options for the {@link BuildImageCodePipelineStack}. + */ +export interface EmbeddedLinuxCodePipelineBaseImageProps + extends cdk.StackProps { + /** The pipeline source bucket */ + readonly pipelineSourceBucket: s3.IBucket; + /** The pipeline source prefix */ + pipelineSourcePrefix?: string; + /** Artifact bucket to use */ + readonly pipelineArtifactBucket: s3.Bucket; + /** The ECR Repository to push to. */ + readonly ecrRepository: ecr.IRepository; + /** The encryption key use across*/ + readonly encryptionKey: kms.Key; +} + +/** + * The pipeline for building the CodeBuild Image used in other pipelines. This + * will produce an image for an OS based on verified Yocto hosts. + * + * For configuration options see {@link BuildBaseImageCodePipelineProps}. + */ +export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { + /** The ECR Repository where the image is located. */ + public readonly ecrRepository: ecr.IRepository; + /** The ECR Image Tag to find the base imaged. */ + public readonly ecrRepositoryImageTag: string; + + constructor( + scope: Construct, + id: string, + props: EmbeddedLinuxCodePipelineBaseImageProps, + ) { + super(scope, id, props); + + this.ecrRepository = props.ecrRepository; + this.ecrRepositoryImageTag = `${id}`; + + const projectType: string = "base-image"; + + if (!props.pipelineSourcePrefix) { + props.pipelineSourcePrefix = `${projectType}`; + } + + // create the policy & role for the source bucket deployment + const pipelineSourceBucketDeploymentPolicy = new iam.PolicyDocument({ + statements: [ + new iam.PolicyStatement({ + actions: [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents", + ], + resources: [ + `arn:aws:logs:${cdk.Stack.of(this).region}:${cdk.Stack.of(this).account}:log-group:/aws/lambda/EmbeddedLinuxCodePipelineBaseImage-CustomCDKBucketDeployment*`, + ], + }), + ], + }); + const pipelineSourceBucketDeploymentRole = new iam.Role( + this, + "CodePipelineBuildBaseImageBucketDeploymentRole", + { + assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"), + inlinePolicies: { pipelineSourceBucketDeploymentPolicy }, + }, + ); + + // archive and upload the source-repo folder into CDK owned bucket + const sourceRepoAsset: Asset = new Asset( + this, + "CodePipelineBuildBaseImageBucketDeploymentAsset", + { + path: path.join(__dirname, "..", "source-repo", projectType), + }, + ); + + // deploy the uploaded archive to the target bucket + const bucketDeployment = new BucketDeployment( + this, + "CodePipelineBuildBaseImageBucketDeployment", + { + sources: [ + Source.bucket(sourceRepoAsset.bucket, sourceRepoAsset.s3ObjectKey), + ], + destinationBucket: props.pipelineSourceBucket, + role: pipelineSourceBucketDeploymentRole, + extract: false, + destinationKeyPrefix: props.pipelineSourcePrefix, + }, + ); + + /** Create our CodeCodePipeline Actions. */ + const sourceActionOutputArtifact = new codepipeline.Artifact("Source"); + const sourceAction = new codepipeline_actions.S3SourceAction({ + actionName: "Source", + trigger: codepipeline_actions.S3Trigger.EVENTS, + output: sourceActionOutputArtifact, + bucket: props.pipelineSourceBucket, + bucketKey: `${props.pipelineSourcePrefix}/${sourceRepoAsset.s3ObjectKey}`, + }); + + /** Create our CodeCodePipeline Project. */ + const project = new codebuild.PipelineProject( + this, + "CodePipelineBuildBaseImageProject", + { + projectName: `${this.ecrRepositoryImageTag}`, + buildSpec: codebuild.BuildSpec.fromSourceFilename(`buildspec.yml`), + environment: { + computeType: codebuild.ComputeType.MEDIUM, + buildImage: codebuild.LinuxBuildImage.STANDARD_7_0, + privileged: true, + }, + environmentVariables: { + ECR_REPOSITORY_URI: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: props.ecrRepository.repositoryUri, + }, + AWS_ACCOUNT_ID: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: cdk.Stack.of(this).account, + }, + AWS_DEFAULT_REGION: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: cdk.Stack.of(this).region, + }, + IMAGE_TAG: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: this.ecrRepositoryImageTag, + }, + }, + logging: { + cloudWatch: { + logGroup: new logs.LogGroup( + this, + "CodePipelineBuildBaseImageBuildLogs", + { + logGroupName: `${id}-CodePipelineBuildBaseImageBuildLogs`, + retention: logs.RetentionDays.ONE_YEAR, + removalPolicy: cdk.RemovalPolicy.DESTROY, + }, + ), + }, + }, + encryptionKey: props.encryptionKey, + }, + ); + project.node.addDependency(bucketDeployment); + props.ecrRepository.grantPullPush(project); + + const buildAction = new codepipeline_actions.CodeBuildAction({ + actionName: "Build", + project: project, + input: sourceActionOutputArtifact, + }); + + const pipeline = new codepipeline.Pipeline( + this, + "CodePipelineBuildBaseImageCodePipeline", + { + artifactBucket: props.pipelineArtifactBucket, + pipelineName: `${this.ecrRepositoryImageTag}`, + pipelineType: codepipeline.PipelineType.V1, + stages: [ + { + stageName: "Source", + actions: [sourceAction], + }, + { + stageName: "Build", + actions: [buildAction], + }, + ], + restartExecutionOnUpdate: true, + }, + ); + pipeline.node.addDependency(project); + + // Run this pipeline weekly to update the image OS regularly. + const pipelineTarget = new events_target.CodePipeline(pipeline); + new events.Rule(this, "CodePipelineBuildBaseImageWeeklyRefreshSchedule", { + schedule: events.Schedule.cron({ + weekDay: "Monday", + minute: "0", + hour: "6", + }), + targets: [pipelineTarget], + }); + + // Add stack output for the ECR repository and image tag + new cdk.CfnOutput(this, "ECRRepositoryName", { + value: this.ecrRepository.repositoryName, + description: + "The ECR Repository name where the base image will be pushed", + }); + new cdk.CfnOutput(this, "ECRBaseImageTag", { + value: this.ecrRepositoryImageTag, + description: "The ECR Image Tag where the base image will be pushed", + }); + new cdk.CfnOutput(this, "ECRBaseImageCheckCommand", { + value: `aws ecr list-images --repository-name "${this.ecrRepository.repositoryName}" --query "imageIds[?imageTag=='${this.ecrRepositoryImageTag}']"`, + description: "The AWS CLI command to check if the ECR Image was pushed", + }); + + new cdk.CfnOutput(this, "SourceURI", { + value: `s3://${props.pipelineSourceBucket.bucketName}/${props.pipelineSourcePrefix}/${sourceRepoAsset.s3ObjectKey}`, + description: "The source-repo bucket uri for this pipeline.", + }); + } +} diff --git a/lib/codepipeline-embedded-linux.ts b/lib/codepipeline-embedded-linux.ts new file mode 100644 index 0000000..b27fdcb --- /dev/null +++ b/lib/codepipeline-embedded-linux.ts @@ -0,0 +1,541 @@ +import * as path from "path"; +import * as fs from "fs"; + +import * as cdk from "aws-cdk-lib"; +import { Construct } from "constructs"; +import { BucketDeployment, Source } from "aws-cdk-lib/aws-s3-deployment"; +import { Asset } from "aws-cdk-lib/aws-s3-assets"; +import * as codepipeline from "aws-cdk-lib/aws-codepipeline"; +import * as codepipeline_actions from "aws-cdk-lib/aws-codepipeline-actions"; +import * as codebuild from "aws-cdk-lib/aws-codebuild"; +import * as events from "aws-cdk-lib/aws-events"; +import * as events_target from "aws-cdk-lib/aws-events-targets"; +import * as targets from "aws-cdk-lib/aws-events-targets"; +import * as lambda from "aws-cdk-lib/aws-lambda"; +import * as iam from "aws-cdk-lib/aws-iam"; +import * as efs from "aws-cdk-lib/aws-efs"; +import * as s3 from "aws-cdk-lib/aws-s3"; +import * as ecr from "aws-cdk-lib/aws-ecr"; +import * as ec2 from "aws-cdk-lib/aws-ec2"; +import * as logs from "aws-cdk-lib/aws-logs"; +import * as kms from "aws-cdk-lib/aws-kms"; +import { ProjectType } from "."; + +/** + * Properties to allow customizing the build. + */ +export interface EmbeddedLinuxCodePipelineProps extends cdk.StackProps { + /** The pipeline source bucket */ + readonly pipelineSourceBucket: s3.IBucket; + /** The pipeline source prefix */ + pipelineSourcePrefix?: string; + /** The pipeline artifact bucket to use */ + readonly pipelineArtifactBucket: s3.Bucket; + /** The pipeline artifact bucket prefix to use */ + pipelineArtifactPrefix?: string; + /** The pipeline output bucket to use */ + readonly pipelineOutputBucket: s3.Bucket; + /** The pipeline output bucket prefix to use */ + pipelineOutputPrefix?: string; + /** ECR Repository where the Build Host Image resides. */ + readonly ecrRepository: ecr.IRepository; + /** Tag for the Build Host Image */ + readonly ecrRepositoryImageTag: string; + /** The type of project being built. */ + readonly projectType: ProjectType; + /** VPC where the networking setup resides. */ + readonly vpc: ec2.IVpc; + /** Additional policy statements to add to the build project. */ + readonly buildPolicyAdditions?: iam.PolicyStatement[]; + /** Additional build environment variables to the build project. */ + readonly environmentVariables?: { + string: codebuild.BuildEnvironmentVariable; + }; + /** The encryption key use across*/ + readonly encryptionKey: kms.Key; + /** Custom asset to be provided when using ProjectType.Custom */ + readonly sourceCustomPath?: string; +} + +/** + * The stack for creating a build pipeline. + * + * See {@link EmbeddedLinuxCodePipelineProps} for configration options. + */ +export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { + constructor( + scope: Construct, + id: string, + props: EmbeddedLinuxCodePipelineProps, + ) { + super(scope, id, props); + + if (!props.pipelineSourcePrefix) { + props.pipelineSourcePrefix = `${props.projectType}`; + } + if (!props.pipelineArtifactPrefix) { + props.pipelineArtifactPrefix = `${props.projectType}`; + } + if (!props.pipelineOutputPrefix) { + props.pipelineOutputPrefix = `${props.projectType}`; + } + + /** Set up networking access and EFS FileSystems. */ + const projectSg = new ec2.SecurityGroup( + this, + "EmbeddedLinuxCodePipelineBuildProjectSecurityGroup", + { + vpc: props.vpc, + description: "Security Group to allow attaching EFS", + }, + ); + projectSg.addIngressRule( + ec2.Peer.ipv4(props.vpc.vpcCidrBlock), + ec2.Port.tcp(2049), + "NFS Mount Port", + ); + const efsFileSystem: efs.FileSystem = new efs.FileSystem( + this, + `EmbeddedLinuxCodePipelineFileSystem`, + { + vpc: props.vpc, + allowAnonymousAccess: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + }, + ); + efsFileSystem.connections.allowFrom(projectSg, ec2.Port.tcp(2049)); + + // create the policy & role for the source bucket deployment + const pipelineSourceBucketDeploymentPolicy = new iam.PolicyDocument({ + statements: [ + new iam.PolicyStatement({ + actions: [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents", + ], + resources: [ + `arn:aws:logs:${cdk.Stack.of(this).region}:${cdk.Stack.of(this).account}:log-group:/aws/lambda/EmbeddedLinuxCodePipelineBaseImage-CustomCDKBucketDeployment*`, + ], + }), + ], + }); + const pipelineSourceBucketDeploymentRole = new iam.Role( + this, + "EmbeddedLinuxCodePipelineBucketDeploymentRole", + { + assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"), + inlinePolicies: { pipelineSourceBucketDeploymentPolicy }, + }, + ); + + // archive and upload the source-repo folder into CDK owned bucket + let sourcePath = path.join( + __dirname, + "..", + "source-repo", + props.projectType, + ); + if (props.projectType == ProjectType.Custom) { + if (!props.sourceCustomPath) { + throw new Error( + `sourceCustomPath must be provided when using ProjectType.Custom`, + ); + } + if (!fs.existsSync(`${props.sourceCustomPath}/build.buildspec.yml`)) { + throw new Error( + `sourceCustomPath must be provide a valid path to a build.buildspec.yml file (sourceCustomPath = ${props.sourceCustomPath})`, + ); + } + + sourcePath = props.sourceCustomPath; + } + const sourceRepoAsset: Asset = new Asset( + this, + "EmbeddedLinuxCodePipelineBucketDeploymentAsset", + { path: sourcePath }, + ); + + // deploy the sourceRepo to the bucket + const bucketDeployment = new BucketDeployment( + this, + "EmbeddedLinuxCodePipelineBucketDeployment", + { + sources: [ + Source.bucket(sourceRepoAsset.bucket, sourceRepoAsset.s3ObjectKey), + ], + destinationBucket: props.pipelineSourceBucket, + role: pipelineSourceBucketDeploymentRole, + extract: false, + destinationKeyPrefix: props.pipelineSourcePrefix, + }, + ); + + /** Create our CodeCodePipeline Actions. */ + const sourceActionOutputArtifact = new codepipeline.Artifact("Source"); + const sourceAction = new codepipeline_actions.S3SourceAction({ + actionName: "Source", + trigger: codepipeline_actions.S3Trigger.EVENTS, + output: sourceActionOutputArtifact, + bucket: props.pipelineSourceBucket, + bucketKey: `${props.pipelineSourcePrefix}/${sourceRepoAsset.s3ObjectKey}`, + }); + + // adding the proper roles and policies in case the pipeline will export the image as an AMI + const vmImportRole = this.createVMImportRole(id, props); + + /** Create our CodeCodePipeline Project. */ + const project = new codebuild.PipelineProject( + this, + "EmbeddedLinuxCodePipelineProject", + { + projectName: `${id}`, + buildSpec: codebuild.BuildSpec.fromSourceFilename( + "build.buildspec.yml", + ), + environment: { + computeType: codebuild.ComputeType.X_LARGE, + buildImage: codebuild.LinuxBuildImage.fromEcrRepository( + props.ecrRepository, + props.ecrRepositoryImageTag, + ), + privileged: true, + environmentVariables: { + ...props.environmentVariables, + AWS_ACCOUNT_ID: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: cdk.Stack.of(this).account, + }, + AWS_DEFAULT_REGION: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: cdk.Stack.of(this).region, + }, + PIPELINE_PROJECT_NAME: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: id, + }, + PIPELINE_OUTPUT_BUCKET: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: props.pipelineOutputBucket.bucketName, + }, + PIPELINE_OUTPUT_BUCKET_PREFIX: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: props.pipelineOutputPrefix, + }, + VM_IMPORT_ROLE: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: vmImportRole.roleName, + }, + }, + }, + timeout: cdk.Duration.hours(4), + vpc: props.vpc, + securityGroups: [projectSg], + fileSystemLocations: [ + codebuild.FileSystemLocation.efs({ + identifier: "nfs", + location: `${efsFileSystem.fileSystemId}.efs.${efsFileSystem.env.region}.amazonaws.com:/`, + mountPoint: "/nfs", + }), + ], + logging: { + cloudWatch: { + logGroup: new logs.LogGroup( + this, + "EmbeddedLinuxCodePipelineProjectLogs", + { + logGroupName: `${id}-EmbeddedLinuxCodePipelineProjectLogs`, + retention: logs.RetentionDays.ONE_YEAR, + removalPolicy: cdk.RemovalPolicy.DESTROY, + }, + ), + }, + }, + encryptionKey: props.encryptionKey, + }, + ); + project.node.addDependency(bucketDeployment); + + if (props.buildPolicyAdditions) { + props.buildPolicyAdditions.map((p) => project.addToRolePolicy(p)); + } + + // adding the proper roles and policies in case the pipeline will export the image as an AMI + props.pipelineOutputBucket.grantReadWrite(project); + this.addAMIExportPolicy(project, props); + + const buildActionOutputArtifact = new codepipeline.Artifact(); + const buildAction = new codepipeline_actions.CodeBuildAction({ + input: sourceActionOutputArtifact, + actionName: "Build", + outputs: [buildActionOutputArtifact], + project, + }); + + const artifactAction: codepipeline_actions.S3DeployAction = + new codepipeline_actions.S3DeployAction({ + actionName: "Artifact", + input: buildActionOutputArtifact, + bucket: props.pipelineArtifactBucket, + objectKey: `${props.pipelineArtifactPrefix}/${sourceRepoAsset.s3ObjectKey}`, + }); + + /** Here we create the logic to check for presence of ECR image on the CodeCodePipeline automatic triggering upon resource creation, + * and stop the execution if the image does not exist. */ + const fnOnCodePipelineCreate = new lambda.Function( + this, + "EmbeddedLinuxCodePipelineOSImageCheckOnStart", + { + runtime: lambda.Runtime.PYTHON_3_10, + handler: "index.handler", + code: lambda.Code.fromInline(` + import boto3 + import json + + ecr_client = boto3.client('ecr') + codepipeline_client = boto3.client('codepipeline') + + def handler(event, context): + print("Received event: " + json.dumps(event, indent=2)) + response = ecr_client.describe_images(repositoryName='${props.ecrRepository.repositoryName}', filter={'tagStatus': 'TAGGED'}) + for i in response['imageDetails']: + if '${props.ecrRepositoryImageTag}' in i['ecrRepositoryImageTags']: + break + else: + print('OS image not found. Stopping execution.') + response = codepipeline_client.stop_pipeline_execution( + pipelineName=event['detail']['pipeline'], + pipelineExecutionId=event['detail']['execution-id'], + abandon=True, + reason='OS image not found in ECR repository. Stopping pipeline until image is present.') + `), + logRetention: logs.RetentionDays.ONE_YEAR, + }, + ); + + const pipelineCreateRule = new events.Rule( + this, + "EmbeddedLinuxCodePipelineOnCodePipelineStartRule", + { + eventPattern: { + detailType: ["CodeCodePipeline CodePipeline Execution State Change"], + source: ["aws.codepipeline"], + detail: { + state: ["STARTED"], + "execution-trigger": { + "trigger-type": ["CreateCodePipeline"], + }, + }, + }, + }, + ); + pipelineCreateRule.addTarget( + new targets.LambdaFunction(fnOnCodePipelineCreate), + ); + + /** Now create the actual CodePipeline */ + const pipeline = new codepipeline.Pipeline( + this, + "EmbeddedLinuxCodePipeline", + { + pipelineName: `${id}`, + artifactBucket: props.pipelineArtifactBucket, + restartExecutionOnUpdate: true, + pipelineType: codepipeline.PipelineType.V1, + stages: [ + { + stageName: "Source", + actions: [sourceAction], + }, + { + stageName: "Build", + actions: [buildAction], + }, + { + stageName: "Artifact", + actions: [artifactAction], + }, + ], + }, + ); + pipeline.node.addDependency(project); + + const stopCodePipelinePolicy = new iam.PolicyStatement({ + actions: ["codepipeline:StopCodePipelineExecution"], + resources: [pipeline.pipelineArn], + }); + + const ecrPolicy = new iam.PolicyStatement({ + actions: ["ecr:DescribeImages"], + resources: [props.ecrRepository.repositoryArn], + }); + fnOnCodePipelineCreate.role?.attachInlinePolicy( + new iam.Policy(this, "EmbeddedLinuxCodePipelineCheckOSAndStop", { + statements: [stopCodePipelinePolicy, ecrPolicy], + }), + ); + + // Run this pipeline weekly to update the image OS regularly. + const pipelineTarget = new events_target.CodePipeline(pipeline); + new events.Rule(this, "EmbeddedLinuxCodePipelineWeeklyRefreshSchedule", { + schedule: events.Schedule.cron({ + weekDay: "Tuesday", + minute: "0", + hour: "6", + }), + targets: [pipelineTarget], + }); + + // Add stack output for the source-repo bucket uri for this pipeline + new cdk.CfnOutput(this, "SourceURI", { + value: `s3://${props.pipelineSourceBucket.bucketName}/${props.pipelineSourcePrefix}/${sourceRepoAsset.s3ObjectKey}`, + description: "The source bucket uri for this pipeline.", + }); + + new cdk.CfnOutput(this, "OutputURI", { + value: `s3://${props.pipelineOutputBucket.bucketName}/${props.pipelineOutputPrefix}`, + description: "The output bucket of this pipeline.", + }); + + new cdk.CfnOutput(this, "ArtifactURI", { + value: `s3://${props.pipelineArtifactBucket.bucketName}/${props.pipelineArtifactPrefix}/${sourceRepoAsset.s3ObjectKey}`, + description: "The artifact bucket of this pipeline.", + }); + } + + private createVMImportRole( + id: string, + props: EmbeddedLinuxCodePipelineProps, + ) { + // Adapted from meta-aws-ewaol and + // https://docs.aws.amazon.com/vm-import/latest/userguide/required-permissions.html + const vmImportPolicy = new iam.PolicyDocument({ + statements: [ + new iam.PolicyStatement({ + actions: ["s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket"], + resources: [ + props.pipelineOutputBucket.bucketArn, + `${props.pipelineOutputBucket.bucketArn}/*`, + ], + }), + new iam.PolicyStatement({ + actions: ["ec2:CreateTags", "ec2:DescribeTags"], + resources: ["*"], + conditions: { + StringEquals: { + "ec2:ResourceTag/CreatedBy": [id], + }, + }, + }), + new iam.PolicyStatement({ + actions: ["ec2:CopySnapshot"], + resources: [`arn:aws:ec2:${cdk.Stack.of(this).region}::snapshot/*`], + }), + new iam.PolicyStatement({ + actions: ["ec2:DescribeSnapshots"], + resources: ["*"], + }), + new iam.PolicyStatement({ + actions: [ + "kms:CreateGrant", + "kms:Decrypt", + "kms:DescribeKey", + "kms:GenerateDataKeyWithoutPlaintext", + ], + resources: [props.encryptionKey.keyArn], + }), + ], + }); + + const vmImportRole = new iam.Role( + this, + "EmbeddedLinuxCodePipelineVMImportRole", + { + roleName: `${id}-vm-mport`, + assumedBy: new iam.ServicePrincipal("vmie.amazonaws.com"), + externalIds: ["vmimport"], + inlinePolicies: { vmImportPolicy }, + }, + ); + return vmImportRole; + } + + private addAMIExportPolicy( + project: codebuild.PipelineProject, + props: EmbeddedLinuxCodePipelineProps, + ) { + project.addToRolePolicy( + new iam.PolicyStatement({ + actions: [ + "ec2:CreateImage", + "ec2:CreateTags", + "ec2:DescribeImages", + "ec2:DescribeSnapshots", + "ec2:DescribeImportSnapshotTasks", + "ec2:DescribeTags", + "ec2:CancelImportTask", + ], + resources: ["*"], + }), + ); + project.addToRolePolicy( + new iam.PolicyStatement({ + actions: ["ec2:ImportSnapshot"], + resources: [ + `arn:aws:ec2:${cdk.Stack.of(this).region}:${cdk.Stack.of(this).account}:import-snapshot-task/*`, + `arn:aws:ec2:${cdk.Stack.of(this).region}::snapshot/*`, + ], + }), + ); + //Permissions for BackUp to S3 + project.addToRolePolicy( + new iam.PolicyStatement({ + actions: [ + "s3:GetObject", + "s3:ListBucket", + "s3:PutObject", + "s3:PutObjectTagging", + "s3:AbortMultipartUpload", + ], + resources: [ + `${props.pipelineOutputBucket.bucketArn}`, + `${props.pipelineOutputBucket.bucketArn}/*`, + ], + }), + ); + project.addToRolePolicy( + new iam.PolicyStatement({ + actions: [ + "ec2:RegisterImage", + "ec2:DeregisterImage", + "ec2:CreateStoreImageTask", + ], + resources: [ + `arn:aws:ec2:${cdk.Stack.of(this).region}::image/*`, + `arn:aws:ec2:${cdk.Stack.of(this).region}::snapshot/snap-*`, + ], + }), + ); + project.addToRolePolicy( + new iam.PolicyStatement({ + actions: [ + "ebs:CompleteSnapshot", + "ebs:GetSnapshotBlock", + "ebs:ListChangedBlocks", + "ebs:ListSnapshotBlocks", + "ebs:PutSnapshotBlock", + ], + resources: [`arn:aws:ec2:${cdk.Stack.of(this).region}::snapshot/*`], + }), + ); + project.addToRolePolicy( + new iam.PolicyStatement({ + actions: [ + "ec2:DescribeStoreImageTasks", + "ec2:GetEbsEncryptionByDefault", + ], + resources: ["*"], + }), + ); + } +} diff --git a/lib/codepipeline-resources.ts b/lib/codepipeline-resources.ts new file mode 100644 index 0000000..28ced5d --- /dev/null +++ b/lib/codepipeline-resources.ts @@ -0,0 +1,173 @@ +import * as cdk from "aws-cdk-lib"; +import { Construct } from "constructs"; +import * as s3 from "aws-cdk-lib/aws-s3"; +import * as ecr from "aws-cdk-lib/aws-ecr"; +import * as kms from "aws-cdk-lib/aws-kms"; +import * as ec2 from "aws-cdk-lib/aws-ec2"; +import * as logs from "aws-cdk-lib/aws-logs"; + +/** + * Select options for the {@link PipelineResourcesStack}. + */ +export interface PipelineResourcesProps extends cdk.StackProps { + /** The resource prefix*/ + readonly resource_prefix: string; + /** The ecr repository name - if not provided then the name will be '{prefix}-{account}-{region}-repo'*/ + readonly ecrRepositoryName?: string; + /** The artifact bucket name - if not provided then the name will be '{prefix}-{account}-{region}-artifact'*/ + readonly pipelineArtifactBucketName?: string; + /** The source bucket name - if not provided then the name will be '{prefix}-{account}-{region}-source'*/ + readonly pipelineSourceBucketName?: string; + /** The output bucket name - if not provided then the name will be '{prefix}-{account}-{region}-output'*/ + readonly pipelineOutputBucketName?: string; + /** Cloudwatch logging bucket name - if not provided then the name will be '{prefix}-{account}-{region}-logs'*/ + readonly loggingBucketName?: string; +} + +/** + * Input (Source) data for our {@link PipelineResourcesStack}. + */ +export class PipelineResourcesStack extends cdk.Stack { + /** The VPC for the pipeline to reside in. */ + public readonly vpc: ec2.IVpc; + /** The respository to put the build host container in. */ + public readonly ecrRepository: ecr.IRepository; + /** The artifact bucket*/ + readonly pipelineArtifactBucket: s3.Bucket; + /** The source bucket*/ + readonly pipelineSourceBucket: s3.Bucket; + /** The output bucket*/ + readonly pipelineOutputBucket: s3.Bucket; + /** The Cloudwatch logging bucket*/ + public readonly loggingBucket?: s3.Bucket; + /** The encryption key use across*/ + public readonly encryptionKey: kms.Key; + + constructor(scope: Construct, id: string, props: PipelineResourcesProps) { + super(scope, id, props); + + const ecrRepositoryName = props.ecrRepositoryName + ? props.ecrRepositoryName + : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-repo`.toLowerCase(); + const pipelineArtifactBucketName = props.pipelineArtifactBucketName + ? props.pipelineArtifactBucketName + : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-artifact`.toLowerCase(); + const pipelineSourceBucketName = props.pipelineSourceBucketName + ? props.pipelineSourceBucketName + : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-source`.toLowerCase(); + const pipelineOutputBucketName = props.pipelineOutputBucketName + ? props.pipelineOutputBucketName + : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-output`.toLowerCase(); + const loggingBucketName = props.loggingBucketName + ? props.loggingBucketName + : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-logs`.toLowerCase(); + + // We will create a VPC with 3 Private and Public subnets for AWS + // Resources that have network interfaces (e.g. Connecting and EFS + // Filesystem to a CodeBuild Project). + this.vpc = new ec2.Vpc(this, "PipelineResourcesVpc", { + ipAddresses: ec2.IpAddresses.cidr("10.0.0.0/16"), + }); + + new ec2.FlowLog(this, "PipelineResourcesVPCFlowLogs", { + resourceType: ec2.FlowLogResourceType.fromVpc(this.vpc), + destination: ec2.FlowLogDestination.toCloudWatchLogs( + new logs.LogGroup(this, "PipelineResourcesVPCFlowLogGroup", { + logGroupName: `${id}-PipelineResourcesVPCFlowLogGroup`, + retention: logs.RetentionDays.ONE_YEAR, + removalPolicy: cdk.RemovalPolicy.DESTROY, + }), + ), + }); + + this.ecrRepository = new ecr.Repository( + this, + "PipelineResourcesECRRepository", + { + repositoryName: ecrRepositoryName, + removalPolicy: cdk.RemovalPolicy.DESTROY, + emptyOnDelete: true, + }, + ); + + this.encryptionKey = new kms.Key(this, "PipelineResourcesArtifactKey", { + removalPolicy: cdk.RemovalPolicy.DESTROY, + enableKeyRotation: true, + }); + + // Create a bucket, then allow a deployment Lambda to upload to it. + this.loggingBucket = new s3.Bucket(this, "PipelineResourcesLoggingBucket", { + bucketName: loggingBucketName, + versioned: true, + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + encryptionKey: this.encryptionKey, + }); + + this.pipelineSourceBucket = new s3.Bucket( + this, + "PipelineResourcesSourceBucket", + { + bucketName: pipelineSourceBucketName, + versioned: true, + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + encryptionKey: this.encryptionKey, + serverAccessLogsBucket: this.loggingBucket, + serverAccessLogsPrefix: "source-bucket", + }, + ); + + this.pipelineArtifactBucket = new s3.Bucket( + this, + "PipelineResourcesArtifactBucket", + { + bucketName: pipelineArtifactBucketName, + versioned: true, + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + encryptionKey: this.encryptionKey, + serverAccessLogsBucket: this.loggingBucket, + serverAccessLogsPrefix: "artifact-bucket", + }, + ); + + this.pipelineOutputBucket = new s3.Bucket( + this, + "PipelineResourcesOutputBucket", + { + bucketName: pipelineOutputBucketName, + versioned: true, + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + encryptionKey: this.encryptionKey, + serverAccessLogsBucket: this.loggingBucket, + serverAccessLogsPrefix: "output-bucket", + }, + ); + + new cdk.CfnOutput(this, "LoggingBucket", { + value: this.loggingBucket.bucketName, + description: "The access logging bucket.", + }); + + new cdk.CfnOutput(this, "SourceBucket", { + value: this.pipelineSourceBucket.bucketName, + description: "The source bucket.", + }); + + new cdk.CfnOutput(this, "ArtifactBucket", { + value: this.pipelineArtifactBucket.bucketName, + description: "The artifact bucket.", + }); + + new cdk.CfnOutput(this, "OutputBucket", { + value: this.pipelineOutputBucket.bucketName, + description: "The output bucket.", + }); + } +} diff --git a/lib/constructs/source-repo.ts b/lib/constructs/source-repo.ts deleted file mode 100644 index ccc0724..0000000 --- a/lib/constructs/source-repo.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import { Code, Repository } from 'aws-cdk-lib/aws-codecommit'; - -import * as path from 'path'; - -/** - * The kind of project built. - */ -export enum ProjectKind { - /** Build core-image-minimal from poky. */ - Poky = 'poky', - /** Build the Qemu meta-aws Demonstration Distribution. */ - MetaAwsDemo = 'meta-aws-demo', - /** Build an EC2 AMI */ - PokyAmi = 'poky-ami', - /** Build an kas based image */ - Kas = 'kas', - /** Build an Renesas image */ - Renesas = 'renesas', - /** Build an IMX image using NXP layers. */ - NxpImx = 'nxp-imx', - /** Build no pipeline, just CodeBuild project to connect with GitHub actions. */ - CodeBuild = 'codebuild', -} - -export interface SourceRepoProps extends cdk.StackProps { - /** The name of the CodeCommit Repository created. */ - readonly repoName: string; - /** The type of project to seed this repository with. */ - readonly kind: ProjectKind; -} - -/** - * The repository for the Source Stage of the pipeline. - * - * The initial contents of this repository are seeded by the assets contained - * in the `source-repo/` folder of this library. - */ -export class SourceRepo extends Construct { - /** The CodeCommit Repo itself. */ - readonly repo: Repository; - - constructor(scope: Construct, id: string, props: SourceRepoProps) { - super(scope, id); - - this.repo = new Repository(this, 'SourceRepository', { - repositoryName: props.repoName, - code: Code.fromDirectory( - path.join(__dirname, '..', '..', 'source-repo', props.kind), - 'main' - ), - }); - } -} diff --git a/lib/embedded-linux-codebuild-project.ts b/lib/embedded-linux-codebuild-project.ts deleted file mode 100644 index 544a67c..0000000 --- a/lib/embedded-linux-codebuild-project.ts +++ /dev/null @@ -1,261 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import * as events from 'aws-cdk-lib/aws-events'; -import * as targets from 'aws-cdk-lib/aws-events-targets'; -import * as lambda from 'aws-cdk-lib/aws-lambda'; -import * as iam from 'aws-cdk-lib/aws-iam'; -import * as efs from 'aws-cdk-lib/aws-efs'; -import * as s3 from 'aws-cdk-lib/aws-s3'; - -import { - BuildSpec, - ComputeType, - FileSystemLocation, - LinuxBuildImage, - Project, -} from 'aws-cdk-lib/aws-codebuild'; -import { IRepository } from 'aws-cdk-lib/aws-ecr'; - -import { - ISecurityGroup, - IVpc, - Peer, - Port, - SecurityGroup, -} from 'aws-cdk-lib/aws-ec2'; -import { ProjectKind } from './constructs/source-repo'; -import { VMImportBucket } from './vm-import-bucket'; -import { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs'; -import { RemovalPolicy } from 'aws-cdk-lib'; - -/** - * Properties to allow customizing the build. - */ -export interface EmbeddedLinuxCodebuildProjectProps extends cdk.StackProps { - /** ECR Repository where the Build Host Image resides. */ - readonly imageRepo: IRepository; - /** Tag for the Build Host Image */ - readonly imageTag?: string; - /** VPC where the networking setup resides. */ - readonly vpc: IVpc; - /** The type of project being built. */ - readonly projectKind?: ProjectKind; - /** A name for the layer-repo that is created. Default is 'layer-repo' */ - readonly layerRepoName?: string; - /** Additional policy statements to add to the build project. */ - readonly buildPolicyAdditions?: iam.PolicyStatement[]; - /** Access logging bucket to use */ - readonly accessLoggingBucket?: s3.Bucket; - /** Access logging prefix to use */ - readonly serverAccessLogsPrefix?: string; - /** Artifact bucket to use */ - readonly artifactBucket?: s3.Bucket; - /** Output bucket to use */ - readonly outputBucket?: s3.Bucket | VMImportBucket; - /** Prefix for S3 object within bucket */ - readonly subDirectoryName?: string; -} - -/** - * The stack for creating a build pipeline. - * - * See {@link EmbeddedLinuxCodebuildProjectProps} for configration options. - */ -export class EmbeddedLinuxCodebuildProjectStack extends cdk.Stack { - constructor( - scope: Construct, - id: string, - props: EmbeddedLinuxCodebuildProjectProps - ) { - super(scope, id, props); - - /** Set up networking access and EFS FileSystems. */ - - const projectSg = new SecurityGroup(this, 'BuildProjectSecurityGroup', { - vpc: props.vpc, - description: 'Security Group to allow attaching EFS', - }); - projectSg.addIngressRule( - Peer.ipv4(props.vpc.vpcCidrBlock), - Port.tcp(2049), - 'NFS Mount Port' - ); - - const sstateFS = this.addFileSystem('SState', props.vpc, projectSg); - const dlFS = this.addFileSystem('Downloads', props.vpc, projectSg); - const tmpFS = this.addFileSystem('Temp', props.vpc, projectSg); - - // let accessLoggingBucket: s3.IBucket; - - if (props.accessLoggingBucket) { - // accessLoggingBucket = props.accessLoggingBucket; - } else { - /* accessLoggingBucket = */ - new s3.Bucket(this, 'ArtifactAccessLogging', { - versioned: true, - enforceSSL: true, - autoDeleteObjects: true, - removalPolicy: RemovalPolicy.DESTROY, - }); - } - - /** Create our CodeBuild Project. */ - const project = new Project(this, 'EmbeddedLinuxCodebuildProject', { - buildSpec: BuildSpec.fromObject({ - version: '0.2', - phases: { - build: { - commands: ['echo "DUMMY BUILDSPEC - can not be empty"'], - }, - }, - artifacts: { - files: ['**/*'], - 'base-directory': '.', - }, - }), - environment: { - computeType: ComputeType.X2_LARGE, - buildImage: LinuxBuildImage.fromEcrRepository( - props.imageRepo, - props.imageTag - ), - privileged: true, - }, - timeout: cdk.Duration.hours(4), - vpc: props.vpc, - securityGroups: [projectSg], - fileSystemLocations: [ - FileSystemLocation.efs({ - identifier: 'tmp_dir', - location: tmpFS, - mountPoint: '/build-output', - }), - FileSystemLocation.efs({ - identifier: 'sstate_cache', - location: sstateFS, - mountPoint: '/sstate-cache', - }), - FileSystemLocation.efs({ - identifier: 'dl_dir', - location: dlFS, - mountPoint: '/downloads', - }), - ], - logging: { - cloudWatch: { - logGroup: new LogGroup(this, 'PipelineBuildLogs', { - retention: RetentionDays.TEN_YEARS, - }), - }, - }, - }); - - if (props.buildPolicyAdditions) { - props.buildPolicyAdditions.map((p) => project.addToRolePolicy(p)); - } - - project.addToRolePolicy(this.addProjectPolicies()); - - project.role?.addManagedPolicy( - iam.ManagedPolicy.fromAwsManagedPolicyName('AWSCodeBuildAdminAccess') - ); - - /** Here we create the logic to check for presence of ECR image on the CodePipeline automatic triggering upon resource creation, - * and stop the execution if the image does not exist. */ - const fnOnPipelineCreate = new lambda.Function( - this, - 'OSImageCheckOnStart', - { - runtime: lambda.Runtime.PYTHON_3_10, - handler: 'index.handler', - code: lambda.Code.fromInline(` -import boto3 -import json - -ecr_client = boto3.client('ecr') -codepipeline_client = boto3.client('codepipeline') - -def handler(event, context): - print("Received event: " + json.dumps(event, indent=2)) - response = ecr_client.describe_images(repositoryName='${props.imageRepo.repositoryName}', filter={'tagStatus': 'TAGGED'}) - for i in response['imageDetails']: - if '${props.imageTag}' in i['imageTags']: - break - else: - print('OS image not found. Stopping execution.') - response = codepipeline_client.stop_pipeline_execution( - pipelineName=event['detail']['pipeline'], - pipelineExecutionId=event['detail']['execution-id'], - abandon=True, - reason='OS image not found in ECR repository. Stopping pipeline until image is present.') - `), - logRetention: RetentionDays.TEN_YEARS, - } - ); - - const pipelineCreateRule = new events.Rule(this, 'OnPipelineStartRule', { - eventPattern: { - detailType: ['CodePipeline Pipeline Execution State Change'], - source: ['aws.codepipeline'], - detail: { - state: ['STARTED'], - 'execution-trigger': { - 'trigger-type': ['CreatePipeline'], - }, - }, - }, - }); - pipelineCreateRule.addTarget( - new targets.LambdaFunction(fnOnPipelineCreate) - ); - } - - /** - * Adds an EFS FileSystem to the VPC and SecurityGroup. - * - * @param name - A name to differentiate the filesystem. - * @param vpc - The VPC the Filesystem resides in. - * @param securityGroup - A SecurityGroup to allow access to the filesystem from. - * @returns The filesystem location URL. - * - */ - private addFileSystem( - name: string, - vpc: IVpc, - securityGroup: ISecurityGroup - ): string { - const fs = new efs.FileSystem( - this, - `EmbeddedLinuxPipeline${name}Filesystem`, - { - vpc, - removalPolicy: cdk.RemovalPolicy.DESTROY, - } - ); - - fs.connections.allowFrom(securityGroup, Port.tcp(2049)); - - const fsId = fs.fileSystemId; - const region = cdk.Stack.of(this).region; - - return `${fsId}.efs.${region}.amazonaws.com:/`; - } - - private addProjectPolicies(): iam.PolicyStatement { - return new iam.PolicyStatement({ - actions: [ - 'ec2:DescribeSecurityGroups', - 'codestar-connections:GetConnection', - 'codestar-connections:GetConnectionToken', - 'codeconnections:GetConnectionToken', - 'codeconnections:GetConnection', - 'codeconnections:UseConnection', - 'codebuild:ListConnectedOAuthAccounts', - 'codebuild:ListRepositories', - 'codebuild:PersistOAuthToken', - 'codebuild:ImportSourceCredentials', - ], - resources: ['*'], - }); - } -} diff --git a/lib/embedded-linux-pipeline.ts b/lib/embedded-linux-pipeline.ts deleted file mode 100644 index 7e8af5e..0000000 --- a/lib/embedded-linux-pipeline.ts +++ /dev/null @@ -1,475 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import * as codepipeline from 'aws-cdk-lib/aws-codepipeline'; -import * as codepipeline_actions from 'aws-cdk-lib/aws-codepipeline-actions'; -import * as events from 'aws-cdk-lib/aws-events'; -import * as targets from 'aws-cdk-lib/aws-events-targets'; -import * as lambda from 'aws-cdk-lib/aws-lambda'; -import * as iam from 'aws-cdk-lib/aws-iam'; -import * as efs from 'aws-cdk-lib/aws-efs'; -import * as kms from 'aws-cdk-lib/aws-kms'; -import * as s3 from 'aws-cdk-lib/aws-s3'; -import * as path from 'path'; - -import { - BuildEnvironmentVariableType, - BuildSpec, - ComputeType, - FileSystemLocation, - LinuxBuildImage, - PipelineProject, -} from 'aws-cdk-lib/aws-codebuild'; -import { IRepository } from 'aws-cdk-lib/aws-ecr'; - -import { - ISecurityGroup, - IVpc, - Peer, - Port, - SecurityGroup, -} from 'aws-cdk-lib/aws-ec2'; -import { SourceRepo, ProjectKind } from './constructs/source-repo'; -import { VMImportBucket } from './vm-import-bucket'; -import { Asset } from 'aws-cdk-lib/aws-s3-assets'; -import { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs'; -import { RemovalPolicy } from 'aws-cdk-lib'; - -/** - * Properties to allow customizing the build. - */ -export interface EmbeddedLinuxPipelineProps extends cdk.StackProps { - /** ECR Repository where the Build Host Image resides. */ - readonly imageRepo: IRepository; - /** Tag for the Build Host Image */ - readonly imageTag?: string; - /** VPC where the networking setup resides. */ - readonly vpc: IVpc; - /** The type of project being built. */ - readonly projectKind?: ProjectKind; - /** A name for the layer-repo that is created. Default is 'layer-repo' */ - readonly layerRepoName?: string; - /** Additional policy statements to add to the build project. */ - readonly buildPolicyAdditions?: iam.PolicyStatement[]; - /** Access logging bucket to use */ - readonly accessLoggingBucket?: s3.Bucket; - /** Access logging prefix to use */ - readonly serverAccessLogsPrefix?: string; - /** Artifact bucket to use */ - readonly artifactBucket?: s3.Bucket; - /** Output bucket to use */ - readonly outputBucket?: s3.Bucket | VMImportBucket; - /** Prefix for S3 object within bucket */ - readonly subDirectoryName?: string; -} - -/** - * The stack for creating a build pipeline. - * - * See {@link EmbeddedLinuxPipelineProps} for configration options. - */ -export class EmbeddedLinuxPipelineStack extends cdk.Stack { - constructor(scope: Construct, id: string, props: EmbeddedLinuxPipelineProps) { - super(scope, id, props); - - /** Set up networking access and EFS FileSystems. */ - - const projectSg = new SecurityGroup(this, 'BuildProjectSecurityGroup', { - vpc: props.vpc, - description: 'Security Group to allow attaching EFS', - }); - projectSg.addIngressRule( - Peer.ipv4(props.vpc.vpcCidrBlock), - Port.tcp(2049), - 'NFS Mount Port' - ); - - const sstateFS = this.addFileSystem('SState', props.vpc, projectSg); - const dlFS = this.addFileSystem('Downloads', props.vpc, projectSg); - const tmpFS = this.addFileSystem('Temp', props.vpc, projectSg); - - let outputBucket: s3.IBucket | VMImportBucket; - let environmentVariables = {}; - let scriptAsset!: Asset; - let accessLoggingBucket: s3.IBucket; - - if (props.accessLoggingBucket) { - accessLoggingBucket = props.accessLoggingBucket; - } else { - accessLoggingBucket = new s3.Bucket(this, 'ArtifactAccessLogging', { - versioned: true, - enforceSSL: true, - autoDeleteObjects: true, - removalPolicy: RemovalPolicy.DESTROY, - }); - } - - if (props.projectKind && props.projectKind == ProjectKind.PokyAmi) { - scriptAsset = new Asset(this, 'CreateAMIScript', { - path: path.join(__dirname, '../assets/create-ec2-ami.sh'), - }); - - const outputBucketEncryptionKey = new kms.Key( - this, - 'OutputBucketEncryptionKey', - { - removalPolicy: RemovalPolicy.DESTROY, - enableKeyRotation: true, - } - ); - - if (props.outputBucket) { - outputBucket = props.outputBucket; - } else { - outputBucket = new VMImportBucket(this, 'PipelineOutput', { - versioned: true, - enforceSSL: true, - encryptionKey: outputBucketEncryptionKey, - encryptionKeyArn: outputBucketEncryptionKey.keyArn, - serverAccessLogsBucket: accessLoggingBucket, - serverAccessLogsPrefix: props.serverAccessLogsPrefix, - autoDeleteObjects: true, - removalPolicy: RemovalPolicy.DESTROY, - }); - } - environmentVariables = { - IMPORT_BUCKET: { - type: BuildEnvironmentVariableType.PLAINTEXT, - value: outputBucket.bucketName, - }, - ROLE_NAME: { - type: BuildEnvironmentVariableType.PLAINTEXT, - value: (outputBucket as VMImportBucket).roleName, - }, - SCRIPT_URL: { - type: BuildEnvironmentVariableType.PLAINTEXT, - value: scriptAsset.s3ObjectUrl, - }, - }; - } else { - if (props.outputBucket) { - outputBucket = props.outputBucket; - } else { - outputBucket = new s3.Bucket(this, 'PipelineOutput', { - versioned: true, - enforceSSL: true, - serverAccessLogsBucket: accessLoggingBucket, - autoDeleteObjects: true, - removalPolicy: RemovalPolicy.DESTROY, - }); - } - } - - let artifactBucket: s3.IBucket; - - if (props.artifactBucket) { - artifactBucket = props.artifactBucket; - } else { - const encryptionKey = new kms.Key(this, 'PipelineArtifactKey', { - removalPolicy: RemovalPolicy.DESTROY, - enableKeyRotation: true, - }); - artifactBucket = new s3.Bucket(this, 'PipelineArtifacts', { - versioned: true, - enforceSSL: true, - serverAccessLogsBucket: accessLoggingBucket, - encryptionKey, - encryption: s3.BucketEncryption.KMS, - blockPublicAccess: new s3.BlockPublicAccess( - s3.BlockPublicAccess.BLOCK_ALL - ), - autoDeleteObjects: true, - removalPolicy: RemovalPolicy.DESTROY, - }); - } - - /** Create our CodePipeline Actions. */ - const sourceRepo = new SourceRepo(this, 'SourceRepo', { - ...props, - repoName: props.layerRepoName ?? `layer-repo-${this.stackName}`, - kind: props.projectKind ?? ProjectKind.Poky, - }); - - const sourceOutput = new codepipeline.Artifact(); - const sourceAction = new codepipeline_actions.CodeCommitSourceAction({ - // trigger: CodeCommitTrigger.NONE, - output: sourceOutput, - actionName: 'Source', - repository: sourceRepo.repo, - branch: 'main', - codeBuildCloneOutput: true, - }); - - const project = new PipelineProject(this, 'EmbeddedLinuxBuildProject', { - buildSpec: BuildSpec.fromSourceFilename('build.buildspec.yml'), - environment: { - computeType: ComputeType.X2_LARGE, - buildImage: LinuxBuildImage.fromEcrRepository( - props.imageRepo, - props.imageTag - ), - privileged: true, - environmentVariables, - }, - timeout: cdk.Duration.hours(4), - vpc: props.vpc, - securityGroups: [projectSg], - fileSystemLocations: [ - FileSystemLocation.efs({ - identifier: 'tmp_dir', - location: tmpFS, - mountPoint: '/build-output', - }), - FileSystemLocation.efs({ - identifier: 'sstate_cache', - location: sstateFS, - mountPoint: '/sstate-cache', - }), - FileSystemLocation.efs({ - identifier: 'dl_dir', - location: dlFS, - mountPoint: '/downloads', - }), - ], - logging: { - cloudWatch: { - logGroup: new LogGroup(this, 'PipelineBuildLogs', { - retention: RetentionDays.TEN_YEARS, - }), - }, - }, - }); - - if (props.buildPolicyAdditions) { - props.buildPolicyAdditions.map((p) => project.addToRolePolicy(p)); - } - - if (props.projectKind && props.projectKind == ProjectKind.PokyAmi) { - outputBucket.grantReadWrite(project); - project.addToRolePolicy(this.addVMExportPolicy()); - - project.addToRolePolicy( - new iam.PolicyStatement({ - actions: ['ec2:ImportSnapshot'], - resources: [ - `arn:aws:ec2:${this.region}:${this.account}:import-snapshot-task/*`, - `arn:aws:ec2:${this.region}::snapshot/*`, - ], - }) - ); - //Permissions for BackUp to S3 - project.addToRolePolicy( - this.addAMIS3BackupPolicy(outputBucket.bucketArn) - ); - project.addToRolePolicy(this.addAMIEC2EBSBackupPolicy(this.region)); - project.addToRolePolicy(this.addAMIEBSBackupPolicy(this.region)); - project.addToRolePolicy(this.addAMIBackupPolicy()); - scriptAsset.grantRead(project); - } - - const buildOutput = new codepipeline.Artifact(); - const buildAction = new codepipeline_actions.CodeBuildAction({ - input: sourceOutput, - actionName: 'Build', - outputs: [buildOutput], - project, - }); - - let artifactAction: codepipeline_actions.S3DeployAction; - - if (props.subDirectoryName) { - artifactAction = new codepipeline_actions.S3DeployAction({ - actionName: 'Artifact', - input: buildOutput, - bucket: outputBucket, - objectKey: props.subDirectoryName, - }); - } else { - artifactAction = new codepipeline_actions.S3DeployAction({ - actionName: 'Artifact', - input: buildOutput, - bucket: outputBucket, - }); - } - - /** Here we create the logic to check for presence of ECR image on the CodePipeline automatic triggering upon resource creation, - * and stop the execution if the image does not exist. */ - const fnOnPipelineCreate = new lambda.Function( - this, - 'OSImageCheckOnStart', - { - runtime: lambda.Runtime.PYTHON_3_10, - handler: 'index.handler', - code: lambda.Code.fromInline(` -import boto3 -import json - -ecr_client = boto3.client('ecr') -codepipeline_client = boto3.client('codepipeline') - -def handler(event, context): - print("Received event: " + json.dumps(event, indent=2)) - response = ecr_client.describe_images(repositoryName='${props.imageRepo.repositoryName}', filter={'tagStatus': 'TAGGED'}) - for i in response['imageDetails']: - if '${props.imageTag}' in i['imageTags']: - break - else: - print('OS image not found. Stopping execution.') - response = codepipeline_client.stop_pipeline_execution( - pipelineName=event['detail']['pipeline'], - pipelineExecutionId=event['detail']['execution-id'], - abandon=True, - reason='OS image not found in ECR repository. Stopping pipeline until image is present.') - `), - logRetention: RetentionDays.TEN_YEARS, - } - ); - - const pipelineCreateRule = new events.Rule(this, 'OnPipelineStartRule', { - eventPattern: { - detailType: ['CodePipeline Pipeline Execution State Change'], - source: ['aws.codepipeline'], - detail: { - state: ['STARTED'], - 'execution-trigger': { - 'trigger-type': ['CreatePipeline'], - }, - }, - }, - }); - pipelineCreateRule.addTarget( - new targets.LambdaFunction(fnOnPipelineCreate) - ); - - /** Now create the actual Pipeline */ - const pipeline = new codepipeline.Pipeline(this, 'EmbeddedLinuxPipeline', { - artifactBucket, - restartExecutionOnUpdate: true, - pipelineType: codepipeline.PipelineType.V1, - stages: [ - { - stageName: 'Source', - actions: [sourceAction], - }, - { - stageName: 'Build', - actions: [buildAction], - }, - { - stageName: 'Artifact', - actions: [artifactAction], - }, - ], - }); - - const stopPipelinePolicy = new iam.PolicyStatement({ - actions: ['codepipeline:StopPipelineExecution'], - resources: [pipeline.pipelineArn], - }); - - const ecrPolicy = new iam.PolicyStatement({ - actions: ['ecr:DescribeImages'], - resources: [props.imageRepo.repositoryArn], - }); - fnOnPipelineCreate.role?.attachInlinePolicy( - new iam.Policy(this, 'CheckOSAndStop', { - statements: [stopPipelinePolicy, ecrPolicy], - }) - ); - - new cdk.CfnOutput(this, 'BuildOutput', { - value: outputBucket.bucketArn, - description: 'The output bucket of this pipeline.', - }); - } - - /** - * Adds an EFS FileSystem to the VPC and SecurityGroup. - * - * @param name - A name to differentiate the filesystem. - * @param vpc - The VPC the Filesystem resides in. - * @param securityGroup - A SecurityGroup to allow access to the filesystem from. - * @returns The filesystem location URL. - * - */ - private addFileSystem( - name: string, - vpc: IVpc, - securityGroup: ISecurityGroup - ): string { - const fs = new efs.FileSystem( - this, - `EmbeddedLinuxPipeline${name}Filesystem`, - { - vpc, - removalPolicy: cdk.RemovalPolicy.DESTROY, - } - ); - fs.connections.allowFrom(securityGroup, Port.tcp(2049)); - - const fsId = fs.fileSystemId; - const region = cdk.Stack.of(this).region; - - return `${fsId}.efs.${region}.amazonaws.com:/`; - } - - private addVMExportPolicy(): iam.PolicyStatement { - return new iam.PolicyStatement({ - actions: [ - 'ec2:CreateImage', - 'ec2:CreateTags', - 'ec2:DescribeImages', - 'ec2:DescribeSnapshots', - 'ec2:DescribeImportSnapshotTasks', - 'ec2:DescribeTags', - 'ec2:CancelImportTask', - ], - resources: ['*'], - }); - } - - private addAMIS3BackupPolicy(artifactBucketArn: string): iam.PolicyStatement { - return new iam.PolicyStatement({ - actions: [ - 's3:GetObject', - 's3:ListBucket', - 's3:PutObject', - 's3:PutObjectTagging', - 's3:AbortMultipartUpload', - ], - resources: [artifactBucketArn, `${artifactBucketArn}/*`], - }); - } - private addAMIEBSBackupPolicy(region: string): iam.PolicyStatement { - return new iam.PolicyStatement({ - actions: [ - 'ebs:CompleteSnapshot', - 'ebs:GetSnapshotBlock', - 'ebs:ListChangedBlocks', - 'ebs:ListSnapshotBlocks', - 'ebs:PutSnapshotBlock', - ], - resources: [`arn:aws:ec2:${region}::snapshot/*`], - }); - } - - private addAMIBackupPolicy(): iam.PolicyStatement { - return new iam.PolicyStatement({ - actions: ['ec2:DescribeStoreImageTasks', 'ec2:GetEbsEncryptionByDefault'], - resources: ['*'], - }); - } - - private addAMIEC2EBSBackupPolicy(region: string): iam.PolicyStatement { - return new iam.PolicyStatement({ - actions: [ - 'ec2:RegisterImage', - 'ec2:DeregisterImage', - 'ec2:CreateStoreImageTask', - ], - resources: [ - `arn:aws:ec2:${region}::image/*`, - `arn:aws:ec2:${region}::snapshot/snap-*`, - ], - }); - } -} diff --git a/lib/index.ts b/lib/index.ts index 55721df..e897a4a 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,7 +1,41 @@ -export * from './network'; -export * from './build-image-data'; -export * from './build-image-repo'; -export * from './build-image-pipeline'; -export * from './embedded-linux-pipeline'; -export * from './embedded-linux-codebuild-project'; -export * from './constructs/source-repo'; +import * as s3 from "aws-cdk-lib/aws-s3"; + +export * from "./codebuild-embedded-linux"; +export * from "./codepipeline-embedded-linux-base-image"; +export * from "./codepipeline-embedded-linux"; +export * from "./codepipeline-resources"; + +export function isBucketVersioned(bucket: s3.Bucket | s3.IBucket) { + const bucketCfn: s3.CfnBucket = bucket.node.defaultChild as s3.CfnBucket; + if ( + bucketCfn.versioningConfiguration && + ( + bucketCfn.versioningConfiguration as s3.CfnBucket.VersioningConfigurationProperty + ).status != "Enabled" + ) { + return true; + } + return false; +} + +/** + * The type of project built. + */ +export enum ProjectType { + /** Build core-image-minimal from poky. */ + Poky = "poky", + /** Build the Qemu meta-aws Demonstration Distribution. */ + QEmu = "qemu", + /** Build an EC2 AMI */ + PokyAmi = "poky-ami", + /** Build an kas based image */ + Kas = "kas", + /** Build an Renesas image */ + Renesas = "renesas", + /** Build an IMX image using NXP layers. */ + NxpImx = "nxp-imx", + /** Build no pipeline, just CodeBuild project to connect with GitHub actions. */ + CodeBuild = "codebuild", + /** Build an image using a custom buildspec and asstes. */ + Custom = "custom", +} diff --git a/lib/network.ts b/lib/network.ts deleted file mode 100644 index 75b8c4f..0000000 --- a/lib/network.ts +++ /dev/null @@ -1,34 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import * as ec2 from 'aws-cdk-lib/aws-ec2'; -import { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs'; - -/** - * The network resources to run the pipeline in. - * - * This stack is provided for when users do not have an existing VPC with - * private and public subnets for the pipeline. - */ -export class PipelineNetworkStack extends cdk.Stack { - /** The VPC for the pipeline to reside in. */ - public readonly vpc: ec2.IVpc; - constructor(scope: Construct, id: string, props?: cdk.StackProps) { - super(scope, id, props); - - // We will create a VPC with 3 Private and Public subnets for AWS - // Resources that have network interfaces (e.g. Connecting and EFS - // Filesystem to a CodeBuild Project). - this.vpc = new ec2.Vpc(this, 'PipelineVpc', { - ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'), - }); - - new ec2.FlowLog(this, 'VPCFlowLogs', { - resourceType: ec2.FlowLogResourceType.fromVpc(this.vpc), - destination: ec2.FlowLogDestination.toCloudWatchLogs( - new LogGroup(this, 'LogGroup', { - retention: RetentionDays.TEN_YEARS, - }) - ), - }); - } -} diff --git a/lib/vm-import-bucket.ts b/lib/vm-import-bucket.ts deleted file mode 100644 index d20ab34..0000000 --- a/lib/vm-import-bucket.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Construct } from 'constructs'; -import * as s3 from 'aws-cdk-lib/aws-s3'; -import * as iam from 'aws-cdk-lib/aws-iam'; - -const TAG = 'aws4embeddedlinux-ci'; - -export interface VMImportBucketProps extends s3.BucketProps { - /** The sanitized role name */ - readonly sanitizedRoleName?: string; - readonly encryptionKeyArn: string; -} - -/** - * An S3 Bucket with roles for the VM Import/Export service. - */ -export class VMImportBucket extends s3.Bucket { - public readonly roleName: string; - constructor(scope: Construct, id: string, props: VMImportBucketProps) { - super(scope, id, { - ...props, - }); - - // Adapted from meta-aws-ewaol and - // https://docs.aws.amazon.com/vm-import/latest/userguide/required-permissions.html - const importPolicy = new iam.PolicyDocument({ - statements: [ - new iam.PolicyStatement({ - actions: ['s3:GetBucketLocation', 's3:GetObject', 's3:ListBucket'], - resources: [this.bucketArn, `${this.bucketArn}/*`], - }), - new iam.PolicyStatement({ - actions: ['ec2:CreateTags', 'ec2:DescribeTags'], - resources: ['*'], - conditions: { - StringEquals: { - 'ec2:ResourceTag/CreatedBy': [TAG], - }, - }, - }), - new iam.PolicyStatement({ - actions: ['ec2:CopySnapshot'], - resources: [`arn:aws:ec2:${this.stack.region}::snapshot/*`], - }), - new iam.PolicyStatement({ - actions: ['ec2:DescribeSnapshots'], - resources: ['*'], - }), - new iam.PolicyStatement({ - actions: [ - 'kms:CreateGrant', - 'kms:Decrypt', - 'kms:DescribeKey', - 'kms:GenerateDataKeyWithoutPlaintext', - ], - resources: [props.encryptionKeyArn], - }), - ], - }); - - const importRole = new iam.Role(scope, 'VMImportRole', { - roleName: props.sanitizedRoleName, - assumedBy: new iam.ServicePrincipal('vmie.amazonaws.com'), - externalIds: ['vmimport'], - inlinePolicies: { importPolicy }, - }); - - this.roleName = importRole.roleName; - } -} diff --git a/package-lock.json b/package-lock.json index 26bac3c..f52d61d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,18 @@ { "name": "aws4embeddedlinux-cdk-lib", - "version": "0.1.4", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "aws4embeddedlinux-cdk-lib", - "version": "0.1.4", + "version": "0.2.0", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "aws-cdk-lib": "2.176.0", + "constructs": "^10.4.2" + }, "devDependencies": { "@eslint/compat": "^1.2.4", "@eslint/eslintrc": "^3.2.0", @@ -15,9 +21,8 @@ "@types/node": "20.14.8", "@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/parser": "^8.18.0", - "aws-cdk-lib": "^2.177.0", - "cdk-nag": "^2.34.23", - "constructs": "^10.4.2", + "aws-cdk": "2.176.0", + "cdk-nag": "^2.35.0", "eslint": "^9.16.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", @@ -30,16 +35,10 @@ "typedoc": "^0.27.4", "typescript": "~5.7.2", "typescript-eslint": "^8.18.0" - }, - "peerDependencies": { - "aws-cdk-lib": "^2.177.0", - "constructs": "^10.4.2" } }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -51,66 +50,31 @@ } }, "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.214", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.214.tgz", - "integrity": "sha512-JeuX1xoYWXEeFD4RyAyvv8OD/NPdbLD6leKKpFLECWqsKY1YrwX0U8lr753CskflwaDGpU42pyyjPdiMZ7NiWA==", - "dev": true, + "version": "2.2.224", "license": "Apache-2.0" }, "node_modules/@aws-cdk/asset-kubectl-v20": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.3.tgz", - "integrity": "sha512-cDG1w3ieM6eOT9mTefRuTypk95+oyD7P5X/wRltwmYxU7nZc3+076YEVS6vrjDKr3ADYbfn0lDKpfB1FBtO9CQ==", - "dev": true, + "version": "2.1.4", "license": "Apache-2.0" }, "node_modules/@aws-cdk/asset-node-proxy-agent-v6": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.0.tgz", - "integrity": "sha512-7bY3J8GCVxLupn/kNmpPc5VJz8grx+4RKfnnJiO1LG+uxkZfANZG3RMHhE+qQxxwkyQ9/MfPtTpf748UhR425A==", - "dev": true, "license": "Apache-2.0" }, "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "39.2.2", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-39.2.2.tgz", - "integrity": "sha512-w6OTPy/WI4nyXDRjfuyXeHYJVkRkdam95fc4gf4Xk7O/sFey62BoxFS+HWLlET64FJzTgZAluIQrQAtxPyiS4g==", + "version": "39.2.20", "bundleDependencies": [ "jsonschema", "semver" ], - "dev": true, "license": "Apache-2.0", "dependencies": { "jsonschema": "~1.4.1", - "semver": "^7.6.3" - } - }, - "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { - "version": "1.4.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/semver": { - "version": "7.6.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "semver": "^7.7.1" } }, "node_modules/@babel/code-frame": { "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -123,9 +87,7 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.8", "dev": true, "license": "MIT", "engines": { @@ -133,22 +95,20 @@ } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.26.9", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -165,8 +125,6 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -174,14 +132,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -191,13 +147,11 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -209,8 +163,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -219,8 +171,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "license": "MIT", "dependencies": { @@ -233,8 +183,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "license": "MIT", "dependencies": { @@ -250,9 +198,7 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", "dev": true, "license": "MIT", "engines": { @@ -261,8 +207,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "license": "MIT", "engines": { @@ -271,8 +215,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "license": "MIT", "engines": { @@ -281,8 +223,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "license": "MIT", "engines": { @@ -290,27 +230,23 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -321,8 +257,6 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", "dependencies": { @@ -334,8 +268,6 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", "dependencies": { @@ -347,8 +279,6 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", "dependencies": { @@ -360,8 +290,6 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", "dependencies": { @@ -376,8 +304,6 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, "license": "MIT", "dependencies": { @@ -392,8 +318,6 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", "dependencies": { @@ -405,8 +329,6 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", "dependencies": { @@ -418,8 +340,6 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "license": "MIT", "dependencies": { @@ -434,8 +354,6 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", "dependencies": { @@ -447,8 +365,6 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -460,8 +376,6 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", "dependencies": { @@ -473,8 +387,6 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", "dependencies": { @@ -486,8 +398,6 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -499,8 +409,6 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", "dependencies": { @@ -512,8 +420,6 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", "dependencies": { @@ -528,8 +434,6 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", "dependencies": { @@ -544,8 +448,6 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -559,32 +461,28 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.9", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -594,8 +492,6 @@ }, "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "license": "MIT", "engines": { @@ -603,9 +499,7 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.9", "dev": true, "license": "MIT", "dependencies": { @@ -616,17 +510,17 @@ "node": ">=6.9.0" } }, + "node_modules/@balena/dockerignore": { + "version": "1.0.2", + "license": "Apache-2.0" + }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, "license": "MIT" }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "license": "MIT", "dependencies": { @@ -638,8 +532,6 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -649,8 +541,6 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, "license": "MIT", "dependencies": { @@ -666,10 +556,19 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", "engines": { @@ -677,9 +576,7 @@ } }, "node_modules/@eslint/compat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.4.tgz", - "integrity": "sha512-S8ZdQj/N69YAtuqFt7653jwcvuUj131+6qGLUyDqfDg1OIoBQ66OCuXC473YQfO2AaxITTutiRQiDwoo7ZLYyg==", + "version": "1.2.6", "dev": true, "license": "Apache-2.0", "engines": { @@ -695,13 +592,11 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", - "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "version": "0.19.2", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.5", + "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -709,34 +604,8 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/core": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", - "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", + "version": "0.11.0", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -748,8 +617,6 @@ }, "node_modules/@eslint/eslintrc": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, "license": "MIT", "dependencies": { @@ -770,21 +637,8 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { @@ -794,23 +648,8 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/js": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", - "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", + "version": "9.20.0", "dev": true, "license": "MIT", "engines": { @@ -818,9 +657,7 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", - "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "version": "2.1.6", "dev": true, "license": "Apache-2.0", "engines": { @@ -828,12 +665,11 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", - "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", + "version": "0.2.6", "dev": true, "license": "Apache-2.0", "dependencies": { + "@eslint/core": "^0.11.0", "levn": "^0.4.1" }, "engines": { @@ -841,21 +677,17 @@ } }, "node_modules/@gerrit0/mini-shiki": { - "version": "1.24.3", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.24.3.tgz", - "integrity": "sha512-odxt2MTJvlT5NUmGOPXz5OW4D8SFL2+KeXBkmjVtdOXfA5aRZX6jgP/17jp6wu2r3KdW0wx3Bk5HDehgeV1Yng==", + "version": "1.27.2", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/engine-oniguruma": "^1.24.2", - "@shikijs/types": "^1.24.2", - "@shikijs/vscode-textmate": "^9.3.0" + "@shikijs/engine-oniguruma": "^1.27.2", + "@shikijs/types": "^1.27.2", + "@shikijs/vscode-textmate": "^10.0.1" } }, "node_modules/@humanfs/core": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -864,8 +696,6 @@ }, "node_modules/@humanfs/node": { "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -876,24 +706,8 @@ "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -905,9 +719,7 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "version": "0.3.1", "dev": true, "license": "Apache-2.0", "engines": { @@ -920,8 +732,6 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", "dependencies": { @@ -937,32 +747,14 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", "dependencies": { @@ -973,62 +765,8 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", "engines": { @@ -1037,8 +775,6 @@ }, "node_modules/@jest/console": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "license": "MIT", "dependencies": { @@ -1053,10 +789,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/console/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/@jest/core": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "license": "MIT", "dependencies": { @@ -1101,10 +843,60 @@ } } }, + "node_modules/@jest/core/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@jest/core/node_modules/jest-config": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, "node_modules/@jest/environment": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1117,10 +909,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/environment/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/@jest/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1133,8 +931,6 @@ }, "node_modules/@jest/expect-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "license": "MIT", "dependencies": { @@ -1146,8 +942,6 @@ }, "node_modules/@jest/fake-timers": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1162,10 +956,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/fake-timers/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/@jest/globals": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1180,8 +980,6 @@ }, "node_modules/@jest/reporters": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "license": "MIT", "dependencies": { @@ -1222,10 +1020,31 @@ } } }, + "node_modules/@jest/reporters/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", "dependencies": { @@ -1237,8 +1056,6 @@ }, "node_modules/@jest/source-map": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "license": "MIT", "dependencies": { @@ -1252,8 +1069,6 @@ }, "node_modules/@jest/test-result": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "license": "MIT", "dependencies": { @@ -1268,8 +1083,6 @@ }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "license": "MIT", "dependencies": { @@ -1284,8 +1097,6 @@ }, "node_modules/@jest/transform": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", "dependencies": { @@ -1311,8 +1122,6 @@ }, "node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "license": "MIT", "dependencies": { @@ -1327,10 +1136,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/types/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { @@ -1344,8 +1159,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { @@ -1354,8 +1167,6 @@ }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "license": "MIT", "engines": { @@ -1364,15 +1175,11 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1382,15 +1189,11 @@ }, "node_modules/@microsoft/tsdoc": { "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", - "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", "dev": true, "license": "MIT" }, "node_modules/@microsoft/tsdoc-config": { "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", - "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", "dev": true, "license": "MIT", "dependencies": { @@ -1402,8 +1205,6 @@ }, "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "license": "MIT", "dependencies": { @@ -1417,17 +1218,8 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -1440,8 +1232,6 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -1450,8 +1240,6 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -1464,8 +1252,6 @@ }, "node_modules/@pkgr/core": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true, "license": "MIT", "engines": { @@ -1476,45 +1262,35 @@ } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.2.tgz", - "integrity": "sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==", + "version": "1.29.2", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "1.24.2", - "@shikijs/vscode-textmate": "^9.3.0" + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1" } }, "node_modules/@shikijs/types": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.2.tgz", - "integrity": "sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==", + "version": "1.29.2", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/vscode-textmate": "^9.3.0", + "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "node_modules/@shikijs/vscode-textmate": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz", - "integrity": "sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==", + "version": "10.0.2", "dev": true, "license": "MIT" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true, "license": "MIT" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1523,8 +1299,6 @@ }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1533,36 +1307,26 @@ }, "node_modules/@tsconfig/node10": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -1575,8 +1339,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "license": "MIT", "dependencies": { @@ -1585,8 +1347,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -1596,8 +1356,6 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, "license": "MIT", "dependencies": { @@ -1606,25 +1364,27 @@ }, "node_modules/@types/estree": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true, "license": "MIT" }, "node_modules/@types/graceful-fs": { "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/@types/graceful-fs/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/@types/hast": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1633,15 +1393,11 @@ }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "license": "MIT", "dependencies": { @@ -1650,8 +1406,6 @@ }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1660,8 +1414,6 @@ }, "node_modules/@types/jest": { "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1671,39 +1423,34 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "20.14.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", - "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "node_modules/@types/node/node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", "dev": true, "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, "license": "MIT" }, "node_modules/@types/yargs": { "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -1712,27 +1459,23 @@ }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.0.tgz", - "integrity": "sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==", + "version": "8.24.1", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/type-utils": "8.18.0", - "@typescript-eslint/utils": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/type-utils": "8.24.1", + "@typescript-eslint/utils": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1748,16 +1491,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.0.tgz", - "integrity": "sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==", + "version": "8.24.1", "dev": true, - "license": "MITClause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/typescript-estree": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/typescript-estree": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", "debug": "^4.3.4" }, "engines": { @@ -1773,14 +1514,12 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz", - "integrity": "sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==", + "version": "8.24.1", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0" + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1791,16 +1530,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz", - "integrity": "sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==", + "version": "8.24.1", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.18.0", - "@typescript-eslint/utils": "8.18.0", + "@typescript-eslint/typescript-estree": "8.24.1", + "@typescript-eslint/utils": "8.24.1", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1815,9 +1552,7 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", - "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", + "version": "8.24.1", "dev": true, "license": "MIT", "engines": { @@ -1829,20 +1564,18 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", - "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", + "version": "8.24.1", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1855,17 +1588,29 @@ "typescript": ">=4.8.4 <5.8.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", - "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", + "version": "8.24.1", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/typescript-estree": "8.18.0" + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/typescript-estree": "8.24.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1880,13 +1625,11 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", - "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", + "version": "8.24.1", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/types": "8.24.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -1897,23 +1640,8 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/acorn": { "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "license": "MIT", "bin": { @@ -1925,8 +1653,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1935,8 +1661,6 @@ }, "node_modules/acorn-walk": { "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "license": "MIT", "dependencies": { @@ -1948,8 +1672,6 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -1963,10 +1685,13 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1981,9 +1706,6 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1991,9 +1713,6 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -2007,8 +1726,6 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -2021,29 +1738,42 @@ }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, + "node_modules/astral-regex": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/async": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, "license": "MIT" }, + "node_modules/aws-cdk": { + "version": "2.176.0", + "dev": true, + "license": "Apache-2.0", + "bin": { + "cdk": "bin/cdk" + }, + "engines": { + "node": ">= 14.15.0" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, "node_modules/aws-cdk-lib": { - "version": "2.177.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.177.0.tgz", - "integrity": "sha512-nTnHAwjZaPJ5gfJjtzE/MyK6q0a66nWthoJl7l8srucRb+I30dczhbbXor6QCdVpJaTRAEliMOMq23aglsAQbg==", + "version": "2.176.0", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -2057,13 +1787,12 @@ "yaml", "mime-types" ], - "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-cdk/asset-awscli-v1": "^2.2.208", "@aws-cdk/asset-kubectl-v20": "^2.1.3", "@aws-cdk/asset-node-proxy-agent-v6": "^2.1.0", - "@aws-cdk/cloud-assembly-schema": "^39.2.0", + "@aws-cdk/cloud-assembly-schema": "^39.0.1", "@balena/dockerignore": "^1.0.2", "case": "1.6.3", "fs-extra": "^11.2.0", @@ -2077,349 +1806,22 @@ "yaml": "1.10.2" }, "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "constructs": "^10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/aws-cdk-lib/node_modules/ajv": { - "version": "8.17.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/aws-cdk-lib/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aws-cdk-lib/node_modules/astral-regex": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/aws-cdk-lib/node_modules/case": { - "version": "1.6.3", - "dev": true, - "inBundle": true, - "license": "(MIT OR GPL-3.0-or-later)", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/fast-uri": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/aws-cdk-lib/node_modules/fs-extra": { - "version": "11.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/aws-cdk-lib/node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/aws-cdk-lib/node_modules/ignore": { - "version": "5.3.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/jsonfile": { - "version": "6.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/aws-cdk-lib/node_modules/jsonschema": { - "version": "1.4.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { - "version": "4.4.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/mime-db": { - "version": "1.52.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/aws-cdk-lib/node_modules/mime-types": { - "version": "2.1.35", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/aws-cdk-lib/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/aws-cdk-lib/node_modules/punycode": { - "version": "2.3.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/aws-cdk-lib/node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/semver": { - "version": "7.6.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aws-cdk-lib/node_modules/slice-ansi": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/aws-cdk-lib/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aws-cdk-lib/node_modules/table": { - "version": "6.8.2", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "node": ">= 14.15.0" }, - "engines": { - "node": ">=10.0.0" + "peerDependencies": { + "constructs": "^10.0.0" } }, - "node_modules/aws-cdk-lib/node_modules/universalify": { - "version": "2.0.1", - "dev": true, + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.5.0", "inBundle": true, "license": "MIT", "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">= 6" + "node": "*" } }, "node_modules/babel-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", "dependencies": { @@ -2440,8 +1842,6 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2455,37 +1855,8 @@ "node": ">=8" } }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", "dependencies": { @@ -2500,8 +1871,6 @@ }, "node_modules/babel-preset-current-node-syntax": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "dev": true, "license": "MIT", "dependencies": { @@ -2527,8 +1896,6 @@ }, "node_modules/babel-preset-jest": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", "dependencies": { @@ -2544,15 +1911,10 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -2561,8 +1923,6 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -2573,9 +1933,7 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.4", "dev": true, "funding": [ { @@ -2593,9 +1951,9 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -2607,8 +1965,6 @@ }, "node_modules/bs-logger": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, "license": "MIT", "dependencies": { @@ -2620,8 +1976,6 @@ }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2630,15 +1984,11 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -2647,8 +1997,6 @@ }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -2656,9 +2004,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001688", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", - "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", + "version": "1.0.30001700", "dev": true, "funding": [ { @@ -2676,10 +2022,15 @@ ], "license": "CC-BY-4.0" }, + "node_modules/case": { + "version": "1.6.3", + "license": "(MIT OR GPL-3.0-or-later)", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/cdk-nag": { - "version": "2.34.23", - "resolved": "https://registry.npmjs.org/cdk-nag/-/cdk-nag-2.34.23.tgz", - "integrity": "sha512-TCvQy5uCk1QHek7UhbmFh4Uk2HveXyuQ6jfUC0ZfW5HgAMhv8+6lTY56Jq09/rm0csKDzWnMpGGAXjgLW6rg0A==", + "version": "2.35.24", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -2689,8 +2040,6 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -2706,8 +2055,6 @@ }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", "engines": { @@ -2716,8 +2063,6 @@ }, "node_modules/ci-info": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -2731,16 +2076,12 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "version": "1.4.3", "dev": true, "license": "MIT" }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { @@ -2754,8 +2095,6 @@ }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", "engines": { @@ -2765,16 +2104,11 @@ }, "node_modules/collect-v8-coverage": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true, "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -2785,36 +2119,23 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, "license": "MIT" }, "node_modules/constructs": { "version": "10.4.2", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.4.2.tgz", - "integrity": "sha512-wsNxBlAott2qg8Zv87q3eYZYgheb9lchtBfjHzzLHtXbttwSrHPs1NNQbBrmbb1YZvYg2+Vh0Dor76w4mFxJkA==", - "dev": true, "license": "Apache-2.0" }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/create-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2835,15 +2156,11 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -2857,8 +2174,6 @@ }, "node_modules/debug": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "license": "MIT", "dependencies": { @@ -2875,8 +2190,6 @@ }, "node_modules/dedent": { "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2890,15 +2203,11 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", "engines": { @@ -2907,8 +2216,6 @@ }, "node_modules/detect-newline": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "license": "MIT", "engines": { @@ -2917,8 +2224,6 @@ }, "node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -2927,8 +2232,6 @@ }, "node_modules/diff-sequences": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", "engines": { @@ -2937,8 +2240,6 @@ }, "node_modules/ejs": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2952,16 +2253,12 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.73", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", - "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", + "version": "1.5.102", "dev": true, "license": "ISC" }, "node_modules/emittery": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "license": "MIT", "engines": { @@ -2973,15 +2270,10 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -2993,8 +2285,6 @@ }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "license": "MIT", "dependencies": { @@ -3003,8 +2293,6 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -3012,32 +2300,25 @@ } }, "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/eslint": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", - "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", + "version": "9.20.1", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", + "@eslint/core": "^0.11.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.16.0", - "@eslint/plugin-kit": "^0.2.3", + "@eslint/js": "9.20.0", + "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.1", @@ -3045,7 +2326,7 @@ "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.5", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", @@ -3086,8 +2367,6 @@ }, "node_modules/eslint-config-prettier": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "license": "MIT", "bin": { @@ -3098,9 +2377,7 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "version": "5.2.3", "dev": true, "license": "MIT", "dependencies": { @@ -3130,8 +2407,6 @@ }, "node_modules/eslint-plugin-tsdoc": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.4.0.tgz", - "integrity": "sha512-MT/8b4aKLdDClnS8mP3R/JNjg29i0Oyqd/0ym6NnQf+gfKbJJ4ZcSh2Bs1H0YiUMTBwww5JwXGTWot/RwyJ7aQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3141,8 +2416,6 @@ }, "node_modules/eslint-scope": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3157,59 +2430,67 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.2.0", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/eslint/node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "is-glob": "^4.0.3" }, "engines": { - "node": "*" + "node": ">=10.13.0" } }, "node_modules/espree": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3224,23 +2505,8 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "license": "BSD-2-Clause", "bin": { @@ -3253,8 +2519,6 @@ }, "node_modules/esquery": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3266,8 +2530,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3279,8 +2541,6 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -3289,8 +2549,6 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -3299,8 +2557,6 @@ }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", "dependencies": { @@ -3323,8 +2579,6 @@ }, "node_modules/exit": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -3332,8 +2586,6 @@ }, "node_modules/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "license": "MIT", "dependencies": { @@ -3349,22 +2601,15 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true, "license": "Apache-2.0" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", "dev": true, "license": "MIT", "dependencies": { @@ -3372,43 +2617,38 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.0.6", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.0", "dev": true, "license": "ISC", "dependencies": { @@ -3417,8 +2657,6 @@ }, "node_modules/fb-watchman": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3427,8 +2665,6 @@ }, "node_modules/file-entry-cache": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3440,8 +2676,6 @@ }, "node_modules/filelist": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3450,8 +2684,6 @@ }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "license": "ISC", "dependencies": { @@ -3463,8 +2695,6 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -3475,26 +2705,55 @@ } }, "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", + "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/find-up/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-up/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/flat-cache": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { @@ -3506,38 +2765,29 @@ } }, "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "version": "3.3.3", "dev": true, "license": "ISC" }, + "node_modules/fs-extra": { + "version": "11.3.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", "funding": { @@ -3546,8 +2796,6 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -3556,8 +2804,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { @@ -3566,8 +2812,6 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -3576,8 +2820,6 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "license": "MIT", "engines": { @@ -3589,8 +2831,6 @@ }, "node_modules/glob": { "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dev": true, "license": "ISC", "dependencies": { @@ -3607,22 +2847,18 @@ } }, "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", "dev": true, "license": "ISC", "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" } }, "node_modules/glob/node_modules/minimatch": { "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", "dev": true, "license": "ISC", "dependencies": { @@ -3636,9 +2872,7 @@ } }, "node_modules/globals": { - "version": "15.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", - "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", + "version": "15.15.0", "dev": true, "license": "MIT", "engines": { @@ -3650,22 +2884,15 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -3674,8 +2901,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3687,15 +2912,11 @@ }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3704,18 +2925,13 @@ }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", "dev": true, "license": "MIT", "dependencies": { @@ -3729,10 +2945,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/import-local": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { @@ -3751,8 +2973,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -3761,15 +2981,11 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", "dev": true, "license": "MIT", "dependencies": { @@ -3784,8 +3000,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -3794,9 +3008,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3804,8 +3015,6 @@ }, "node_modules/is-generator-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", "engines": { @@ -3814,8 +3023,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -3827,8 +3034,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -3837,8 +3042,6 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { @@ -3850,15 +3053,11 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -3866,26 +3065,30 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "version": "5.2.1", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" + "semver": "^6.3.0" }, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3899,8 +3102,6 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3914,8 +3115,6 @@ }, "node_modules/istanbul-reports": { "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3928,8 +3127,6 @@ }, "node_modules/jake": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3945,34 +3142,8 @@ "node": ">=10" } }, - "node_modules/jake/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jake/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", "dependencies": { @@ -3998,8 +3169,6 @@ }, "node_modules/jest-changed-files": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "license": "MIT", "dependencies": { @@ -4013,8 +3182,6 @@ }, "node_modules/jest-circus": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", "dependencies": { @@ -4043,10 +3210,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-circus/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/jest-cli": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "license": "MIT", "dependencies": { @@ -4079,8 +3252,6 @@ }, "node_modules/jest-config": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4125,8 +3296,6 @@ }, "node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "license": "MIT", "dependencies": { @@ -4141,8 +3310,6 @@ }, "node_modules/jest-docblock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "license": "MIT", "dependencies": { @@ -4154,8 +3321,6 @@ }, "node_modules/jest-each": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4171,8 +3336,6 @@ }, "node_modules/jest-environment-node": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", "dependencies": { @@ -4187,10 +3350,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-environment-node/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", "engines": { @@ -4199,8 +3368,6 @@ }, "node_modules/jest-haste-map": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", "dependencies": { @@ -4223,10 +3390,16 @@ "fsevents": "^2.3.2" } }, + "node_modules/jest-haste-map/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/jest-leak-detector": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "license": "MIT", "dependencies": { @@ -4239,8 +3412,6 @@ }, "node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "license": "MIT", "dependencies": { @@ -4255,8 +3426,6 @@ }, "node_modules/jest-message-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", "dependencies": { @@ -4276,8 +3445,6 @@ }, "node_modules/jest-mock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", "dependencies": { @@ -4289,10 +3456,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-mock/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "license": "MIT", "engines": { @@ -4309,8 +3482,6 @@ }, "node_modules/jest-regex-util": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", "engines": { @@ -4319,8 +3490,6 @@ }, "node_modules/jest-resolve": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "license": "MIT", "dependencies": { @@ -4340,8 +3509,6 @@ }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "license": "MIT", "dependencies": { @@ -4354,8 +3521,6 @@ }, "node_modules/jest-runner": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4385,10 +3550,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-runner/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/jest-runtime": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4419,10 +3590,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-runtime/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/jest-snapshot": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "license": "MIT", "dependencies": { @@ -4453,8 +3630,6 @@ }, "node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "license": "MIT", "dependencies": { @@ -4469,10 +3644,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-util/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/jest-validate": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", "dependencies": { @@ -4489,8 +3670,6 @@ }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", "engines": { @@ -4502,8 +3681,6 @@ }, "node_modules/jest-watcher": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "license": "MIT", "dependencies": { @@ -4520,10 +3697,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-watcher/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { @@ -4536,10 +3719,16 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-worker/node_modules/@types/node": { + "version": "22.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4554,22 +3743,16 @@ }, "node_modules/jju": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true, "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { @@ -4581,8 +3764,6 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -4594,36 +3775,25 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, + "version": "1.0.0", "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -4633,10 +3803,25 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -4645,8 +3830,6 @@ }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, "license": "MIT", "engines": { @@ -4655,8 +3838,6 @@ }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "license": "MIT", "engines": { @@ -4665,8 +3846,6 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4679,15 +3858,11 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, "node_modules/linkify-it": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4696,8 +3871,6 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -4712,22 +3885,20 @@ }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { @@ -4736,15 +3907,11 @@ }, "node_modules/lunr": { "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true, "license": "MIT" }, "node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -4759,15 +3926,11 @@ }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, "license": "ISC" }, "node_modules/makeerror": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4776,8 +3939,6 @@ }, "node_modules/markdown-it": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "license": "MIT", "dependencies": { @@ -4794,22 +3955,16 @@ }, "node_modules/mdurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true, "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { @@ -4818,8 +3973,6 @@ }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -4830,10 +3983,25 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { @@ -4841,25 +4009,25 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, + "version": "3.1.2", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" + } + }, + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/minipass": { "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true, "license": "ISC", "engines": { @@ -4868,36 +4036,26 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "node_modules/node-int64": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { @@ -4906,8 +4064,6 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", "dependencies": { @@ -4919,8 +4075,6 @@ }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { @@ -4935,8 +4089,6 @@ }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -4953,8 +4105,6 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4969,8 +4119,6 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -4985,8 +4133,6 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { @@ -4995,8 +4141,6 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -5008,8 +4152,6 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", "dependencies": { @@ -5027,8 +4169,6 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -5037,8 +4177,6 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { @@ -5047,15 +4185,11 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -5071,15 +4205,11 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, "license": "ISC" }, "node_modules/path-scurry/node_modules/minipass": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "license": "ISC", "engines": { @@ -5088,15 +4218,11 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -5108,8 +4234,6 @@ }, "node_modules/pirates": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "license": "MIT", "engines": { @@ -5118,8 +4242,6 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5129,66 +4251,8 @@ "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -5196,9 +4260,7 @@ } }, "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "version": "3.5.1", "dev": true, "license": "MIT", "bin": { @@ -5213,8 +4275,6 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "license": "MIT", "dependencies": { @@ -5226,8 +4286,6 @@ }, "node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5241,8 +4299,6 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "engines": { @@ -5254,8 +4310,6 @@ }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5268,9 +4322,6 @@ }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -5278,8 +4329,6 @@ }, "node_modules/punycode.js": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, "license": "MIT", "engines": { @@ -5288,8 +4337,6 @@ }, "node_modules/pure-rand": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -5305,8 +4352,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -5326,15 +4371,11 @@ }, "node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, "license": "MIT" }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -5343,36 +4384,32 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", "dependencies": { @@ -5382,30 +4419,16 @@ "node": ">=8" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { + "node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/resolve.exports": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", "engines": { @@ -5414,8 +4437,6 @@ }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "license": "MIT", "engines": { @@ -5425,8 +4446,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -5448,10 +4467,7 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, + "version": "7.7.1", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5462,8 +4478,6 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { @@ -5475,8 +4489,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { @@ -5485,32 +4497,39 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -5519,8 +4538,6 @@ }, "node_modules/source-map-support": { "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", "dependencies": { @@ -5530,15 +4547,11 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5548,20 +4561,8 @@ "node": ">=10" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/string-length": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5574,9 +4575,6 @@ }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -5589,9 +4587,6 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -5602,8 +4597,6 @@ }, "node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { @@ -5612,8 +4605,6 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", "engines": { @@ -5622,8 +4613,6 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -5635,8 +4624,6 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -5648,8 +4635,6 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", "engines": { @@ -5661,8 +4646,6 @@ }, "node_modules/synckit": { "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", "dev": true, "license": "MIT", "dependencies": { @@ -5676,56 +4659,54 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", + "node_modules/table": { + "version": "6.9.0", + "license": "BSD-3-Clause", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/test-exclude": { + "version": "6.0.0", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": "*" + "node": ">=8" } }, "node_modules/tmpl": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5736,22 +4717,18 @@ } }, "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "version": "2.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/ts-jest": { "version": "29.2.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", - "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", "dev": true, "license": "MIT", "dependencies": { @@ -5799,8 +4776,6 @@ }, "node_modules/ts-node": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5843,15 +4818,11 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -5863,8 +4834,6 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", "engines": { @@ -5873,8 +4842,6 @@ }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -5885,9 +4852,7 @@ } }, "node_modules/typedoc": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.4.tgz", - "integrity": "sha512-wXPQs1AYC2Crk+1XFpNuutLIkNWleokZf1UNf/X8w9KsMnirkvT+LzxTXDvfF6ug3TSLf3Xu5ZXRKGfoXPX7IA==", + "version": "0.27.7", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5907,10 +4872,33 @@ "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x" } }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typedoc/node_modules/yaml": { + "version": "2.7.0", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", "dev": true, "license": "Apache-2.0", "bin": { @@ -5922,15 +4910,13 @@ } }, "node_modules/typescript-eslint": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.18.0.tgz", - "integrity": "sha512-Xq2rRjn6tzVpAyHr3+nmSg1/9k9aIHnJ2iZeOH7cfGOWqTkXTm3kwpQglEuLGdNrYvPF+2gtAs+/KF5rjVo+WQ==", + "version": "8.24.1", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.18.0", - "@typescript-eslint/parser": "8.18.0", - "@typescript-eslint/utils": "8.18.0" + "@typescript-eslint/eslint-plugin": "8.24.1", + "@typescript-eslint/parser": "8.24.1", + "@typescript-eslint/utils": "8.24.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5946,22 +4932,23 @@ }, "node_modules/uc.micro": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, "license": "MIT" }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.20.0", "dev": true, "license": "MIT" }, + "node_modules/universalify": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.2", "dev": true, "funding": [ { @@ -5980,7 +4967,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -5991,8 +4978,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6001,15 +4986,11 @@ }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, "license": "MIT" }, "node_modules/v8-to-istanbul": { "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", "dependencies": { @@ -6023,8 +5004,6 @@ }, "node_modules/walker": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6033,8 +5012,6 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -6049,8 +5026,6 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -6059,8 +5034,6 @@ }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6077,8 +5050,6 @@ }, "node_modules/write-file-atomic": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", "dependencies": { @@ -6091,8 +5062,6 @@ }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { @@ -6101,28 +5070,18 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", - "dev": true, + "version": "1.10.2", "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, "engines": { - "node": ">= 14" + "node": ">= 6" } }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { @@ -6140,8 +5099,6 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { @@ -6150,8 +5107,6 @@ }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "license": "MIT", "engines": { @@ -6160,8 +5115,6 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index f8bca95..bf40894 100644 --- a/package.json +++ b/package.json @@ -1,55 +1,60 @@ -{ - "name": "aws4embeddedlinux-cdk-lib", - "version": "0.1.4", - "main": "dist/lib/index.js", - "types": "dist/lib/index.d.ts", - "scripts": { - "build": "tsc", - "copy-src": "if [ -d dist/source-repo ]; then rm -rf dist/source-repo; fi && cp -r source-repo dist && cp assets/create-ec2-ami.sh dist/assets", - "zip-data": "if [ -f dist/assets/build-image/data.zip ]; then rm -rf dist/assets/build-image; fi && mkdir -p dist/assets/build-image ; cd assets/build-image && zip -q -o ../../dist/assets/build-image/data.zip -r *", - "clean": "tsc --build --clean && rm -rf dist && rm -rf cdk.out", - "prebuild": "npm run zip-data && npm run copy-src", - "watch": "tsc -w", - "test": "jest", - "update-snapshot": "jest -u", - "cdk": "cdk", - "doc": "typedoc --sort source-order --readme README.md", - "format": "eslint '**/*.{js,ts,json}' --quiet --fix", - "check": "eslint '**/*.{js,ts,json}'", - "prepare": "npm run build" - }, - "devDependencies": { - "@eslint/compat": "^1.2.4", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "^9.16.0", - "@types/jest": "^29.5.14", - "@types/node": "20.14.8", - "@typescript-eslint/eslint-plugin": "^8.18.0", - "@typescript-eslint/parser": "^8.18.0", - "aws-cdk-lib": "^2.177.0", - "cdk-nag": "^2.34.23", - "constructs": "^10.4.2", - "eslint": "^9.16.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-tsdoc": "^0.4.0", - "globals": "^15.13.0", - "jest": "^29.7.0", - "prettier": "^3.4.2", - "ts-jest": "^29.2.5", - "ts-node": "^10.9.2", - "typedoc": "^0.27.4", - "typescript": "~5.7.2", - "typescript-eslint": "^8.18.0" - }, - "peerDependencies": { - "aws-cdk-lib": "^2.177.0", - "constructs": "^10.4.2" - }, - "resolutions": { - "glob": "^9.3.5" - }, - "overrides": { - "glob": "^9.3.5" - } -} +{ + "name": "aws4embeddedlinux-cdk-lib", + "version": "0.2.0", + "main": "dist/lib/index.js", + "types": "dist/lib/index.d.ts", + "license": "MIT", + "scripts": { + "build": "tsc", + "check": "eslint '**/*.{js,ts,json}'", + "clean": "tsc --build --clean", + "doc": "typedoc --sort source-order --readme README.md", + "format": "eslint '**/*.{js,ts,json}' --quiet --fix", + "postinstall": "npm run build > /dev/null || echo 'prepapre command completed successfully with errors'", + "prepare": "npm run build > /dev/null || echo 'prepapre command completed successfully with errors'", + "prepare-commit": "pre-commit run --all-files --color=always --show-diff-on-failure", + "test": "jest", + "update-snapshot": "jest -u", + "watch": "tsc -w", + "postclean": "rm -rf ./dist", + "prebuild": "./utils/build-assets.sh", + "precheck": "yarn clean", + "preformat": "yarn clean", + "pretest": "yarn prebuild", + "preupdate-snapshot": "yarn prebuild" + }, + "dependencies": { + "aws-cdk-lib": "2.176.0", + "constructs": "^10.4.2" + }, + "devDependencies": { + "@eslint/compat": "^1.2.4", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "^9.16.0", + "@types/jest": "^29.5.14", + "@types/node": "20.14.8", + "@typescript-eslint/eslint-plugin": "^8.18.0", + "@typescript-eslint/parser": "^8.18.0", + "aws-cdk": "2.176.0", + "cdk-nag": "^2.35.0", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-tsdoc": "^0.4.0", + "globals": "^15.13.0", + "jest": "^29.7.0", + "prettier": "^3.4.2", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "typedoc": "^0.27.4", + "typescript": "~5.7.2", + "typescript-eslint": "^8.18.0" + }, + "resolutions": { + "glob": "^9.3.5" + }, + "overrides": { + "glob": "^9.3.5" + }, + "packageManager": "yarn@4.6.0" +} diff --git a/assets/build-image/ubuntu_22_04/Dockerfile b/source-repo/base-image/Dockerfile similarity index 66% rename from assets/build-image/ubuntu_22_04/Dockerfile rename to source-repo/base-image/Dockerfile index 3507a49..b0faabb 100644 --- a/assets/build-image/ubuntu_22_04/Dockerfile +++ b/source-repo/base-image/Dockerfile @@ -4,14 +4,14 @@ FROM public.ecr.aws/lts/ubuntu:22.04_stable AS base ARG DEBIAN_FRONTEND=noninteractive # Install Required Packages for the Build Host -RUN apt-get update && apt-get install -y --no-install-recommends \ +RUN apt-get -qq update && apt-get -qq install -y --no-install-recommends \ gawk wget git diffstat unzip texinfo gcc build-essential chrpath \ socat cpio python3 python3-pip python3-pexpect xz-utils debianutils \ iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \ python3-subunit mesa-common-dev zstd liblz4-tool file locales xterm sudo # Install packages used elsewhere in the build -RUN apt-get install -y --no-install-recommends \ +RUN apt-get -qq install -y --no-install-recommends \ uuid-runtime sysstat iproute2 openssh-client curl python-is-python3 \ parted mtools dosfstools jq gpg gpg-agent qemu-utils rsync @@ -21,11 +21,11 @@ RUN chmod a+rx /bin/repo # Install aws cli v2 RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "/tmp/awscliv2.zip" -RUN unzip /tmp/awscliv2.zip -d /tmp +RUN unzip -qq /tmp/awscliv2.zip -d /tmp RUN /tmp/aws/install # install kas tool -RUN pip3 install PyYAML==5.3.1 && pip3 install kas==4.0.0 +RUN pip3 install -q PyYAML==5.3.1 -q && pip3 install -q kas==4.0.0 RUN locale-gen en_US.UTF-8 @@ -33,18 +33,17 @@ RUN locale-gen en_US.UTF-8 RUN groupadd -g 1000 yoctouser RUN useradd -u 1000 -g 1000 -m yoctouser -# this will fix: https://gitlab.com/qemu-project/qemu/-/issues/447 -RUN sysctl vm.mmap_min_addr=65536 - # These will be mount points for an EFS volume. This allows the cache to be reused. -RUN mkdir /downloads && chown -R yoctouser /downloads -RUN mkdir /sstate-cache && chown -R yoctouser /sstate-cache -RUN mkdir /build-output && chown -R yoctouser /build-output +RUN mkdir -p /nfs && chown -R yoctouser /nfs && chmod -R 755 /nfs + +RUN sudo -u yoctouser bash -c 'git config --global user.email "yoctouser@example.com"' +RUN sudo -u yoctouser bash -c 'git config --global user.name "yoctouser"' +RUN sudo -u yoctouser bash -c 'git config --global init.defaultBranch main' -ENV SSTATE_DIR=/sstate-cache -ENV DL_DIR=/downloads ENV TMP_DIR=/tmp -ENV OUTPUT_DIR=/build-output +ENV SSTATE_DIR=/nfs/sstate-cache +ENV DL_DIR=/nfs/downloads +ENV OUTPUT_DIR=/nfs/build-output ENV BB_ENV_PASSTHROUGH_ADDITIONS="SSTATE_DIR DL_DIR" USER yoctouser diff --git a/assets/build-image/ubuntu_22_04/buildspec.yml b/source-repo/base-image/buildspec.yml similarity index 50% rename from assets/build-image/ubuntu_22_04/buildspec.yml rename to source-repo/base-image/buildspec.yml index f989b0f..aedcaf6 100644 --- a/assets/build-image/ubuntu_22_04/buildspec.yml +++ b/source-repo/base-image/buildspec.yml @@ -2,17 +2,22 @@ version: 0.2 phases: pre_build: commands: + - echo "Pre build started - [$(date '+%F %H:%M:%S')]" - echo Logging into Amazon ECR... - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com + - echo "Pre build completed - [$(date '+%F %H:%M:%S')]" build: commands: - - echo Build started on `date` - - echo Building the Docker image... - - docker build -t ubuntu_22_04:$IMAGE_TAG ubuntu_22_04 + - echo "Build started - [$(date '+%F %H:%M:%S')]" + - ls . + - echo "Building the Docker image $IMAGE_TAG ..." + - docker build -t ubuntu_22_04:$IMAGE_TAG . - docker tag ubuntu_22_04:$IMAGE_TAG $ECR_REPOSITORY_URI:$IMAGE_TAG + - echo "Build completed - [$(date '+%F %H:%M:%S')]" post_build: commands: - - echo Build completed on `date` + - echo "Post build statred - [$(date '+%F %H:%M:%S')]" - echo Pushing the Docker image... - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG + - echo "Post build completed - [$(date '+%F %H:%M:%S')]" diff --git a/source-repo/kas/build.buildspec.yml b/source-repo/kas/build.buildspec.yml index d7d0513..93a9bcb 100644 --- a/source-repo/kas/build.buildspec.yml +++ b/source-repo/kas/build.buildspec.yml @@ -11,31 +11,39 @@ phases: pre_build: run-as: root commands: - - chown -R yoctouser /sstate-cache - - chown -R yoctouser /downloads - - chmod 755 /sstate-cache - - chmod 755 /downloads + - echo "Pre build started - [$(date '+%F %H:%M:%S')]" + - mkdir -p /nfs/sstate-cache && chown -R yoctouser /nfs/sstate-cache + - mkdir -p /nfs/downloads && chown -R yoctouser /nfs/downloads + - mkdir -p /nfs/build-output && chown -R yoctouser /nfs/build-output + - chmod -R 755 /nfs/sstate-cache + - chmod -R 755 /nfs/downloads + - chmod -R 755 /nfs/build-output - | if [[ -n "$PURGE_EFS" ]] ; then echo "Starting EFS purge." - rm -rvf /downloads/* - rm -rvf /sstate-cache/* + rm -rvf /nfs/downloads/* + rm -rvf /nfs/sstate-cache/* + rm -rvf /nfs/build-output/* fi + - echo "Pre build completed - [$(date '+%F %H:%M:%S')]" build: commands: - - echo Build started on `date` + - echo "Build started - [$(date '+%F %H:%M:%S')]" - export KAS_WORK_DIR=$TMP_DIR - kas build kas.yml + - echo "Build completed - [$(date '+%F %H:%M:%S')]" post_build: commands: + - echo "Post build statred - [$(date '+%F %H:%M:%S')]" # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - - find /sstate-cache -atime +30 -type f -delete + - find /nfs/sstate-cache -atime +30 -type f -delete # only delete empty dirs - - find /sstate-cache -atime +30 -type d -empty -delete + - find /nfs/sstate-cache -atime +30 -type d -empty -delete # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - - find /downloads -atime +30 -type f -delete + - find /nfs/downloads -atime +30 -type f -delete # only delete empty dirs - - find /downloads -atime +30 -type d -empty -delete + - find /nfs/downloads -atime +30 -type d -empty -delete + - echo "Post build completed - [$(date '+%F %H:%M:%S')]" artifacts: discard-paths: true diff --git a/source-repo/nxp-imx/build.buildspec.yml b/source-repo/nxp-imx/build.buildspec.yml index 03b2003..65b4539 100644 --- a/source-repo/nxp-imx/build.buildspec.yml +++ b/source-repo/nxp-imx/build.buildspec.yml @@ -11,21 +11,28 @@ phases: pre_build: run-as: root commands: - - chown -R yoctouser /sstate-cache - - chown -R yoctouser /downloads - - chmod 755 /sstate-cache - - chmod 755 /downloads + - echo "Pre build started - [$(date '+%F %H:%M:%S')]" + - mkdir -p /nfs/sstate-cache && chown -R yoctouser /nfs/sstate-cache + - mkdir -p /nfs/downloads && chown -R yoctouser /nfs/downloads + - mkdir -p /nfs/build-output && chown -R yoctouser /nfs/build-output + - chmod -R 755 /nfs/sstate-cache + - chmod -R 755 /nfs/downloads + - chmod -R 755 /nfs/build-output - | if [[ -n "$PURGE_EFS" ]] ; then echo "Starting EFS purge." - rm -rvf /downloads/* - rm -rvf /sstate-cache/* + rm -rvf /nfs/downloads/* + rm -rvf /nfs/sstate-cache/* + rm -rvf /nfs/build-output/* fi + - echo "Pre build completed - [$(date '+%F %H:%M:%S')]" build: commands: - - echo Build started on `date` + - echo "Build started - [$(date '+%F %H:%M:%S')]" + - if [ -d .git ]; then rm -rf .git; fi + - git init $CODEBUILD_SRC_DIR && git add --all && git commit -m 'initial' - repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-mickledore -m imx-6.1.22-2.0.0.xml - - repo sync + - repo sync -c --no-tags -j$(nproc --all) # If you have not accepted NXP's EULA for these layers, the build will # prompt you repeatedly until the timeout. This next line is an # intentional barrier to stop the build quickly and get your attention. @@ -39,16 +46,19 @@ phases: - echo 'include cve-extra-exclusions.inc' >> conf/local.conf # build the image - bitbake core-image-minimal + - echo "Build completed - [$(date '+%F %H:%M:%S')]" post_build: commands: + - echo "Post build statred - [$(date '+%F %H:%M:%S')]" # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - - find /sstate-cache -atime +30 -type f -delete + - find /nfs/sstate-cache -atime +30 -type f -delete # only delete empty dirs - - find /sstate-cache -atime +30 -type d -empty -delete + - find /nfs/sstate-cache -atime +30 -type d -empty -delete # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - - find /downloads -atime +30 -type f -delete + - find /nfs/downloads -atime +30 -type f -delete # only delete empty dirs - - find /downloads -atime +30 -type d -empty -delete + - find /nfs/downloads -atime +30 -type d -empty -delete + - echo "Post build completed - [$(date '+%F %H:%M:%S')]" artifacts: discard-paths: true diff --git a/source-repo/poky-ami/build.buildspec.yml b/source-repo/poky-ami/build.buildspec.yml index ee3946e..005f64e 100644 --- a/source-repo/poky-ami/build.buildspec.yml +++ b/source-repo/poky-ami/build.buildspec.yml @@ -11,21 +11,28 @@ phases: pre_build: run-as: root commands: - - chown -R yoctouser /sstate-cache - - chown -R yoctouser /downloads - - chmod 755 /sstate-cache - - chmod 755 /downloads + - echo "Pre build started - [$(date '+%F %H:%M:%S')]" + - mkdir -p /nfs/sstate-cache && chown -R yoctouser /nfs/sstate-cache + - mkdir -p /nfs/downloads && chown -R yoctouser /nfs/downloads + - mkdir -p /nfs/build-output && chown -R yoctouser /nfs/build-output + - chmod -R 755 /nfs/sstate-cache + - chmod -R 755 /nfs/downloads + - chmod -R 755 /nfs/build-output - | if [[ -n "$PURGE_EFS" ]] ; then echo "Starting EFS purge." - rm -rvf /downloads/* - rm -rvf /sstate-cache/* + rm -rvf /nfs/downloads/* + rm -rvf /nfs/sstate-cache/* + rm -rvf /nfs/build-output/* fi + - echo "Pre build completed - [$(date '+%F %H:%M:%S')]" build: commands: - - echo Build started on `date` + - echo "Build started - [$(date '+%F %H:%M:%S')]" + - if [ -d .git ]; then rm -rf .git; fi + - git init $CODEBUILD_SRC_DIR && git add --all && git commit -m 'initial' - repo init -u $CODEBUILD_SRC_DIR -b main -m manifest.xml - - repo sync + - repo sync -c --no-tags -j$(nproc --all) - . poky/oe-init-build-env $TMP_DIR - bitbake-layers add-layer $CODEBUILD_SRC_DIR/meta-openembedded/meta-oe - bitbake-layers add-layer $CODEBUILD_SRC_DIR/meta-openembedded/meta-python @@ -43,26 +50,40 @@ phases: - echo 'include cve-extra-exclusions.inc' >> $TMP_DIR/conf/local.conf # build the image - bitbake core-image-minimal - - echo Build completed on `date` + - echo "Build completed - [$(date '+%F %H:%M:%S')]" post_build: commands: - - echo AMI Upload started on `date` + - echo "Post build statred - [$(date '+%F %H:%M:%S')]" + - echo AMI Upload started # This is required because the CDK asset uploader does not seem to carry permissions though. - - aws s3 cp ${SCRIPT_URL} $CODEBUILD_SRC_DIR/create-ec2-ami.sh + # - aws s3 cp ${SCRIPT_URL} $CODEBUILD_SRC_DIR/create-ec2-ami.sh + # - chmod +x $CODEBUILD_SRC_DIR/create-ec2-ami.sh - chmod +x $CODEBUILD_SRC_DIR/create-ec2-ami.sh - - cat $CODEBUILD_SRC_DIR/create-ec2-ami.sh # this list all testdata.json and *.vhd files - find $TMP_DIR/tmp/deploy/images/aws-ec2-arm64/ -name *.testdata.json - find $TMP_DIR/tmp/deploy/images/aws-ec2-arm64/ -name *.vhd - - $CODEBUILD_SRC_DIR/create-ec2-ami.sh $IMPORT_BUCKET 16 core-image-minimal aws-ec2-arm64 $TMP_DIR/tmp $ROLE_NAME .rootfs + # - $CODEBUILD_SRC_DIR/create-ec2-ami.sh $PIPELINE_OUTPUT_BUCKET 16 core-image-minimal aws-ec2-arm64 $TMP_DIR/tmp $VM_IMPORT_ROLE .rootfs + - | + $CODEBUILD_SRC_DIR/create-ec2-ami.sh \ + IMPORT_BUCKET_NAME=$PIPELINE_OUTPUT_BUCKET \ + AMI_DISK_SIZE_GB=16 \ + IMAGE_NAME=core-image-minimal \ + MACHINE_NAME=aws-ec2-arm64 \ + TMPDIR=$TMP_DIR/tmp \ + ROLE_NAME=$VM_IMPORT_ROLE \ + IMAGE_EXTEN=.rootfs \ + PIPELINE_PROJECT_NAME=$PIPELINE_PROJECT_NAME + # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - - find /sstate-cache -atime +30 -type f -delete + - find /nfs/sstate-cache -atime +30 -type f -delete # only delete empty dirs - - find /sstate-cache -atime +30 -type d -empty -delete + - find /nfs/sstate-cache -atime +30 -type d -empty -delete # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - - find /downloads -atime +30 -type f -delete + - find /nfs/downloads -atime +30 -type f -delete # only delete empty dirs - - find /downloads -atime +30 -type d -empty -delete + - find /nfs/downloads -atime +30 -type d -empty -delete + - echo "Post build completed - [$(date '+%F %H:%M:%S')]" + artifacts: discard-paths: true files: diff --git a/assets/create-ec2-ami.sh b/source-repo/poky-ami/create-ec2-ami.sh old mode 100755 new mode 100644 similarity index 71% rename from assets/create-ec2-ami.sh rename to source-repo/poky-ami/create-ec2-ami.sh index 4aa1192..a8ea80a --- a/assets/create-ec2-ami.sh +++ b/source-repo/poky-ami/create-ec2-ami.sh @@ -1,28 +1,62 @@ #!/usr/bin/env bash # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: MIT-0 + set -eo pipefail [ "$DEBUG" == 'true' ] && set -x ARGC=$# if [ $ARGC -lt 6 ]; then - echo "ERROR: args 1: import bucket name 2:AMI disk size in GB 3:IMAGE_NAME 4:MACHINE_NAME 5:TMPDIR 6:ROLE NAME 7:IMAGE_EXTEN 8:TESTDATA_JSON_EXTEN." + echo "ERROR: missing args " + echo " 1:IMPORT_BUCKET_NAME" + echo " 2:AMI_DISK_SIZE_GB" + echo " 3:IMAGE_NAME" + echo " 4:MACHINE_NAME" + echo " 5:TMPDIR" + echo " 6:ROLE NAME" + echo " 7:IMAGE_EXTEN" + echo " 8:TESTDATA_JSON_EXTEN" + echo " 9:PIPELINE_PROJECT_NAME" exit 1 fi -IMPORT_BUCKET_NAME=$1 -AMI_DISK_SIZE_GB=$2 -IMAGE_NAME=$3 -MACHINE_NAME=$4 -TMPDIR=${5:-build/tmp} -ROLE_NAME=$6 -IMAGE_EXTEN=${7:-} -TESTDATA_JSON_EXTEN=${8:-} + +for arg in "$@" +do + key=$(echo "$arg" | cut -f1 -d=) + + len=${#key} + val="${arg:$len+1}" + + export "$key"="$val" +done + +# IMPORT_BUCKET_NAME=$1 +# AMI_DISK_SIZE_GB=$2 +# IMAGE_NAME=$3 +# MACHINE_NAME=$4 +TMPDIR=${TMPDIR:-build/tmp} +# ROLE_NAME=$6 +IMAGE_EXTEN=${IMAGE_EXTEN:-} +TESTDATA_JSON_EXTEN=${TESTDATA_JSON_EXTEN:-} +# PIPELINE_PROJECT_NAME=${9:-} CREATED_BY_TAG="aws4embeddedlinux-ci" IMG_DIR="${TMPDIR}/deploy/images/${MACHINE_NAME}" TESTDATA_JSON="${IMG_DIR}/${IMAGE_NAME}-${MACHINE_NAME}${TESTDATA_JSON_EXTEN}.testdata.json" + +echo "Input parameters:" +echo " 1:IMPORT_BUCKET_NAME : $IMPORT_BUCKET_NAME" +echo " 2:AMI_DISK_SIZE_GB : $AMI_DISK_SIZE_GB" +echo " 3:IMAGE_NAME : $IMAGE_NAME" +echo " 4:MACHINE_NAME : $MACHINE_NAME" +echo " 5:TMPDIR : $TMPDIR" +echo " 6:ROLE NAME : $ROLE" +echo " 7:IMAGE_EXTEN : $IMAGE_EXTEN" +echo " 8:TESTDATA_JSON_EXTEN : $TESTDATA_JSON_EXTEN" +echo " 9:PIPELINE_PROJECT_NAME : $PIPELINE_PROJECT_NAME" + DISTRO=$(jq -r '.DISTRO' "$TESTDATA_JSON") DISTRO_CODENAME=$(jq -r '.DISTRO_CODENAME' "$TESTDATA_JSON") DISTRO_NAME=$(jq -r '.DISTRO_NAME' "$TESTDATA_JSON") @@ -32,7 +66,6 @@ TARGET_ARCH=$(jq -r '.TARGET_ARCH' "$TESTDATA_JSON") IMAGE_NAME=$(jq -r '.IMAGE_NAME' "$TESTDATA_JSON") IMAGE_ROOTFS_SIZE=$(jq -r '.IMAGE_ROOTFS_SIZE' "$TESTDATA_JSON") - echo DISTRO="$DISTRO" echo DISTRO_CODENAME="$DISTRO_CODENAME" echo DISTRO_NAME="$DISTRO_NAME" @@ -43,6 +76,8 @@ echo IMAGE_ROOTFS_SIZE="$IMAGE_ROOTFS_SIZE" echo AMI_DISK_SIZE_GB="$AMI_DISK_SIZE_GB" + + echo "Pushing image ${IMAGE_NAME}${IMAGE_EXTEN}.wic.vhd to s3://${IMPORT_BUCKET_NAME}" aws s3 cp "${IMG_DIR}/${IMAGE_NAME}${IMAGE_EXTEN}.wic.vhd" "s3://${IMPORT_BUCKET_NAME}" @@ -58,7 +93,11 @@ cat < image-import.json EOF echo "Importing image file into snapshot " -command_output=$(aws ec2 import-snapshot --disk-container "file://image-import.json" --tag-specifications "ResourceType=import-snapshot-task,Tags=[{Key=CreatedBy,Value=$CREATED_BY_TAG}]" --role-name "$ROLE_NAME" --encrypted) +command_output=$(aws ec2 import-snapshot \ + --disk-container "file://image-import.json" \ + --tag-specifications "ResourceType=import-snapshot-task,Tags=[{Key=CreatedBy,Value=$CREATED_BY_TAG},{Key=PipelineProject,Value=$PIPELINE_PROJECT_NAME}]" \ + --role-name "$ROLE_NAME" --encrypted +) command_exit_code=$? if [[ "$command_exit_code" -ne 0 ]]; then @@ -99,7 +138,7 @@ else echo "Architecture not supported" exit 1 fi -DESCRIPTION=$(echo "DISTRO=$DISTRO;DISTRO_CODENAME=$DISTRO_CODENAME;DISTRO_NAME=$DISTRO_NAME;DISTRO_VERSION=$DISTRO_VERSION;BUILDNAME=$BUILDNAME;TARGET_ARCH=$ARCHITECTURE;IMAGE_NAME=$IMAGE_NAME" | cut -c -255) +DESCRIPTION=$(echo "PIPELINE_PROJECT_NAME=$PIPELINE_PROJECT_NAME;DISTRO=$DISTRO;DISTRO_CODENAME=$DISTRO_CODENAME;DISTRO_NAME=$DISTRO_NAME;DISTRO_VERSION=$DISTRO_VERSION;BUILDNAME=$BUILDNAME;TARGET_ARCH=$ARCHITECTURE;IMAGE_NAME=$IMAGE_NAME" | cut -c -255) cat < register-ami.json { @@ -129,10 +168,17 @@ if [ "$IMAGE_ID" != "" ]; then echo "Deregistering existing image $IMAGE_ID" aws ec2 deregister-image --image-id "${IMAGE_ID}" > /dev/null 2>&1 fi -echo "Registering AMI with Snapshot $SNAPSHOT_ID" -AMI_ID=$(aws ec2 register-image --name "${AMI_NAME}" --cli-input-json="file://register-ami.json" --query 'ImageId' --output text) +echo "Registering AMI with Snapshot $SNAPSHOT_ID with parameters:" echo "AMI name: $AMI_NAME" -echo "AMI ID: $AMI_ID" +more register-ami.json +AMI_ID=$(aws ec2 register-image \ + --name "${AMI_NAME}" \ + --cli-input-json="file://register-ami.json" \ + --tag-specifications "ResourceType=image,Tags=[{Key=Name,Value=$PIPELINE_PROJECT_NAME},{Key=CreatedBy,Value=$CREATED_BY_TAG},{Key=PipelineProject,Value=$PIPELINE_PROJECT_NAME}]" \ + --query 'ImageId' \ + --output text +) +echo "Registered AMI ID: $AMI_ID" rm register-ami.json echo "Backing up AMI with ID $AMI_ID in S3" diff --git a/source-repo/poky-ami/manifest.xml b/source-repo/poky-ami/manifest.xml index 8d68d44..c3564a4 100644 --- a/source-repo/poky-ami/manifest.xml +++ b/source-repo/poky-ami/manifest.xml @@ -1,11 +1,15 @@ - - - + + + - - - - + + + + diff --git a/source-repo/poky/build.buildspec.yml b/source-repo/poky/build.buildspec.yml index fe6a682..d3d8907 100644 --- a/source-repo/poky/build.buildspec.yml +++ b/source-repo/poky/build.buildspec.yml @@ -11,21 +11,28 @@ phases: pre_build: run-as: root commands: - - chown -R yoctouser /sstate-cache - - chown -R yoctouser /downloads - - chmod 755 /sstate-cache - - chmod 755 /downloads + - echo "Pre build started - [$(date '+%F %H:%M:%S')]" + - mkdir -p /nfs/sstate-cache && chown -R yoctouser /nfs/sstate-cache + - mkdir -p /nfs/downloads && chown -R yoctouser /nfs/downloads + - mkdir -p /nfs/build-output && chown -R yoctouser /nfs/build-output + - chmod -R 755 /nfs/sstate-cache + - chmod -R 755 /nfs/downloads + - chmod -R 755 /nfs/build-output - | if [[ -n "$PURGE_EFS" ]] ; then echo "Starting EFS purge." - rm -rvf /downloads/* - rm -rvf /sstate-cache/* + rm -rvf /nfs/downloads/* + rm -rvf /nfs/sstate-cache/* + rm -rvf /nfs/build-output/* fi + - echo "Pre build completed - [$(date '+%F %H:%M:%S')]" build: commands: - - echo Build started on `date` - - repo init -u $CODEBUILD_SRC_DIR -b main -m manifest.xml - - repo sync + - echo "Build started - [$(date '+%F %H:%M:%S')]" + - if [ -d .git ]; then rm -rf .git; fi + - git init $CODEBUILD_SRC_DIR && git add --all && git commit -m 'initial' + - repo init -u $CODEBUILD_SRC_DIR -m manifest.xml + - repo sync -c --no-tags -j$(nproc --all) - . poky/oe-init-build-env $TMP_DIR # Update our local conf to check for CVEs - echo 'INHERIT += "cve-check"' >> $TMP_DIR/conf/local.conf @@ -33,16 +40,19 @@ phases: - echo 'include cve-extra-exclusions.inc' >> $TMP_DIR/conf/local.conf # build the image - bitbake core-image-minimal + - echo "Build completed - [$(date '+%F %H:%M:%S')]" post_build: commands: + - echo "Post build statred - [$(date '+%F %H:%M:%S')]" # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - - find /sstate-cache -atime +30 -type f -delete + - find /nfs/sstate-cache -atime +30 -type f -delete # only delete empty dirs - - find /sstate-cache -atime +30 -type d -empty -delete + - find /nfs/sstate-cache -atime +30 -type d -empty -delete # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - - find /downloads -atime +30 -type f -delete + - find /nfs/downloads -atime +30 -type f -delete # only delete empty dirs - - find /downloads -atime +30 -type d -empty -delete + - find /nfs/downloads -atime +30 -type d -empty -delete + - echo "Post build completed - [$(date '+%F %H:%M:%S')]" artifacts: discard-paths: true diff --git a/source-repo/poky/manifest.xml b/source-repo/poky/manifest.xml index 2c541aa..c3564a4 100644 --- a/source-repo/poky/manifest.xml +++ b/source-repo/poky/manifest.xml @@ -1,6 +1,15 @@ - + + + - + + + + diff --git a/source-repo/meta-aws-demo/build.buildspec.yml b/source-repo/qemu/build.buildspec.yml similarity index 54% rename from source-repo/meta-aws-demo/build.buildspec.yml rename to source-repo/qemu/build.buildspec.yml index c169330..cf19e15 100644 --- a/source-repo/meta-aws-demo/build.buildspec.yml +++ b/source-repo/qemu/build.buildspec.yml @@ -11,38 +11,46 @@ phases: pre_build: run-as: root commands: - - chown -R yoctouser /sstate-cache - - chown -R yoctouser /downloads - - chmod 755 /sstate-cache - - chmod 755 /downloads + - echo "Pre build started - [$(date '+%F %H:%M:%S')]" + - mkdir -p /nfs/sstate-cache && chown -R yoctouser /nfs/sstate-cache + - mkdir -p /nfs/downloads && chown -R yoctouser /nfs/downloads + - mkdir -p /nfs/build-output && chown -R yoctouser /nfs/build-output + - chmod -R 755 /nfs/sstate-cache + - chmod -R 755 /nfs/downloads + - chmod -R 755 /nfs/build-output - | if [[ -n "$PURGE_EFS" ]] ; then echo "Starting EFS purge." - rm -rvf /downloads/* - rm -rvf /sstate-cache/* + rm -rvf /nfs/downloads/* + rm -rvf /nfs/sstate-cache/* + rm -rvf /nfs/build-output/* fi + - echo "Pre build completed - [$(date '+%F %H:%M:%S')]" build: commands: + - echo "Build started - [$(date '+%F %H:%M:%S')]" - git clone https://github.com/aws4embeddedlinux/meta-aws-demos - cd meta-aws-demos - git submodule update --init --recursive - - echo Build started on `date` - . ./init-build-env $TMP_DIR # Update our local conf to check for CVEs - echo 'INHERIT += "cve-check"' >> $TMP_DIR/conf/local.conf # this will suppress false positive CVEs - echo 'include cve-extra-exclusions.inc' >> $TMP_DIR/conf/local.conf - BUILD_DEVICE=qemu bitbake core-image-minimal + - echo "Build completed - [$(date '+%F %H:%M:%S')]" post_build: commands: + - echo "Post build statred - [$(date '+%F %H:%M:%S')]" # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - - find /sstate-cache -atime +30 -type f -delete + - find /nfs/sstate-cache -atime +30 -type f -delete # only delete empty dirs - - find /sstate-cache -atime +30 -type d -empty -delete + - find /nfs/sstate-cache -atime +30 -type d -empty -delete # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - - find /downloads -atime +30 -type f -delete + - find /nfs/downloads -atime +30 -type f -delete # only delete empty dirs - - find /downloads -atime +30 -type d -empty -delete + - find /nfs/downloads -atime +30 -type d -empty -delete + - echo "Post build completed - [$(date '+%F %H:%M:%S')]" artifacts: discard-paths: true diff --git a/source-repo/renesas/build.buildspec.yml b/source-repo/renesas/build.buildspec.yml index 225d1ee..bf1eed6 100644 --- a/source-repo/renesas/build.buildspec.yml +++ b/source-repo/renesas/build.buildspec.yml @@ -11,33 +11,41 @@ phases: pre_build: run-as: root commands: - - chown -R yoctouser /sstate-cache - - chown -R yoctouser /downloads - - chmod 755 /sstate-cache - - chmod 755 /downloads - - chmod 755 build.sh + - echo "Pre build started - [$(date '+%F %H:%M:%S')]" + - mkdir -p /nfs/sstate-cache && chown -R yoctouser /nfs/sstate-cache + - mkdir -p /nfs/downloads && chown -R yoctouser /nfs/downloads + - mkdir -p /nfs/build-output && chown -R yoctouser /nfs/build-output + - chmod -R 755 /nfs/sstate-cache + - chmod -R 755 /nfs/downloads + - chmod -R 755 /nfs/build-output - | if [[ -n "$PURGE_EFS" ]] ; then echo "Starting EFS purge." - rm -rvf /downloads/* - rm -rvf /sstate-cache/* + rm -rvf /nfs/downloads/* + rm -rvf /nfs/sstate-cache/* + rm -rvf /nfs/build-output/* fi + - echo "Pre build completed - [$(date '+%F %H:%M:%S')]" build: commands: + - echo "Build started - [$(date '+%F %H:%M:%S')]" # BB_ENV_EXTRAWHITE is still used in Dunfell release and was renamed afterwards to BB_ENV_PASSTHROUGH_ADDITIONS - export BB_ENV_EXTRAWHITE=$BB_ENV_PASSTHROUGH_ADDITIONS - - echo Build started on `date` + - chmod +x ./build.sh - ./build.sh h3ulcb + - echo "Build completed - [$(date '+%F %H:%M:%S')]" post_build: commands: + - echo "Post build statred - [$(date '+%F %H:%M:%S')]" # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - - find /sstate-cache -atime +30 -type f -delete + - find /nfs/sstate-cache -atime +30 -type f -delete # only delete empty dirs - - find /sstate-cache -atime +30 -type d -empty -delete + - find /nfs/sstate-cache -atime +30 -type d -empty -delete # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - - find /downloads -atime +30 -type f -delete + - find /nfs/downloads -atime +30 -type f -delete # only delete empty dirs - - find /downloads -atime +30 -type d -empty -delete + - find /nfs/downloads -atime +30 -type d -empty -delete + - echo "Post build completed - [$(date '+%F %H:%M:%S')]" artifacts: discard-paths: true diff --git a/source-repo/renesas/build.sh b/source-repo/renesas/build.sh index bb0ea43..4ff77d9 100644 --- a/source-repo/renesas/build.sh +++ b/source-repo/renesas/build.sh @@ -1,27 +1,28 @@ #!/bin/bash set -e -BOARD_LIST=("h3ulcb" "m3ulcb") -TARGET_BOARD=$1 -PROPRIETARY_DIR=`pwd`/proprietary -WORK=`pwd`/${TARGET_BOARD} +export TARGET_BOARD=$1 +export BOARD_LIST=("h3ulcb" "m3ulcb") +PROPRIETARY_DIR="$(pwd)/proprietary" +export PROPRIETARY_DIR +WORK="$(pwd)/${TARGET_BOARD}" -GFX_MMP_LIB=R-Car_Gen3_Series_Evaluation_Software_Package_for_Linux-20220121.zip -GFX_MMP_DRIVER=R-Car_Gen3_Series_Evaluation_Software_Package_of_Linux_Drivers-20220121.zip +export GFX_MMP_LIB=R-Car_Gen3_Series_Evaluation_Software_Package_for_Linux-20220121.zip +export GFX_MMP_DRIVER=R-Car_Gen3_Series_Evaluation_Software_Package_of_Linux_Drivers-20220121.zip Usage () { echo "Usage: $0 \${TARGET_BOARD_NAME}" echo "BOARD_NAME list: " - for i in ${BOARD_LIST[@]}; do echo " - $i"; done - exit + for i in "${BOARD_LIST[@]}"; do echo " - $i"; done + # exit } # Check Param. -if ! `IFS=$'\n'; echo "${BOARD_LIST[*]}" | grep -qx "${TARGET_BOARD}"`; then +if ! (IFS=$'\n'; echo "${BOARD_LIST[*]}" | grep -qx "${TARGET_BOARD}"); then Usage fi -mkdir -p ${WORK} -cd ${WORK} +mkdir -p "${WORK}" +cd "${WORK}" # Clone basic Yocto layers in parallel git clone git://git.yoctoproject.org/poky -b dunfell & git clone git://git.openembedded.org/meta-openembedded -b dunfell & @@ -29,18 +30,19 @@ git clone https://github.com/renesas-rcar/meta-renesas -b dunfell # Wait for all clone operations wait # Switch to proper branches/commits -WORK_PROP_DIR=${WORK}/proprietary -mkdir -p ${WORK_PROP_DIR} +WORK_PROP_DIR="${WORK}/proprietary" +mkdir -p "${WORK_PROP_DIR}" ##TODO unzip -qo ${PROPRIETARY_DIR}/${GFX_MMP_LIB} -d ${WORK_PROP_DIR} ##TODO unzip -qo ${PROPRIETARY_DIR}/${GFX_MMP_DRIVER} -d ${WORK_PROP_DIR} -cd ${WORK}/meta-renesas -sh meta-rcar-gen3/docs/sample/copyscript/copy_proprietary_softwares.sh -f ${WORK_PROP_DIR} -cd ${WORK} -source poky/oe-init-build-env ${WORK}/build -#cp ${WORK}/meta-renesas/meta-rcar-gen3/docs/sample/conf/${TARGET_BOARD}/poky-gcc/bsp/*.conf ./conf/ -#cp ${WORK}/meta-renesas/meta-rcar-gen3/docs/sample/conf/${TARGET_BOARD}/poky-gcc/gfx-only/*.conf ./conf/ -cp ${WORK}/meta-renesas/meta-rcar-gen3/docs/sample/conf/${TARGET_BOARD}/poky-gcc/mmp/*.conf ./conf -cd ${WORK}/build +cd "${WORK}/meta-renesas" +sh meta-rcar-gen3/docs/sample/copyscript/copy_proprietary_softwares.sh -f "${WORK_PROP_DIR}" +cd "${WORK}" +# shellcheck source=/dev/null +source "poky/oe-init-build-env" "${WORK}/build" +#cp "${WORK}/meta-renesas/meta-rcar-gen3/docs/sample/conf/${TARGET_BOARD}/poky-gcc/bsp/"*.conf ./conf/ +#cp "${WORK}/meta-renesas/meta-rcar-gen3/docs/sample/conf/${TARGET_BOARD}/poky-gcc/gfx-only/"*.conf ./conf/ +cp "${WORK}/meta-renesas/meta-rcar-gen3/docs/sample/conf/${TARGET_BOARD}/poky-gcc/mmp/"*.conf ./conf +cd "${WORK}/build" cp conf/local-wayland.conf conf/local.conf echo 'BB_DANGLINGAPPENDS_WARNONLY ?= "true"' >> conf/local.conf diff --git a/test/__snapshots__/build-image-data.test.ts.snap b/test/__snapshots__/build-image-data.test.ts.snap deleted file mode 100644 index 3137bf0..0000000 --- a/test/__snapshots__/build-image-data.test.ts.snap +++ /dev/null @@ -1,621 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Build Image Data Snapshot 1`] = ` -{ - "Parameters": { - "BootstrapVersion": { - "Default": "/cdk-bootstrap/hnb659fds/version", - "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", - "Type": "AWS::SSM::Parameter::Value", - }, - }, - "Resources": { - "BuildImageBucketDeploymentAwsCliLayer7138A987": { - "Properties": { - "Content": { - "S3Bucket": "cdk-hnb659fds-assets-111111111111-eu-central-1", - "S3Key": "arbitrary-file.ext", - }, - "Description": "/opt/awscli/aws", - }, - "Type": "AWS::Lambda::LayerVersion", - }, - "BuildImageBucketDeploymentCustomResourceA6B3BEBF": { - "DeletionPolicy": "Delete", - "Properties": { - "DestinationBucketName": { - "Ref": "BuildImageDataBucketE6A8BC04", - }, - "Extract": true, - "OutputObjectKeys": true, - "Prune": true, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", - "Arn", - ], - }, - "SourceBucketNames": [ - "cdk-hnb659fds-assets-111111111111-eu-central-1", - ], - "SourceObjectKeys": [ - "arbitrary-file.ext", - ], - }, - "Type": "Custom::CDKBucketDeployment", - "UpdateReplacePolicy": "Delete", - }, - "BuildImageBucketRoleC5D0D05C": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": [ - { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": "arn:aws:logs:eu-central-1:111111111111:log-group:/aws/lambda/BuildImageData-CustomCDKBucketDeployment*"", - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "cwPolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "BuildImageBucketRoleDefaultPolicy39AC1070": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": "kms:Decrypt", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":s3:::cdk-hnb659fds-assets-111111111111-eu-central-1", - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":s3:::cdk-hnb659fds-assets-111111111111-eu-central-1/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "BuildImageDataBucketE6A8BC04", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "BuildImageDataBucketE6A8BC04", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "BuildImageBucketRoleDefaultPolicy39AC1070", - "Roles": [ - { - "Ref": "BuildImageBucketRoleC5D0D05C", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "BuildImageDataBucketAutoDeleteObjectsCustomResource89CDEC31": { - "DeletionPolicy": "Delete", - "DependsOn": [ - "BuildImageDataBucketPolicyBF163C5F", - ], - "Properties": { - "BucketName": { - "Ref": "BuildImageDataBucketE6A8BC04", - }, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn", - ], - }, - }, - "Type": "Custom::S3AutoDeleteObjects", - "UpdateReplacePolicy": "Delete", - }, - "BuildImageDataBucketE6A8BC04": { - "DeletionPolicy": "Delete", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "KMSMasterKeyID": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "SSEAlgorithm": "aws:kms", - }, - }, - ], - }, - "BucketName": "test-bucket", - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "LoggingBucket1E5A6F3B", - }, - }, - "Tags": [ - { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", - }, - { - "Key": "aws-cdk:cr-owned:19b429dc", - "Value": "true", - }, - ], - "VersioningConfiguration": { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", - }, - "BuildImageDataBucketPolicyBF163C5F": { - "Properties": { - "Bucket": { - "Ref": "BuildImageDataBucketE6A8BC04", - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, - "Resource": [ - { - "Fn::GetAtt": [ - "BuildImageDataBucketE6A8BC04", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "BuildImageDataBucketE6A8BC04", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:PutBucketPolicy", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - ], - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, - "Resource": [ - { - "Fn::GetAtt": [ - "BuildImageDataBucketE6A8BC04", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "BuildImageDataBucketE6A8BC04", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536": { - "DependsOn": [ - "BuildImageBucketRoleDefaultPolicy39AC1070", - "BuildImageBucketRoleC5D0D05C", - ], - "Properties": { - "Code": { - "S3Bucket": "cdk-hnb659fds-assets-111111111111-eu-central-1", - "S3Key": "arbitrary-file.ext", - }, - "Environment": { - "Variables": { - "AWS_CA_BUNDLE": "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", - }, - }, - "Handler": "index.handler", - "Layers": [ - { - "Ref": "BuildImageBucketDeploymentAwsCliLayer7138A987", - }, - ], - "Role": { - "Fn::GetAtt": [ - "BuildImageBucketRoleC5D0D05C", - "Arn", - ], - }, - "Runtime": "python3.11", - "Timeout": 900, - }, - "Type": "AWS::Lambda::Function", - }, - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { - "DependsOn": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - ], - "Properties": { - "Code": { - "S3Bucket": "cdk-hnb659fds-assets-111111111111-eu-central-1", - "S3Key": "arbitrary-file.ext", - }, - "Description": { - "Fn::Join": [ - "", - [ - "Lambda function for auto-deleting objects in ", - { - "Ref": "LoggingBucket1E5A6F3B", - }, - " S3 bucket.", - ], - ], - }, - "Handler": "index.handler", - "MemorySize": 128, - "Role": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - "Runtime": "nodejs20.x", - "Timeout": 900, - }, - "Type": "AWS::Lambda::Function", - }, - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": [ - { - "Fn::Sub": "arn:\${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "LoggingBucket1E5A6F3B": { - "DeletionPolicy": "Delete", - "Properties": { - "AccessControl": "LogDeliveryWrite", - "OwnershipControls": { - "Rules": [ - { - "ObjectOwnership": "ObjectWriter", - }, - ], - }, - "Tags": [ - { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", - }, - ], - "VersioningConfiguration": { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", - }, - "LoggingBucketAutoDeleteObjectsCustomResource3835D361": { - "DeletionPolicy": "Delete", - "DependsOn": [ - "LoggingBucketPolicy21938756", - ], - "Properties": { - "BucketName": { - "Ref": "LoggingBucket1E5A6F3B", - }, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn", - ], - }, - }, - "Type": "Custom::S3AutoDeleteObjects", - "UpdateReplacePolicy": "Delete", - }, - "LoggingBucketPolicy21938756": { - "Properties": { - "Bucket": { - "Ref": "LoggingBucket1E5A6F3B", - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, - "Resource": [ - { - "Fn::GetAtt": [ - "LoggingBucket1E5A6F3B", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "LoggingBucket1E5A6F3B", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:PutBucketPolicy", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - ], - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, - "Resource": [ - { - "Fn::GetAtt": [ - "LoggingBucket1E5A6F3B", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "LoggingBucket1E5A6F3B", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "PipelineArtifactKeyEC0C0075": { - "DeletionPolicy": "Delete", - "Properties": { - "EnableKeyRotation": true, - "KeyPolicy": { - "Statement": [ - { - "Action": "kms:*", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::111111111111:root", - ], - ], - }, - }, - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::KMS::Key", - "UpdateReplacePolicy": "Delete", - }, - }, - "Rules": { - "CheckBootstrapVersion": { - "Assertions": [ - { - "Assert": { - "Fn::Not": [ - { - "Fn::Contains": [ - [ - "1", - "2", - "3", - "4", - "5", - ], - { - "Ref": "BootstrapVersion", - }, - ], - }, - ], - }, - "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", - }, - ], - }, - }, -} -`; diff --git a/test/__snapshots__/build-image-repo.test.ts.snap b/test/__snapshots__/build-image-repo.test.ts.snap deleted file mode 100644 index fbbe919..0000000 --- a/test/__snapshots__/build-image-repo.test.ts.snap +++ /dev/null @@ -1,50 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Build Image Repository Snapshot 1`] = ` -{ - "Parameters": { - "BootstrapVersion": { - "Default": "/cdk-bootstrap/hnb659fds/version", - "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", - "Type": "AWS::SSM::Parameter::Value", - }, - }, - "Resources": { - "BuildImageRepoDCD988F4": { - "DeletionPolicy": "Delete", - "Properties": { - "EmptyOnDelete": true, - }, - "Type": "AWS::ECR::Repository", - "UpdateReplacePolicy": "Delete", - }, - }, - "Rules": { - "CheckBootstrapVersion": { - "Assertions": [ - { - "Assert": { - "Fn::Not": [ - { - "Fn::Contains": [ - [ - "1", - "2", - "3", - "4", - "5", - ], - { - "Ref": "BootstrapVersion", - }, - ], - }, - ], - }, - "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", - }, - ], - }, - }, -} -`; diff --git a/test/__snapshots__/build-image-pipeline.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap similarity index 57% rename from test/__snapshots__/build-image-pipeline.test.ts.snap rename to test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap index 61ea95d..4c808c7 100644 --- a/test/__snapshots__/build-image-pipeline.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap @@ -1,7 +1,49 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Build Image Pipeline Snapshot 1`] = ` +exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` { + "Outputs": { + "ECRBaseImageCheckCommand": { + "Description": "The AWS CLI command to check if the ECR Image was pushed", + "Value": { + "Fn::Join": [ + "", + [ + "aws ecr list-images --repository-name "", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + }, + "" --query "imageIds[?imageTag=='MyTestStack']"", + ], + ], + }, + }, + "ECRBaseImageTag": { + "Description": "The ECR Image Tag where the base image will be pushed", + "Value": "MyTestStack", + }, + "ECRRepositoryName": { + "Description": "The ECR Repository name where the base image will be pushed", + "Value": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + }, + }, + "SourceURI": { + "Description": "The source-repo bucket uri for this pipeline.", + "Value": { + "Fn::Join": [ + "", + [ + "s3://", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + }, + "/base-image/arbitrary-file.ext", + ], + ], + }, + }, + }, "Parameters": { "BootstrapVersion": { "Default": "/cdk-bootstrap/hnb659fds/version", @@ -10,85 +52,111 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, }, "Resources": { - "ArtifactAccessLoggingAutoDeleteObjectsCustomResourceD9DFD1B2": { + "CodePipelineBuildBaseImageBucketDeploymentAwsCliLayerF8B77510": { + "Properties": { + "Content": { + "S3Bucket": "cdk-hnb659fds-assets-111111111111-eu-central-1", + "S3Key": "arbitrary-file.ext", + }, + "Description": "/opt/awscli/aws", + }, + "Type": "AWS::Lambda::LayerVersion", + }, + "CodePipelineBuildBaseImageBucketDeploymentCustomResource9FCDB7FE": { "DeletionPolicy": "Delete", - "DependsOn": [ - "ArtifactAccessLoggingPolicyDC97CE59", - ], "Properties": { - "BucketName": { - "Ref": "ArtifactAccessLoggingD6FCABA3", + "DestinationBucketKeyPrefix": "base-image", + "DestinationBucketName": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", }, + "Extract": false, + "OutputObjectKeys": true, + "Prune": true, "ServiceToken": { "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", "Arn", ], }, + "SourceBucketNames": [ + "cdk-hnb659fds-assets-111111111111-eu-central-1", + ], + "SourceObjectKeys": [ + "arbitrary-file.ext", + ], }, - "Type": "Custom::S3AutoDeleteObjects", + "Type": "Custom::CDKBucketDeployment", "UpdateReplacePolicy": "Delete", }, - "ArtifactAccessLoggingD6FCABA3": { - "DeletionPolicy": "Delete", + "CodePipelineBuildBaseImageBucketDeploymentRoleDFF88C19": { "Properties": { - "AccessControl": "LogDeliveryWrite", - "OwnershipControls": { - "Rules": [ + "AssumeRolePolicyDocument": { + "Statement": [ { - "ObjectOwnership": "ObjectWriter", + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com", + }, }, ], + "Version": "2012-10-17", }, - "Tags": [ + "Policies": [ { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents", + ], + "Effect": "Allow", + "Resource": "arn:aws:logs:eu-central-1:111111111111:log-group:/aws/lambda/EmbeddedLinuxCodePipelineBaseImage-CustomCDKBucketDeployment*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "pipelineSourceBucketDeploymentPolicy", }, ], - "VersioningConfiguration": { - "Status": "Enabled", - }, }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", + "Type": "AWS::IAM::Role", }, - "ArtifactAccessLoggingPolicyDC97CE59": { + "CodePipelineBuildBaseImageBucketDeploymentRoleDefaultPolicy969D32AA": { "Properties": { - "Bucket": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, "PolicyDocument": { "Statement": [ { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", "Resource": [ { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":s3:::cdk-hnb659fds-assets-111111111111-eu-central-1", + ], ], }, { "Fn::Join": [ "", [ + "arn:", { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], + "Ref": "AWS::Partition", }, - "/*", + ":s3:::cdk-hnb659fds-assets-111111111111-eu-central-1/*", ], ], }, @@ -96,36 +164,28 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, { "Action": [ - "s3:PutBucketPolicy", + "s3:GetObject*", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*", + "s3:PutObject", + "s3:PutObjectLegalHold", + "s3:PutObjectRetention", + "s3:PutObjectTagging", + "s3:PutObjectVersionTagging", + "s3:Abort*", ], "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, "Resource": [ { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", }, { "Fn::Join": [ "", [ { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", }, "/*", ], @@ -133,47 +193,67 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, ], }, + { + "Action": [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, ], "Version": "2012-10-17", }, + "PolicyName": "CodePipelineBuildBaseImageBucketDeploymentRoleDefaultPolicy969D32AA", + "Roles": [ + { + "Ref": "CodePipelineBuildBaseImageBucketDeploymentRoleDFF88C19", + }, + ], }, - "Type": "AWS::S3::BucketPolicy", + "Type": "AWS::IAM::Policy", }, - "BuildImageBuildLogs65D4471D": { - "DeletionPolicy": "Retain", + "CodePipelineBuildBaseImageBuildLogs48BFE4D7": { + "DeletionPolicy": "Delete", "Properties": { - "RetentionInDays": 3653, + "LogGroupName": "MyTestStack-CodePipelineBuildBaseImageBuildLogs", + "RetentionInDays": 365, }, "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", + "UpdateReplacePolicy": "Delete", }, - "BuildImagePipeline01DF392E": { + "CodePipelineBuildBaseImageCodePipeline7907AE86": { "DependsOn": [ - "BuildImagePipelineRoleDefaultPolicy211D9F92", - "BuildImagePipelineRole576404EF", + "CodePipelineBuildBaseImageCodePipelineRoleDefaultPolicy677B7353", + "CodePipelineBuildBaseImageCodePipelineRole73E36B25", + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", ], "Properties": { "ArtifactStore": { "EncryptionKey": { "Id": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", }, "Type": "KMS", }, "Location": { - "Ref": "PipelineArtifacts4A9B2621", + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesArtifactBucketFF61EB98FA6EAAC1", }, "Type": "S3", }, - "Name": "ubuntu_22_04BuildImagePipeline", + "Name": "MyTestStack", "PipelineType": "V1", "RestartExecutionOnUpdate": true, "RoleArn": { "Fn::GetAtt": [ - "BuildImagePipelineRole576404EF", + "CodePipelineBuildBaseImageCodePipelineRole73E36B25", "Arn", ], }, @@ -188,20 +268,21 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Version": "1", }, "Configuration": { + "PollForSourceChanges": false, "S3Bucket": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", }, - "S3ObjectKey": "data.zip", + "S3ObjectKey": "base-image/arbitrary-file.ext", }, - "Name": "Build-Image-Source", + "Name": "Source", "OutputArtifacts": [ { - "Name": "BuildImageSource", + "Name": "Source", }, ], "RoleArn": { "Fn::GetAtt": [ - "BuildImagePipelineSourceBuildImageSourceCodePipelineActionRole30249AA3", + "CodePipelineBuildBaseImageCodePipelineSourceCodePipelineActionRole0F967AB4", "Arn", ], }, @@ -221,18 +302,18 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, "Configuration": { "ProjectName": { - "Ref": "BuildImageProjectD5B891B2", + "Ref": "CodePipelineBuildBaseImageProject69590E59", }, }, "InputArtifacts": [ { - "Name": "BuildImageSource", + "Name": "Source", }, ], "Name": "Build", "RoleArn": { "Fn::GetAtt": [ - "BuildImagePipelineBuildCodePipelineActionRole15E18A3A", + "CodePipelineBuildBaseImageCodePipelineBuildCodePipelineActionRoleA6CA6F27", "Arn", ], }, @@ -245,7 +326,12 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, "Type": "AWS::CodePipeline::Pipeline", }, - "BuildImagePipelineBuildCodePipelineActionRole15E18A3A": { + "CodePipelineBuildBaseImageCodePipelineBuildCodePipelineActionRoleA6CA6F27": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -273,7 +359,12 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, "Type": "AWS::IAM::Role", }, - "BuildImagePipelineBuildCodePipelineActionRoleDefaultPolicyF886D181": { + "CodePipelineBuildBaseImageCodePipelineBuildCodePipelineActionRoleDefaultPolicyDDAF06D1": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -286,7 +377,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Effect": "Allow", "Resource": { "Fn::GetAtt": [ - "BuildImageProjectD5B891B2", + "CodePipelineBuildBaseImageProject69590E59", "Arn", ], }, @@ -294,16 +385,21 @@ exports[`Build Image Pipeline Snapshot 1`] = ` ], "Version": "2012-10-17", }, - "PolicyName": "BuildImagePipelineBuildCodePipelineActionRoleDefaultPolicyF886D181", + "PolicyName": "CodePipelineBuildBaseImageCodePipelineBuildCodePipelineActionRoleDefaultPolicyDDAF06D1", "Roles": [ { - "Ref": "BuildImagePipelineBuildCodePipelineActionRole15E18A3A", + "Ref": "CodePipelineBuildBaseImageCodePipelineBuildCodePipelineActionRoleA6CA6F27", }, ], }, "Type": "AWS::IAM::Policy", }, - "BuildImagePipelineEventsRole6FF38A6B": { + "CodePipelineBuildBaseImageCodePipelineEventsRoleD9A83D03": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -320,7 +416,12 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, "Type": "AWS::IAM::Role", }, - "BuildImagePipelineEventsRoleDefaultPolicy7384E26F": { + "CodePipelineBuildBaseImageCodePipelineEventsRoleDefaultPolicyFCB5C7C5": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -337,7 +438,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, ":codepipeline:eu-central-1:111111111111:", { - "Ref": "BuildImagePipeline01DF392E", + "Ref": "CodePipelineBuildBaseImageCodePipeline7907AE86", }, ], ], @@ -346,16 +447,98 @@ exports[`Build Image Pipeline Snapshot 1`] = ` ], "Version": "2012-10-17", }, - "PolicyName": "BuildImagePipelineEventsRoleDefaultPolicy7384E26F", + "PolicyName": "CodePipelineBuildBaseImageCodePipelineEventsRoleDefaultPolicyFCB5C7C5", "Roles": [ { - "Ref": "BuildImagePipelineEventsRole6FF38A6B", + "Ref": "CodePipelineBuildBaseImageCodePipelineEventsRoleD9A83D03", }, ], }, "Type": "AWS::IAM::Policy", }, - "BuildImagePipelineRole576404EF": { + "CodePipelineBuildBaseImageCodePipelineMyTestStackCodePipelineBuildBaseImageCodePipelineFF25ACC6SourceEventRulebaseimage1ccdf1583059080a3911192a20ae50cc6b3bfa57d56d0b5b4d3866f920b3ad20zip04E1981E": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], + "Properties": { + "EventPattern": { + "detail": { + "eventName": [ + "CompleteMultipartUpload", + "CopyObject", + "PutObject", + ], + "requestParameters": { + "bucketName": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + }, + ], + "key": [ + "base-image/arbitrary-file.ext", + ], + }, + "resources": { + "ARN": [ + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + }, + "/base-image/arbitrary-file.ext", + ], + ], + }, + ], + }, + }, + "detail-type": [ + "AWS API Call via CloudTrail", + ], + "source": [ + "aws.s3", + ], + }, + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":codepipeline:eu-central-1:111111111111:", + { + "Ref": "CodePipelineBuildBaseImageCodePipeline7907AE86", + }, + ], + ], + }, + "Id": "Target0", + "RoleArn": { + "Fn::GetAtt": [ + "CodePipelineBuildBaseImageCodePipelineEventsRoleD9A83D03", + "Arn", + ], + }, + }, + ], + }, + "Type": "AWS::Events::Rule", + }, + "CodePipelineBuildBaseImageCodePipelineRole73E36B25": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -372,7 +555,12 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, "Type": "AWS::IAM::Role", }, - "BuildImagePipelineRoleDefaultPolicy211D9F92": { + "CodePipelineBuildBaseImageCodePipelineRoleDefaultPolicy677B7353": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -392,20 +580,14 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", }, { "Fn::Join": [ "", [ { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", }, "/*", ], @@ -423,10 +605,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", }, }, { @@ -434,7 +613,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Effect": "Allow", "Resource": { "Fn::GetAtt": [ - "BuildImagePipelineSourceBuildImageSourceCodePipelineActionRole30249AA3", + "CodePipelineBuildBaseImageCodePipelineSourceCodePipelineActionRole0F967AB4", "Arn", ], }, @@ -444,7 +623,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Effect": "Allow", "Resource": { "Fn::GetAtt": [ - "BuildImagePipelineBuildCodePipelineActionRole15E18A3A", + "CodePipelineBuildBaseImageCodePipelineBuildCodePipelineActionRoleA6CA6F27", "Arn", ], }, @@ -452,16 +631,21 @@ exports[`Build Image Pipeline Snapshot 1`] = ` ], "Version": "2012-10-17", }, - "PolicyName": "BuildImagePipelineRoleDefaultPolicy211D9F92", + "PolicyName": "CodePipelineBuildBaseImageCodePipelineRoleDefaultPolicy677B7353", "Roles": [ { - "Ref": "BuildImagePipelineRole576404EF", + "Ref": "CodePipelineBuildBaseImageCodePipelineRole73E36B25", }, ], }, "Type": "AWS::IAM::Policy", }, - "BuildImagePipelineSourceBuildImageSourceCodePipelineActionRole30249AA3": { + "CodePipelineBuildBaseImageCodePipelineSourceCodePipelineActionRole0F967AB4": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -489,7 +673,12 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, "Type": "AWS::IAM::Role", }, - "BuildImagePipelineSourceBuildImageSourceCodePipelineActionRoleDefaultPolicy7FF981F0": { + "CodePipelineBuildBaseImageCodePipelineSourceCodePipelineActionRoleDefaultPolicyC48B6A73": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -502,21 +691,31 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttBucket83908E77Arn063C8555", + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttBucket83908E77Arn063C8555", + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", }, - "/data.zip", + "/base-image/arbitrary-file.ext", ], ], }, ], }, + { + "Action": [ + "kms:Decrypt", + "kms:DescribeKey", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, { "Action": [ "s3:DeleteObject*", @@ -530,20 +729,14 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", }, { "Fn::Join": [ "", [ { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", }, "/*", ], @@ -560,25 +753,26 @@ exports[`Build Image Pipeline Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", }, }, ], "Version": "2012-10-17", }, - "PolicyName": "BuildImagePipelineSourceBuildImageSourceCodePipelineActionRoleDefaultPolicy7FF981F0", + "PolicyName": "CodePipelineBuildBaseImageCodePipelineSourceCodePipelineActionRoleDefaultPolicyC48B6A73", "Roles": [ { - "Ref": "BuildImagePipelineSourceBuildImageSourceCodePipelineActionRole30249AA3", + "Ref": "CodePipelineBuildBaseImageCodePipelineSourceCodePipelineActionRole0F967AB4", }, ], }, "Type": "AWS::IAM::Policy", }, - "BuildImageProjectD5B891B2": { + "CodePipelineBuildBaseImageProject69590E59": { + "DependsOn": [ + "CodePipelineBuildBaseImageBucketDeploymentAwsCliLayerF8B77510", + "CodePipelineBuildBaseImageBucketDeploymentCustomResource9FCDB7FE", + ], "Properties": { "Artifacts": { "Type": "CODEPIPELINE", @@ -587,13 +781,10 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Type": "NO_CACHE", }, "EncryptionKey": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", }, "Environment": { - "ComputeType": "BUILD_GENERAL1_LARGE", + "ComputeType": "BUILD_GENERAL1_MEDIUM", "EnvironmentVariables": [ { "Name": "ECR_REPOSITORY_URI", @@ -609,7 +800,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Fn::Split": [ ":", { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", }, ], }, @@ -623,7 +814,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Fn::Split": [ ":", { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", }, ], }, @@ -635,7 +826,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, "/", { - "Fn::ImportValue": "RepoStack:ExportsOutputRefRepository22E53BBD9A9E013B", + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", }, ], ], @@ -654,7 +845,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` { "Name": "IMAGE_TAG", "Type": "PLAINTEXT", - "Value": "ubuntu_22_04", + "Value": "MyTestStack", }, ], "Image": "aws/codebuild/standard:7.0", @@ -665,25 +856,30 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "LogsConfig": { "CloudWatchLogs": { "GroupName": { - "Ref": "BuildImageBuildLogs65D4471D", + "Ref": "CodePipelineBuildBaseImageBuildLogs48BFE4D7", }, "Status": "ENABLED", }, }, + "Name": "MyTestStack", "ServiceRole": { "Fn::GetAtt": [ - "BuildImageProjectRole3D242EB1", + "CodePipelineBuildBaseImageProjectRole12B97AA7", "Arn", ], }, "Source": { - "BuildSpec": "ubuntu_22_04/buildspec.yml", + "BuildSpec": "buildspec.yml", "Type": "CODEPIPELINE", }, }, "Type": "AWS::CodeBuild::Project", }, - "BuildImageProjectRole3D242EB1": { + "CodePipelineBuildBaseImageProjectRole12B97AA7": { + "DependsOn": [ + "CodePipelineBuildBaseImageBucketDeploymentAwsCliLayerF8B77510", + "CodePipelineBuildBaseImageBucketDeploymentCustomResource9FCDB7FE", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -700,7 +896,11 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, "Type": "AWS::IAM::Role", }, - "BuildImageProjectRoleDefaultPolicyDE9DF999": { + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC": { + "DependsOn": [ + "CodePipelineBuildBaseImageBucketDeploymentAwsCliLayerF8B77510", + "CodePipelineBuildBaseImageBucketDeploymentCustomResource9FCDB7FE", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -712,7 +912,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Effect": "Allow", "Resource": { "Fn::GetAtt": [ - "BuildImageBuildLogs65D4471D", + "CodePipelineBuildBaseImageBuildLogs48BFE4D7", "Arn", ], }, @@ -735,7 +935,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, ":logs:eu-central-1:111111111111:log-group:/aws/codebuild/", { - "Ref": "BuildImageProjectD5B891B2", + "Ref": "CodePipelineBuildBaseImageProject69590E59", }, ], ], @@ -750,7 +950,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, ":logs:eu-central-1:111111111111:log-group:/aws/codebuild/", { - "Ref": "BuildImageProjectD5B891B2", + "Ref": "CodePipelineBuildBaseImageProject69590E59", }, ":*", ], @@ -777,13 +977,25 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, ":codebuild:eu-central-1:111111111111:report-group/", { - "Ref": "BuildImageProjectD5B891B2", + "Ref": "CodePipelineBuildBaseImageProject69590E59", }, "-*", ], ], }, }, + { + "Action": [ + "kms:Decrypt", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, { "Action": [ "ecr:BatchCheckLayerAvailability", @@ -796,7 +1008,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", }, }, { @@ -813,20 +1025,14 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", }, { "Fn::Join": [ "", [ { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", }, "/*", ], @@ -841,275 +1047,22 @@ exports[`Build Image Pipeline Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": [ - "kms:Decrypt", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", }, }, ], "Version": "2012-10-17", }, - "PolicyName": "BuildImageProjectRoleDefaultPolicyDE9DF999", + "PolicyName": "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", "Roles": [ { - "Ref": "BuildImageProjectRole3D242EB1", + "Ref": "CodePipelineBuildBaseImageProjectRole12B97AA7", }, ], }, "Type": "AWS::IAM::Policy", }, - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { - "DependsOn": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - ], - "Properties": { - "Code": { - "S3Bucket": "cdk-hnb659fds-assets-111111111111-eu-central-1", - "S3Key": "faa95a81ae7d7373f3e1f242268f904eb748d8d0fdd306e8a6fe515a1905a7d6.zip", - }, - "Description": { - "Fn::Join": [ - "", - [ - "Lambda function for auto-deleting objects in ", - { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - " S3 bucket.", - ], - ], - }, - "Handler": "index.handler", - "MemorySize": 128, - "Role": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - "Runtime": "nodejs20.x", - "Timeout": 900, - }, - "Type": "AWS::Lambda::Function", - }, - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": [ - { - "Fn::Sub": "arn:\${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "PipelineArtifactKeyEC0C0075": { - "DeletionPolicy": "Delete", - "Properties": { - "EnableKeyRotation": true, - "KeyPolicy": { - "Statement": [ - { - "Action": "kms:*", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::111111111111:root", - ], - ], - }, - }, - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::KMS::Key", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifacts4A9B2621": { - "DeletionPolicy": "Delete", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "KMSMasterKeyID": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "SSEAlgorithm": "aws:kms", - }, - }, - ], - }, - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true, - }, - "Tags": [ - { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", - }, - ], - "VersioningConfiguration": { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifactsAutoDeleteObjectsCustomResourceFEF48A36": { - "DeletionPolicy": "Delete", - "DependsOn": [ - "PipelineArtifactsPolicy87787A0D", - ], - "Properties": { - "BucketName": { - "Ref": "PipelineArtifacts4A9B2621", - }, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn", - ], - }, - }, - "Type": "Custom::S3AutoDeleteObjects", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifactsPolicy87787A0D": { - "Properties": { - "Bucket": { - "Ref": "PipelineArtifacts4A9B2621", - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:PutBucketPolicy", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - ], - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "WeeklySchedule60EC10E3": { + "CodePipelineBuildBaseImageWeeklyRefreshSchedule8D68D946": { "Properties": { "ScheduleExpression": "cron(0 6 ? * Monday *)", "State": "ENABLED", @@ -1125,7 +1078,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, ":codepipeline:eu-central-1:111111111111:", { - "Ref": "BuildImagePipeline01DF392E", + "Ref": "CodePipelineBuildBaseImageCodePipeline7907AE86", }, ], ], @@ -1133,7 +1086,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Id": "Target0", "RoleArn": { "Fn::GetAtt": [ - "BuildImagePipelineEventsRole6FF38A6B", + "CodePipelineBuildBaseImageCodePipelineEventsRoleD9A83D03", "Arn", ], }, @@ -1142,6 +1095,38 @@ exports[`Build Image Pipeline Snapshot 1`] = ` }, "Type": "AWS::Events::Rule", }, + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536": { + "DependsOn": [ + "CodePipelineBuildBaseImageBucketDeploymentRoleDefaultPolicy969D32AA", + "CodePipelineBuildBaseImageBucketDeploymentRoleDFF88C19", + ], + "Properties": { + "Code": { + "S3Bucket": "cdk-hnb659fds-assets-111111111111-eu-central-1", + "S3Key": "arbitrary-file.ext", + }, + "Environment": { + "Variables": { + "AWS_CA_BUNDLE": "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", + }, + }, + "Handler": "index.handler", + "Layers": [ + { + "Ref": "CodePipelineBuildBaseImageBucketDeploymentAwsCliLayerF8B77510", + }, + ], + "Role": { + "Fn::GetAtt": [ + "CodePipelineBuildBaseImageBucketDeploymentRoleDFF88C19", + "Arn", + ], + }, + "Runtime": "python3.11", + "Timeout": 900, + }, + "Type": "AWS::Lambda::Function", + }, }, "Rules": { "CheckBootstrapVersion": { diff --git a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap new file mode 100644 index 0000000..22deb32 --- /dev/null +++ b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap @@ -0,0 +1,2171 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` +{ + "Outputs": { + "ArtifactURI": { + "Description": "The artifact bucket of this pipeline.", + "Value": { + "Fn::Join": [ + "", + [ + "s3://", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesArtifactBucketFF61EB98FA6EAAC1", + }, + "/poky/arbitrary-file.ext", + ], + ], + }, + }, + "OutputURI": { + "Description": "The output bucket of this pipeline.", + "Value": { + "Fn::Join": [ + "", + [ + "s3://", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesOutputBucketA2144F25070A0F1C", + }, + "/poky", + ], + ], + }, + }, + "SourceURI": { + "Description": "The source bucket uri for this pipeline.", + "Value": { + "Fn::Join": [ + "", + [ + "s3://", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + }, + "/poky/arbitrary-file.ext", + ], + ], + }, + }, + }, + "Parameters": { + "BootstrapVersion": { + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", + "Type": "AWS::SSM::Parameter::Value", + }, + }, + "Resources": { + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineBucketDeploymentRoleDefaultPolicy6C7ED123", + "EmbeddedLinuxCodePipelineBucketDeploymentRoleC8070F49", + ], + "Properties": { + "Code": { + "S3Bucket": "cdk-hnb659fds-assets-111111111111-eu-central-1", + "S3Key": "arbitrary-file.ext", + }, + "Environment": { + "Variables": { + "AWS_CA_BUNDLE": "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", + }, + }, + "Handler": "index.handler", + "Layers": [ + { + "Ref": "EmbeddedLinuxCodePipelineBucketDeploymentAwsCliLayerAA1BBC13", + }, + ], + "Role": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineBucketDeploymentRoleC8070F49", + "Arn", + ], + }, + "Runtime": "python3.11", + "Timeout": 900, + }, + "Type": "AWS::Lambda::Function", + }, + "EmbeddedLinuxCodePipeline4B3C7651": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineRoleDefaultPolicy8CDA8ACC", + "EmbeddedLinuxCodePipelineRole784D6893", + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "ArtifactStore": { + "EncryptionKey": { + "Id": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + "Type": "KMS", + }, + "Location": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesArtifactBucketFF61EB98FA6EAAC1", + }, + "Type": "S3", + }, + "Name": "MyTestStack", + "PipelineType": "V1", + "RestartExecutionOnUpdate": true, + "RoleArn": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineRole784D6893", + "Arn", + ], + }, + "Stages": [ + { + "Actions": [ + { + "ActionTypeId": { + "Category": "Source", + "Owner": "AWS", + "Provider": "S3", + "Version": "1", + }, + "Configuration": { + "PollForSourceChanges": false, + "S3Bucket": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + }, + "S3ObjectKey": "poky/arbitrary-file.ext", + }, + "Name": "Source", + "OutputArtifacts": [ + { + "Name": "Source", + }, + ], + "RoleArn": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineSourceCodePipelineActionRole1B690AB7", + "Arn", + ], + }, + "RunOrder": 1, + }, + ], + "Name": "Source", + }, + { + "Actions": [ + { + "ActionTypeId": { + "Category": "Build", + "Owner": "AWS", + "Provider": "CodeBuild", + "Version": "1", + }, + "Configuration": { + "ProjectName": { + "Ref": "EmbeddedLinuxCodePipelineProjectF55E3B36", + }, + }, + "InputArtifacts": [ + { + "Name": "Source", + }, + ], + "Name": "Build", + "OutputArtifacts": [ + { + "Name": "Artifact_Build_Build", + }, + ], + "RoleArn": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineBuildCodePipelineActionRoleEE85AA1E", + "Arn", + ], + }, + "RunOrder": 1, + }, + ], + "Name": "Build", + }, + { + "Actions": [ + { + "ActionTypeId": { + "Category": "Deploy", + "Owner": "AWS", + "Provider": "S3", + "Version": "1", + }, + "Configuration": { + "BucketName": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesArtifactBucketFF61EB98FA6EAAC1", + }, + "Extract": "true", + "ObjectKey": "poky/arbitrary-file.ext", + }, + "InputArtifacts": [ + { + "Name": "Artifact_Build_Build", + }, + ], + "Name": "Artifact", + "RoleArn": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineArtifactCodePipelineActionRole97F56214", + "Arn", + ], + }, + "RunOrder": 1, + }, + ], + "Name": "Artifact", + }, + ], + }, + "Type": "AWS::CodePipeline::Pipeline", + }, + "EmbeddedLinuxCodePipelineArtifactCodePipelineActionRole97F56214": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::111111111111:root", + ], + ], + }, + }, + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::IAM::Role", + }, + "EmbeddedLinuxCodePipelineArtifactCodePipelineActionRoleDefaultPolicyF6D7AEC0": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:DeleteObject*", + "s3:PutObject", + "s3:PutObjectLegalHold", + "s3:PutObjectRetention", + "s3:PutObjectTagging", + "s3:PutObjectVersionTagging", + "s3:Abort*", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + "kms:Decrypt", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, + { + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "kms:Decrypt", + "kms:DescribeKey", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodePipelineArtifactCodePipelineActionRoleDefaultPolicyF6D7AEC0", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodePipelineArtifactCodePipelineActionRole97F56214", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodePipelineBucketDeploymentAwsCliLayerAA1BBC13": { + "Properties": { + "Content": { + "S3Bucket": "cdk-hnb659fds-assets-111111111111-eu-central-1", + "S3Key": "arbitrary-file.ext", + }, + "Description": "/opt/awscli/aws", + }, + "Type": "AWS::Lambda::LayerVersion", + }, + "EmbeddedLinuxCodePipelineBucketDeploymentCustomResourceBA39990C": { + "DeletionPolicy": "Delete", + "Properties": { + "DestinationBucketKeyPrefix": "poky", + "DestinationBucketName": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + }, + "Extract": false, + "OutputObjectKeys": true, + "Prune": true, + "ServiceToken": { + "Fn::GetAtt": [ + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", + "Arn", + ], + }, + "SourceBucketNames": [ + "cdk-hnb659fds-assets-111111111111-eu-central-1", + ], + "SourceObjectKeys": [ + "arbitrary-file.ext", + ], + }, + "Type": "Custom::CDKBucketDeployment", + "UpdateReplacePolicy": "Delete", + }, + "EmbeddedLinuxCodePipelineBucketDeploymentRoleC8070F49": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents", + ], + "Effect": "Allow", + "Resource": "arn:aws:logs:eu-central-1:111111111111:log-group:/aws/lambda/EmbeddedLinuxCodePipelineBaseImage-CustomCDKBucketDeployment*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "pipelineSourceBucketDeploymentPolicy", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "EmbeddedLinuxCodePipelineBucketDeploymentRoleDefaultPolicy6C7ED123": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":s3:::cdk-hnb659fds-assets-111111111111-eu-central-1", + ], + ], + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":s3:::cdk-hnb659fds-assets-111111111111-eu-central-1/*", + ], + ], + }, + ], + }, + { + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + "s3:PutObject", + "s3:PutObjectLegalHold", + "s3:PutObjectRetention", + "s3:PutObjectTagging", + "s3:PutObjectVersionTagging", + "s3:Abort*", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodePipelineBucketDeploymentRoleDefaultPolicy6C7ED123", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodePipelineBucketDeploymentRoleC8070F49", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodePipelineBuildCodePipelineActionRoleDefaultPolicy44A54C9E": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "codebuild:BatchGetBuilds", + "codebuild:StartBuild", + "codebuild:StopBuild", + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "Arn", + ], + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodePipelineBuildCodePipelineActionRoleDefaultPolicy44A54C9E", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodePipelineBuildCodePipelineActionRoleEE85AA1E", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodePipelineBuildCodePipelineActionRoleEE85AA1E": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::111111111111:root", + ], + ], + }, + }, + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::IAM::Role", + }, + "EmbeddedLinuxCodePipelineBuildProjectSecurityGroup35690F9F": { + "Properties": { + "GroupDescription": "Security Group to allow attaching EFS", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1", + }, + ], + "SecurityGroupIngress": [ + { + "CidrIp": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesVpc54FB4A02CidrBlock1B329233", + }, + "Description": "NFS Mount Port", + "FromPort": 2049, + "IpProtocol": "tcp", + "ToPort": 2049, + }, + ], + "VpcId": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpc54FB4A0241E4C5E5", + }, + }, + "Type": "AWS::EC2::SecurityGroup", + }, + "EmbeddedLinuxCodePipelineCheckOSAndStop8C4E93D6": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "codepipeline:StopCodePipelineExecution", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":codepipeline:eu-central-1:111111111111:", + { + "Ref": "EmbeddedLinuxCodePipeline4B3C7651", + }, + ], + ], + }, + }, + { + "Action": "ecr:DescribeImages", + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodePipelineCheckOSAndStop8C4E93D6", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodePipelineOSImageCheckOnStartServiceRoleEBA0BE6A", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodePipelineEventsRole8EBF7C1D": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "events.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::IAM::Role", + }, + "EmbeddedLinuxCodePipelineEventsRoleDefaultPolicyF669575E": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "codepipeline:StartPipelineExecution", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":codepipeline:eu-central-1:111111111111:", + { + "Ref": "EmbeddedLinuxCodePipeline4B3C7651", + }, + ], + ], + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodePipelineEventsRoleDefaultPolicyF669575E", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodePipelineEventsRole8EBF7C1D", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodePipelineFileSystemB969CAF1": { + "DeletionPolicy": "Delete", + "Properties": { + "Encrypted": true, + "FileSystemTags": [ + { + "Key": "Name", + "Value": "MyTestStack/EmbeddedLinuxCodePipelineFileSystem", + }, + ], + }, + "Type": "AWS::EFS::FileSystem", + "UpdateReplacePolicy": "Delete", + }, + "EmbeddedLinuxCodePipelineFileSystemEfsMountTarget1CA0AA616": { + "Properties": { + "FileSystemId": { + "Ref": "EmbeddedLinuxCodePipelineFileSystemB969CAF1", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroup35971CF1", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet1Subnet8DD627A684935C4B", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EmbeddedLinuxCodePipelineFileSystemEfsMountTarget24B554859": { + "Properties": { + "FileSystemId": { + "Ref": "EmbeddedLinuxCodePipelineFileSystemB969CAF1", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroup35971CF1", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet2SubnetC1071C9093652F10", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EmbeddedLinuxCodePipelineFileSystemEfsMountTarget3FAD334C7": { + "Properties": { + "FileSystemId": { + "Ref": "EmbeddedLinuxCodePipelineFileSystemB969CAF1", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroup35971CF1", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet3SubnetCA196C90FDAFF9BF", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroup35971CF1": { + "Properties": { + "GroupDescription": "MyTestStack/EmbeddedLinuxCodePipelineFileSystem/EfsSecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1", + }, + ], + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/EmbeddedLinuxCodePipelineFileSystem", + }, + ], + "VpcId": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpc54FB4A0241E4C5E5", + }, + }, + "Type": "AWS::EC2::SecurityGroup", + }, + "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroupfromMyTestStackEmbeddedLinuxCodePipelineBuildProjectSecurityGroupEA21757F2049FC93D5D2": { + "Properties": { + "Description": "from MyTestStackEmbeddedLinuxCodePipelineBuildProjectSecurityGroupEA21757F:2049", + "FromPort": 2049, + "GroupId": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroup35971CF1", + "GroupId", + ], + }, + "IpProtocol": "tcp", + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineBuildProjectSecurityGroup35690F9F", + "GroupId", + ], + }, + "ToPort": 2049, + }, + "Type": "AWS::EC2::SecurityGroupIngress", + }, + "EmbeddedLinuxCodePipelineMyTestStackEmbeddedLinuxCodePipelineE5C7D172SourceEventRulepokyf48cd2a94def24552abdd5b6ef9ffe6137be08fbc49a17964c6f7cae81245d5dzipEC68B3DA": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "EventPattern": { + "detail": { + "eventName": [ + "CompleteMultipartUpload", + "CopyObject", + "PutObject", + ], + "requestParameters": { + "bucketName": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + }, + ], + "key": [ + "poky/arbitrary-file.ext", + ], + }, + "resources": { + "ARN": [ + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + }, + "/poky/arbitrary-file.ext", + ], + ], + }, + ], + }, + }, + "detail-type": [ + "AWS API Call via CloudTrail", + ], + "source": [ + "aws.s3", + ], + }, + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":codepipeline:eu-central-1:111111111111:", + { + "Ref": "EmbeddedLinuxCodePipeline4B3C7651", + }, + ], + ], + }, + "Id": "Target0", + "RoleArn": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineEventsRole8EBF7C1D", + "Arn", + ], + }, + }, + ], + }, + "Type": "AWS::Events::Rule", + }, + "EmbeddedLinuxCodePipelineOSImageCheckOnStart9461FE82": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineOSImageCheckOnStartServiceRoleEBA0BE6A", + ], + "Properties": { + "Code": { + "ZipFile": { + "Fn::Join": [ + "", + [ + " + import boto3 + import json + + ecr_client = boto3.client('ecr') + codepipeline_client = boto3.client('codepipeline') + + def handler(event, context): + print("Received event: " + json.dumps(event, indent=2)) + response = ecr_client.describe_images(repositoryName='", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + }, + "', filter={'tagStatus': 'TAGGED'}) + for i in response['imageDetails']: + if 'MyBaseImageStack' in i['ecrRepositoryImageTags']: + break + else: + print('OS image not found. Stopping execution.') + response = codepipeline_client.stop_pipeline_execution( + pipelineName=event['detail']['pipeline'], + pipelineExecutionId=event['detail']['execution-id'], + abandon=True, + reason='OS image not found in ECR repository. Stopping pipeline until image is present.') + ", + ], + ], + }, + }, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineOSImageCheckOnStartServiceRoleEBA0BE6A", + "Arn", + ], + }, + "Runtime": "python3.10", + }, + "Type": "AWS::Lambda::Function", + }, + "EmbeddedLinuxCodePipelineOSImageCheckOnStartLogRetentionF9BA1BAC": { + "Properties": { + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/lambda/", + { + "Ref": "EmbeddedLinuxCodePipelineOSImageCheckOnStart9461FE82", + }, + ], + ], + }, + "RetentionInDays": 365, + "ServiceToken": { + "Fn::GetAtt": [ + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", + "Arn", + ], + }, + }, + "Type": "Custom::LogRetention", + }, + "EmbeddedLinuxCodePipelineOSImageCheckOnStartServiceRoleEBA0BE6A": { + "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", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "EmbeddedLinuxCodePipelineOnCodePipelineStartRule0A57D4C5": { + "Properties": { + "EventPattern": { + "detail": { + "execution-trigger": { + "trigger-type": [ + "CreateCodePipeline", + ], + }, + "state": [ + "STARTED", + ], + }, + "detail-type": [ + "CodeCodePipeline CodePipeline Execution State Change", + ], + "source": [ + "aws.codepipeline", + ], + }, + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineOSImageCheckOnStart9461FE82", + "Arn", + ], + }, + "Id": "Target0", + }, + ], + }, + "Type": "AWS::Events::Rule", + }, + "EmbeddedLinuxCodePipelineOnCodePipelineStartRuleAllowEventRuleMyTestStackEmbeddedLinuxCodePipelineOSImageCheckOnStartADCB57EA531B1926": { + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineOSImageCheckOnStart9461FE82", + "Arn", + ], + }, + "Principal": "events.amazonaws.com", + "SourceArn": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineOnCodePipelineStartRule0A57D4C5", + "Arn", + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "EmbeddedLinuxCodePipelineProjectF55E3B36": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineBucketDeploymentAwsCliLayerAA1BBC13", + "EmbeddedLinuxCodePipelineBucketDeploymentCustomResourceBA39990C", + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + ], + "Properties": { + "Artifacts": { + "Type": "CODEPIPELINE", + }, + "Cache": { + "Type": "NO_CACHE", + }, + "EncryptionKey": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + "Environment": { + "ComputeType": "BUILD_GENERAL1_XLARGE", + "EnvironmentVariables": [ + { + "Name": "AWS_ACCOUNT_ID", + "Type": "PLAINTEXT", + "Value": "111111111111", + }, + { + "Name": "AWS_DEFAULT_REGION", + "Type": "PLAINTEXT", + "Value": "eu-central-1", + }, + { + "Name": "PIPELINE_PROJECT_NAME", + "Type": "PLAINTEXT", + "Value": "MyTestStack", + }, + { + "Name": "PIPELINE_OUTPUT_BUCKET", + "Type": "PLAINTEXT", + "Value": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesOutputBucketA2144F25070A0F1C", + }, + }, + { + "Name": "PIPELINE_OUTPUT_BUCKET_PREFIX", + "Type": "PLAINTEXT", + "Value": "poky", + }, + { + "Name": "VM_IMPORT_ROLE", + "Type": "PLAINTEXT", + "Value": { + "Ref": "EmbeddedLinuxCodePipelineVMImportRole68B53DB4", + }, + }, + ], + "Image": { + "Fn::Join": [ + "", + [ + { + "Fn::Select": [ + 4, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + }, + ], + }, + ], + }, + ".dkr.ecr.", + { + "Fn::Select": [ + 3, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + }, + ], + }, + ], + }, + ".", + { + "Ref": "AWS::URLSuffix", + }, + "/", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + }, + ":MyBaseImageStack", + ], + ], + }, + "ImagePullCredentialsType": "SERVICE_ROLE", + "PrivilegedMode": true, + "Type": "LINUX_CONTAINER", + }, + "FileSystemLocations": [ + { + "Identifier": "nfs", + "Location": { + "Fn::Join": [ + "", + [ + { + "Ref": "EmbeddedLinuxCodePipelineFileSystemB969CAF1", + }, + ".efs.eu-central-1.amazonaws.com:/", + ], + ], + }, + "MountPoint": "/nfs", + "Type": "EFS", + }, + ], + "LogsConfig": { + "CloudWatchLogs": { + "GroupName": { + "Ref": "EmbeddedLinuxCodePipelineProjectLogsBA5DB55C", + }, + "Status": "ENABLED", + }, + }, + "Name": "MyTestStack", + "ServiceRole": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + "Arn", + ], + }, + "Source": { + "BuildSpec": "build.buildspec.yml", + "Type": "CODEPIPELINE", + }, + "TimeoutInMinutes": 240, + "VpcConfig": { + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineBuildProjectSecurityGroup35690F9F", + "GroupId", + ], + }, + ], + "Subnets": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet1Subnet8DD627A684935C4B", + }, + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet2SubnetC1071C9093652F10", + }, + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet3SubnetCA196C90FDAFF9BF", + }, + ], + "VpcId": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpc54FB4A0241E4C5E5", + }, + }, + }, + "Type": "AWS::CodeBuild::Project", + }, + "EmbeddedLinuxCodePipelineProjectLogsBA5DB55C": { + "DeletionPolicy": "Delete", + "Properties": { + "LogGroupName": "MyTestStack-EmbeddedLinuxCodePipelineProjectLogs", + "RetentionInDays": 365, + }, + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + }, + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineBucketDeploymentAwsCliLayerAA1BBC13", + "EmbeddedLinuxCodePipelineBucketDeploymentCustomResourceBA39990C", + ], + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "ec2:CreateNetworkInterface", + "ec2:DescribeNetworkInterfaces", + "ec2:DeleteNetworkInterface", + "ec2:DescribeSubnets", + "ec2:DescribeSecurityGroups", + "ec2:DescribeDhcpOptions", + "ec2:DescribeVpcs", + ], + "Effect": "Allow", + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineBucketDeploymentAwsCliLayerAA1BBC13", + "EmbeddedLinuxCodePipelineBucketDeploymentCustomResourceBA39990C", + ], + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "ecr:BatchCheckLayerAvailability", + "ecr:GetDownloadUrlForLayer", + "ecr:BatchGetImage", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + }, + }, + { + "Action": "ecr:GetAuthorizationToken", + "Effect": "Allow", + "Resource": "*", + }, + { + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents", + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineProjectLogsBA5DB55C", + "Arn", + ], + }, + }, + { + "Action": "ec2:CreateNetworkInterfacePermission", + "Condition": { + "StringEquals": { + "ec2:AuthorizedService": "codebuild.amazonaws.com", + "ec2:Subnet": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":ec2:", + { + "Ref": "AWS::Region", + }, + ":", + { + "Ref": "AWS::AccountId", + }, + ":subnet/", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet1Subnet8DD627A684935C4B", + }, + ], + ], + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":ec2:", + { + "Ref": "AWS::Region", + }, + ":", + { + "Ref": "AWS::AccountId", + }, + ":subnet/", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet2SubnetC1071C9093652F10", + }, + ], + ], + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":ec2:", + { + "Ref": "AWS::Region", + }, + ":", + { + "Ref": "AWS::AccountId", + }, + ":subnet/", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet3SubnetCA196C90FDAFF9BF", + }, + ], + ], + }, + ], + }, + }, + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":ec2:", + { + "Ref": "AWS::Region", + }, + ":", + { + "Ref": "AWS::AccountId", + }, + ":network-interface/*", + ], + ], + }, + }, + { + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":logs:eu-central-1:111111111111:log-group:/aws/codebuild/", + { + "Ref": "EmbeddedLinuxCodePipelineProjectF55E3B36", + }, + ], + ], + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":logs:eu-central-1:111111111111:log-group:/aws/codebuild/", + { + "Ref": "EmbeddedLinuxCodePipelineProjectF55E3B36", + }, + ":*", + ], + ], + }, + ], + }, + { + "Action": [ + "codebuild:CreateReportGroup", + "codebuild:CreateReport", + "codebuild:UpdateReport", + "codebuild:BatchPutTestCases", + "codebuild:BatchPutCodeCoverages", + ], + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":codebuild:eu-central-1:111111111111:report-group/", + { + "Ref": "EmbeddedLinuxCodePipelineProjectF55E3B36", + }, + "-*", + ], + ], + }, + }, + { + "Action": [ + "kms:Decrypt", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, + { + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + "s3:PutObject", + "s3:PutObjectLegalHold", + "s3:PutObjectRetention", + "s3:PutObjectTagging", + "s3:PutObjectVersionTagging", + "s3:Abort*", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, + { + "Action": [ + "ec2:CreateImage", + "ec2:CreateTags", + "ec2:DescribeImages", + "ec2:DescribeSnapshots", + "ec2:DescribeImportSnapshotTasks", + "ec2:DescribeTags", + "ec2:CancelImportTask", + ], + "Effect": "Allow", + "Resource": "*", + }, + { + "Action": "ec2:ImportSnapshot", + "Effect": "Allow", + "Resource": [ + "arn:aws:ec2:eu-central-1:111111111111:import-snapshot-task/*", + "arn:aws:ec2:eu-central-1::snapshot/*", + ], + }, + { + "Action": [ + "s3:GetObject", + "s3:ListBucket", + "s3:PutObject", + "s3:PutObjectTagging", + "s3:AbortMultipartUpload", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "ec2:RegisterImage", + "ec2:DeregisterImage", + "ec2:CreateStoreImageTask", + ], + "Effect": "Allow", + "Resource": [ + "arn:aws:ec2:eu-central-1::image/*", + "arn:aws:ec2:eu-central-1::snapshot/snap-*", + ], + }, + { + "Action": [ + "ebs:CompleteSnapshot", + "ebs:GetSnapshotBlock", + "ebs:ListChangedBlocks", + "ebs:ListSnapshotBlocks", + "ebs:PutSnapshotBlock", + ], + "Effect": "Allow", + "Resource": "arn:aws:ec2:eu-central-1::snapshot/*", + }, + { + "Action": [ + "ec2:DescribeStoreImageTasks", + "ec2:GetEbsEncryptionByDefault", + ], + "Effect": "Allow", + "Resource": "*", + }, + { + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + "s3:PutObject", + "s3:PutObjectLegalHold", + "s3:PutObjectRetention", + "s3:PutObjectTagging", + "s3:PutObjectVersionTagging", + "s3:Abort*", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + }, + "/*", + ], + ], + }, + ], + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineBucketDeploymentAwsCliLayerAA1BBC13", + "EmbeddedLinuxCodePipelineBucketDeploymentCustomResourceBA39990C", + ], + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codebuild.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::IAM::Role", + }, + "EmbeddedLinuxCodePipelineRole784D6893": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codepipeline.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::IAM::Role", + }, + "EmbeddedLinuxCodePipelineRoleDefaultPolicy8CDA8ACC": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + "s3:PutObject", + "s3:PutObjectLegalHold", + "s3:PutObjectRetention", + "s3:PutObjectTagging", + "s3:PutObjectVersionTagging", + "s3:Abort*", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "kms:Decrypt", + "kms:DescribeKey", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineSourceCodePipelineActionRole1B690AB7", + "Arn", + ], + }, + }, + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineBuildCodePipelineActionRoleEE85AA1E", + "Arn", + ], + }, + }, + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineArtifactCodePipelineActionRole97F56214", + "Arn", + ], + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodePipelineRoleDefaultPolicy8CDA8ACC", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodePipelineRole784D6893", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodePipelineSourceCodePipelineActionRole1B690AB7": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::111111111111:root", + ], + ], + }, + }, + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::IAM::Role", + }, + "EmbeddedLinuxCodePipelineSourceCodePipelineActionRoleDefaultPolicy2FB1A568": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + }, + "/poky/arbitrary-file.ext", + ], + ], + }, + ], + }, + { + "Action": [ + "kms:Decrypt", + "kms:DescribeKey", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, + { + "Action": [ + "s3:DeleteObject*", + "s3:PutObject", + "s3:PutObjectLegalHold", + "s3:PutObjectRetention", + "s3:PutObjectTagging", + "s3:PutObjectVersionTagging", + "s3:Abort*", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + "kms:Decrypt", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodePipelineSourceCodePipelineActionRoleDefaultPolicy2FB1A568", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodePipelineSourceCodePipelineActionRole1B690AB7", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodePipelineVMImportRole68B53DB4": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Condition": { + "StringEquals": { + "sts:ExternalId": "vmimport", + }, + }, + "Effect": "Allow", + "Principal": { + "Service": "vmie.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "Policies": [ + { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetBucketLocation", + "s3:GetObject", + "s3:ListBucket", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "ec2:CreateTags", + "ec2:DescribeTags", + ], + "Condition": { + "StringEquals": { + "ec2:ResourceTag/CreatedBy": [ + "MyTestStack", + ], + }, + }, + "Effect": "Allow", + "Resource": "*", + }, + { + "Action": "ec2:CopySnapshot", + "Effect": "Allow", + "Resource": "arn:aws:ec2:eu-central-1::snapshot/*", + }, + { + "Action": "ec2:DescribeSnapshots", + "Effect": "Allow", + "Resource": "*", + }, + { + "Action": [ + "kms:CreateGrant", + "kms:Decrypt", + "kms:DescribeKey", + "kms:GenerateDataKeyWithoutPlaintext", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "vmImportPolicy", + }, + ], + "RoleName": "MyTestStack-vm-mport", + }, + "Type": "AWS::IAM::Role", + }, + "EmbeddedLinuxCodePipelineWeeklyRefreshSchedule47F3A27D": { + "Properties": { + "ScheduleExpression": "cron(0 6 ? * Tuesday *)", + "State": "ENABLED", + "Targets": [ + { + "Arn": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":codepipeline:eu-central-1:111111111111:", + { + "Ref": "EmbeddedLinuxCodePipeline4B3C7651", + }, + ], + ], + }, + "Id": "Target0", + "RoleArn": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineEventsRole8EBF7C1D", + "Arn", + ], + }, + }, + ], + }, + "Type": "AWS::Events::Rule", + }, + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A": { + "DependsOn": [ + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB", + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", + ], + "Properties": { + "Code": { + "S3Bucket": "cdk-hnb659fds-assets-111111111111-eu-central-1", + "S3Key": "arbitrary-file.ext", + }, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", + "Arn", + ], + }, + "Runtime": "nodejs20.x", + "Timeout": 900, + }, + "Type": "AWS::Lambda::Function", + }, + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB": { + "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", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:PutRetentionPolicy", + "logs:DeleteRetentionPolicy", + ], + "Effect": "Allow", + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB", + "Roles": [ + { + "Ref": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5", + ], + { + "Ref": "BootstrapVersion", + }, + ], + }, + ], + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", + }, + ], + }, + }, +} +`; diff --git a/test/__snapshots__/codepipeline-resources.test.ts.snap b/test/__snapshots__/codepipeline-resources.test.ts.snap new file mode 100644 index 0000000..78df388 --- /dev/null +++ b/test/__snapshots__/codepipeline-resources.test.ts.snap @@ -0,0 +1,1376 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`PipelineResourcesStack Snapshot 1`] = ` +{ + "Outputs": { + "ArtifactBucket": { + "Description": "The artifact bucket.", + "Value": { + "Ref": "PipelineResourcesArtifactBucketFF61EB98", + }, + }, + "LoggingBucket": { + "Description": "The access logging bucket.", + "Value": { + "Ref": "PipelineResourcesLoggingBucketD957F175", + }, + }, + "OutputBucket": { + "Description": "The output bucket.", + "Value": { + "Ref": "PipelineResourcesOutputBucketA2144F25", + }, + }, + "SourceBucket": { + "Description": "The source bucket.", + "Value": { + "Ref": "PipelineResourcesSourceBucket1FA488F5", + }, + }, + }, + "Parameters": { + "BootstrapVersion": { + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", + "Type": "AWS::SSM::Parameter::Value", + }, + }, + "Resources": { + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { + "DependsOn": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + ], + "Properties": { + "Code": { + "S3Bucket": "cdk-hnb659fds-assets-111111111111-eu-central-1", + "S3Key": "arbitrary-file.ext", + }, + "Description": { + "Fn::Join": [ + "", + [ + "Lambda function for auto-deleting objects in ", + { + "Ref": "PipelineResourcesLoggingBucketD957F175", + }, + " S3 bucket.", + ], + ], + }, + "Handler": "index.handler", + "MemorySize": 128, + "Role": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn", + ], + }, + "Runtime": "nodejs20.x", + "Timeout": 900, + }, + "Type": "AWS::Lambda::Function", + }, + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": [ + { + "Fn::Sub": "arn:\${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "PipelineResourcesArtifactBucketAutoDeleteObjectsCustomResource92CEB6DD": { + "DeletionPolicy": "Delete", + "DependsOn": [ + "PipelineResourcesArtifactBucketPolicy41E82DF1", + ], + "Properties": { + "BucketName": { + "Ref": "PipelineResourcesArtifactBucketFF61EB98", + }, + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn", + ], + }, + }, + "Type": "Custom::S3AutoDeleteObjects", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesArtifactBucketFF61EB98": { + "DeletionPolicy": "Delete", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "KMSMasterKeyID": { + "Fn::GetAtt": [ + "PipelineResourcesArtifactKey368D3018", + "Arn", + ], + }, + "SSEAlgorithm": "aws:kms", + }, + }, + ], + }, + "BucketName": "test-111111111111-eu-central-1-artifact", + "LoggingConfiguration": { + "DestinationBucketName": { + "Ref": "PipelineResourcesLoggingBucketD957F175", + }, + "LogFilePrefix": "artifact-bucket", + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true", + }, + ], + "VersioningConfiguration": { + "Status": "Enabled", + }, + }, + "Type": "AWS::S3::Bucket", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesArtifactBucketPolicy41E82DF1": { + "Properties": { + "Bucket": { + "Ref": "PipelineResourcesArtifactBucketFF61EB98", + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false", + }, + }, + "Effect": "Deny", + "Principal": { + "AWS": "*", + }, + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineResourcesArtifactBucketFF61EB98", + "Arn", + ], + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineResourcesArtifactBucketFF61EB98", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn", + ], + }, + }, + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineResourcesArtifactBucketFF61EB98", + "Arn", + ], + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineResourcesArtifactBucketFF61EB98", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::S3::BucketPolicy", + }, + "PipelineResourcesArtifactKey368D3018": { + "DeletionPolicy": "Delete", + "Properties": { + "EnableKeyRotation": true, + "KeyPolicy": { + "Statement": [ + { + "Action": "kms:*", + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::111111111111:root", + ], + ], + }, + }, + "Resource": "*", + }, + { + "Action": [ + "kms:Decrypt", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Principal": { + "Service": "logging.s3.amazonaws.com", + }, + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::KMS::Key", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesECRRepositoryA0DB7EB6": { + "DeletionPolicy": "Delete", + "Properties": { + "EmptyOnDelete": true, + "RepositoryName": "test-111111111111-eu-central-1-repo", + }, + "Type": "AWS::ECR::Repository", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesLoggingBucketAutoDeleteObjectsCustomResource17381FC7": { + "DeletionPolicy": "Delete", + "DependsOn": [ + "PipelineResourcesLoggingBucketPolicy520659AE", + ], + "Properties": { + "BucketName": { + "Ref": "PipelineResourcesLoggingBucketD957F175", + }, + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn", + ], + }, + }, + "Type": "Custom::S3AutoDeleteObjects", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesLoggingBucketD957F175": { + "DeletionPolicy": "Delete", + "Properties": { + "AccessControl": "LogDeliveryWrite", + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "KMSMasterKeyID": { + "Fn::GetAtt": [ + "PipelineResourcesArtifactKey368D3018", + "Arn", + ], + }, + "SSEAlgorithm": "aws:kms", + }, + }, + ], + }, + "BucketName": "test-111111111111-eu-central-1-logs", + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter", + }, + ], + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true", + }, + ], + "VersioningConfiguration": { + "Status": "Enabled", + }, + }, + "Type": "AWS::S3::Bucket", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesLoggingBucketPolicy520659AE": { + "Properties": { + "Bucket": { + "Ref": "PipelineResourcesLoggingBucketD957F175", + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false", + }, + }, + "Effect": "Deny", + "Principal": { + "AWS": "*", + }, + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineResourcesLoggingBucketD957F175", + "Arn", + ], + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineResourcesLoggingBucketD957F175", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn", + ], + }, + }, + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineResourcesLoggingBucketD957F175", + "Arn", + ], + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineResourcesLoggingBucketD957F175", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::S3::BucketPolicy", + }, + "PipelineResourcesOutputBucketA2144F25": { + "DeletionPolicy": "Delete", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "KMSMasterKeyID": { + "Fn::GetAtt": [ + "PipelineResourcesArtifactKey368D3018", + "Arn", + ], + }, + "SSEAlgorithm": "aws:kms", + }, + }, + ], + }, + "BucketName": "test-111111111111-eu-central-1-output", + "LoggingConfiguration": { + "DestinationBucketName": { + "Ref": "PipelineResourcesLoggingBucketD957F175", + }, + "LogFilePrefix": "output-bucket", + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true", + }, + ], + "VersioningConfiguration": { + "Status": "Enabled", + }, + }, + "Type": "AWS::S3::Bucket", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesOutputBucketAutoDeleteObjectsCustomResource5A511D2C": { + "DeletionPolicy": "Delete", + "DependsOn": [ + "PipelineResourcesOutputBucketPolicyAE7D91E7", + ], + "Properties": { + "BucketName": { + "Ref": "PipelineResourcesOutputBucketA2144F25", + }, + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn", + ], + }, + }, + "Type": "Custom::S3AutoDeleteObjects", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesOutputBucketPolicyAE7D91E7": { + "Properties": { + "Bucket": { + "Ref": "PipelineResourcesOutputBucketA2144F25", + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false", + }, + }, + "Effect": "Deny", + "Principal": { + "AWS": "*", + }, + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineResourcesOutputBucketA2144F25", + "Arn", + ], + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineResourcesOutputBucketA2144F25", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn", + ], + }, + }, + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineResourcesOutputBucketA2144F25", + "Arn", + ], + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineResourcesOutputBucketA2144F25", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::S3::BucketPolicy", + }, + "PipelineResourcesSourceBucket1FA488F5": { + "DeletionPolicy": "Delete", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "KMSMasterKeyID": { + "Fn::GetAtt": [ + "PipelineResourcesArtifactKey368D3018", + "Arn", + ], + }, + "SSEAlgorithm": "aws:kms", + }, + }, + ], + }, + "BucketName": "test-111111111111-eu-central-1-source", + "LoggingConfiguration": { + "DestinationBucketName": { + "Ref": "PipelineResourcesLoggingBucketD957F175", + }, + "LogFilePrefix": "source-bucket", + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true", + }, + ], + "VersioningConfiguration": { + "Status": "Enabled", + }, + }, + "Type": "AWS::S3::Bucket", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesSourceBucketAutoDeleteObjectsCustomResourceD6504155": { + "DeletionPolicy": "Delete", + "DependsOn": [ + "PipelineResourcesSourceBucketPolicyE537B0E0", + ], + "Properties": { + "BucketName": { + "Ref": "PipelineResourcesSourceBucket1FA488F5", + }, + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn", + ], + }, + }, + "Type": "Custom::S3AutoDeleteObjects", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesSourceBucketPolicyE537B0E0": { + "Properties": { + "Bucket": { + "Ref": "PipelineResourcesSourceBucket1FA488F5", + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false", + }, + }, + "Effect": "Deny", + "Principal": { + "AWS": "*", + }, + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineResourcesSourceBucket1FA488F5", + "Arn", + ], + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineResourcesSourceBucket1FA488F5", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn", + ], + }, + }, + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineResourcesSourceBucket1FA488F5", + "Arn", + ], + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineResourcesSourceBucket1FA488F5", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::S3::BucketPolicy", + }, + "PipelineResourcesVPCFlowLogGroupCCF3042F": { + "DeletionPolicy": "Delete", + "Properties": { + "LogGroupName": "MyTestStack-PipelineResourcesVPCFlowLogGroup", + "RetentionInDays": 365, + }, + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesVPCFlowLogsFlowLogDCC98C23": { + "Properties": { + "DeliverLogsPermissionArn": { + "Fn::GetAtt": [ + "PipelineResourcesVPCFlowLogsIAMRoleD4BD5FD0", + "Arn", + ], + }, + "LogDestinationType": "cloud-watch-logs", + "LogGroupName": { + "Ref": "PipelineResourcesVPCFlowLogGroupCCF3042F", + }, + "ResourceId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + "ResourceType": "VPC", + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVPCFlowLogs", + }, + ], + "TrafficType": "ALL", + }, + "Type": "AWS::EC2::FlowLog", + }, + "PipelineResourcesVPCFlowLogsIAMRoleD4BD5FD0": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "vpc-flow-logs.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVPCFlowLogs", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "PipelineResourcesVPCFlowLogsIAMRoleDefaultPolicy6A6D03E1": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents", + "logs:DescribeLogStreams", + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "PipelineResourcesVPCFlowLogGroupCCF3042F", + "Arn", + ], + }, + }, + { + "Action": "iam:PassRole", + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "PipelineResourcesVPCFlowLogsIAMRoleD4BD5FD0", + "Arn", + ], + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "PipelineResourcesVPCFlowLogsIAMRoleDefaultPolicy6A6D03E1", + "Roles": [ + { + "Ref": "PipelineResourcesVPCFlowLogsIAMRoleD4BD5FD0", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "PipelineResourcesVpc54FB4A02": { + "Properties": { + "CidrBlock": "10.0.0.0/16", + "EnableDnsHostnames": true, + "EnableDnsSupport": true, + "InstanceTenancy": "default", + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc", + }, + ], + }, + "Type": "AWS::EC2::VPC", + }, + "PipelineResourcesVpcIGW375CBF19": { + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc", + }, + ], + }, + "Type": "AWS::EC2::InternetGateway", + }, + "PipelineResourcesVpcPrivateSubnet1DefaultRoute4C73C54F": { + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "NatGatewayId": { + "Ref": "PipelineResourcesVpcPublicSubnet1NATGateway9B71CD07", + }, + "RouteTableId": { + "Ref": "PipelineResourcesVpcPrivateSubnet1RouteTable42958689", + }, + }, + "Type": "AWS::EC2::Route", + }, + "PipelineResourcesVpcPrivateSubnet1RouteTable42958689": { + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet1", + }, + ], + "VpcId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + }, + "Type": "AWS::EC2::RouteTable", + }, + "PipelineResourcesVpcPrivateSubnet1RouteTableAssociationC7ED7464": { + "Properties": { + "RouteTableId": { + "Ref": "PipelineResourcesVpcPrivateSubnet1RouteTable42958689", + }, + "SubnetId": { + "Ref": "PipelineResourcesVpcPrivateSubnet1Subnet8DD627A6", + }, + }, + "Type": "AWS::EC2::SubnetRouteTableAssociation", + }, + "PipelineResourcesVpcPrivateSubnet1Subnet8DD627A6": { + "Properties": { + "AvailabilityZone": "dummy1a", + "CidrBlock": "10.0.96.0/19", + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Private", + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Private", + }, + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet1", + }, + ], + "VpcId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + }, + "Type": "AWS::EC2::Subnet", + }, + "PipelineResourcesVpcPrivateSubnet2DefaultRouteB1EEA4A3": { + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "NatGatewayId": { + "Ref": "PipelineResourcesVpcPublicSubnet2NATGateway655DC282", + }, + "RouteTableId": { + "Ref": "PipelineResourcesVpcPrivateSubnet2RouteTableBA14AB02", + }, + }, + "Type": "AWS::EC2::Route", + }, + "PipelineResourcesVpcPrivateSubnet2RouteTableAssociation9DEF6A48": { + "Properties": { + "RouteTableId": { + "Ref": "PipelineResourcesVpcPrivateSubnet2RouteTableBA14AB02", + }, + "SubnetId": { + "Ref": "PipelineResourcesVpcPrivateSubnet2SubnetC1071C90", + }, + }, + "Type": "AWS::EC2::SubnetRouteTableAssociation", + }, + "PipelineResourcesVpcPrivateSubnet2RouteTableBA14AB02": { + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet2", + }, + ], + "VpcId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + }, + "Type": "AWS::EC2::RouteTable", + }, + "PipelineResourcesVpcPrivateSubnet2SubnetC1071C90": { + "Properties": { + "AvailabilityZone": "dummy1b", + "CidrBlock": "10.0.128.0/19", + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Private", + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Private", + }, + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet2", + }, + ], + "VpcId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + }, + "Type": "AWS::EC2::Subnet", + }, + "PipelineResourcesVpcPrivateSubnet3DefaultRoute12E7DE69": { + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "NatGatewayId": { + "Ref": "PipelineResourcesVpcPublicSubnet3NATGatewayE3DAD508", + }, + "RouteTableId": { + "Ref": "PipelineResourcesVpcPrivateSubnet3RouteTable6A1E641C", + }, + }, + "Type": "AWS::EC2::Route", + }, + "PipelineResourcesVpcPrivateSubnet3RouteTable6A1E641C": { + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet3", + }, + ], + "VpcId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + }, + "Type": "AWS::EC2::RouteTable", + }, + "PipelineResourcesVpcPrivateSubnet3RouteTableAssociationACAD4730": { + "Properties": { + "RouteTableId": { + "Ref": "PipelineResourcesVpcPrivateSubnet3RouteTable6A1E641C", + }, + "SubnetId": { + "Ref": "PipelineResourcesVpcPrivateSubnet3SubnetCA196C90", + }, + }, + "Type": "AWS::EC2::SubnetRouteTableAssociation", + }, + "PipelineResourcesVpcPrivateSubnet3SubnetCA196C90": { + "Properties": { + "AvailabilityZone": "dummy1c", + "CidrBlock": "10.0.160.0/19", + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Private", + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Private", + }, + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet3", + }, + ], + "VpcId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + }, + "Type": "AWS::EC2::Subnet", + }, + "PipelineResourcesVpcPublicSubnet1DefaultRouteEC2ED518": { + "DependsOn": [ + "PipelineResourcesVpcVPCGWD5E21195", + ], + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "GatewayId": { + "Ref": "PipelineResourcesVpcIGW375CBF19", + }, + "RouteTableId": { + "Ref": "PipelineResourcesVpcPublicSubnet1RouteTable31D009BE", + }, + }, + "Type": "AWS::EC2::Route", + }, + "PipelineResourcesVpcPublicSubnet1EIPAA3A3298": { + "Properties": { + "Domain": "vpc", + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet1", + }, + ], + }, + "Type": "AWS::EC2::EIP", + }, + "PipelineResourcesVpcPublicSubnet1NATGateway9B71CD07": { + "DependsOn": [ + "PipelineResourcesVpcPublicSubnet1DefaultRouteEC2ED518", + "PipelineResourcesVpcPublicSubnet1RouteTableAssociation20C8242F", + ], + "Properties": { + "AllocationId": { + "Fn::GetAtt": [ + "PipelineResourcesVpcPublicSubnet1EIPAA3A3298", + "AllocationId", + ], + }, + "SubnetId": { + "Ref": "PipelineResourcesVpcPublicSubnet1SubnetF8A80437", + }, + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet1", + }, + ], + }, + "Type": "AWS::EC2::NatGateway", + }, + "PipelineResourcesVpcPublicSubnet1RouteTable31D009BE": { + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet1", + }, + ], + "VpcId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + }, + "Type": "AWS::EC2::RouteTable", + }, + "PipelineResourcesVpcPublicSubnet1RouteTableAssociation20C8242F": { + "Properties": { + "RouteTableId": { + "Ref": "PipelineResourcesVpcPublicSubnet1RouteTable31D009BE", + }, + "SubnetId": { + "Ref": "PipelineResourcesVpcPublicSubnet1SubnetF8A80437", + }, + }, + "Type": "AWS::EC2::SubnetRouteTableAssociation", + }, + "PipelineResourcesVpcPublicSubnet1SubnetF8A80437": { + "Properties": { + "AvailabilityZone": "dummy1a", + "CidrBlock": "10.0.0.0/19", + "MapPublicIpOnLaunch": true, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Public", + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Public", + }, + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet1", + }, + ], + "VpcId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + }, + "Type": "AWS::EC2::Subnet", + }, + "PipelineResourcesVpcPublicSubnet2DefaultRoute3E8F0AD0": { + "DependsOn": [ + "PipelineResourcesVpcVPCGWD5E21195", + ], + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "GatewayId": { + "Ref": "PipelineResourcesVpcIGW375CBF19", + }, + "RouteTableId": { + "Ref": "PipelineResourcesVpcPublicSubnet2RouteTable3F256387", + }, + }, + "Type": "AWS::EC2::Route", + }, + "PipelineResourcesVpcPublicSubnet2EIPD5CF8B49": { + "Properties": { + "Domain": "vpc", + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet2", + }, + ], + }, + "Type": "AWS::EC2::EIP", + }, + "PipelineResourcesVpcPublicSubnet2NATGateway655DC282": { + "DependsOn": [ + "PipelineResourcesVpcPublicSubnet2DefaultRoute3E8F0AD0", + "PipelineResourcesVpcPublicSubnet2RouteTableAssociation6F2523EC", + ], + "Properties": { + "AllocationId": { + "Fn::GetAtt": [ + "PipelineResourcesVpcPublicSubnet2EIPD5CF8B49", + "AllocationId", + ], + }, + "SubnetId": { + "Ref": "PipelineResourcesVpcPublicSubnet2SubnetB9638D82", + }, + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet2", + }, + ], + }, + "Type": "AWS::EC2::NatGateway", + }, + "PipelineResourcesVpcPublicSubnet2RouteTable3F256387": { + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet2", + }, + ], + "VpcId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + }, + "Type": "AWS::EC2::RouteTable", + }, + "PipelineResourcesVpcPublicSubnet2RouteTableAssociation6F2523EC": { + "Properties": { + "RouteTableId": { + "Ref": "PipelineResourcesVpcPublicSubnet2RouteTable3F256387", + }, + "SubnetId": { + "Ref": "PipelineResourcesVpcPublicSubnet2SubnetB9638D82", + }, + }, + "Type": "AWS::EC2::SubnetRouteTableAssociation", + }, + "PipelineResourcesVpcPublicSubnet2SubnetB9638D82": { + "Properties": { + "AvailabilityZone": "dummy1b", + "CidrBlock": "10.0.32.0/19", + "MapPublicIpOnLaunch": true, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Public", + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Public", + }, + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet2", + }, + ], + "VpcId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + }, + "Type": "AWS::EC2::Subnet", + }, + "PipelineResourcesVpcPublicSubnet3DefaultRoute9ED6D279": { + "DependsOn": [ + "PipelineResourcesVpcVPCGWD5E21195", + ], + "Properties": { + "DestinationCidrBlock": "0.0.0.0/0", + "GatewayId": { + "Ref": "PipelineResourcesVpcIGW375CBF19", + }, + "RouteTableId": { + "Ref": "PipelineResourcesVpcPublicSubnet3RouteTableB8C2FF69", + }, + }, + "Type": "AWS::EC2::Route", + }, + "PipelineResourcesVpcPublicSubnet3EIPF7259271": { + "Properties": { + "Domain": "vpc", + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet3", + }, + ], + }, + "Type": "AWS::EC2::EIP", + }, + "PipelineResourcesVpcPublicSubnet3NATGatewayE3DAD508": { + "DependsOn": [ + "PipelineResourcesVpcPublicSubnet3DefaultRoute9ED6D279", + "PipelineResourcesVpcPublicSubnet3RouteTableAssociationA597E9BD", + ], + "Properties": { + "AllocationId": { + "Fn::GetAtt": [ + "PipelineResourcesVpcPublicSubnet3EIPF7259271", + "AllocationId", + ], + }, + "SubnetId": { + "Ref": "PipelineResourcesVpcPublicSubnet3Subnet154058BD", + }, + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet3", + }, + ], + }, + "Type": "AWS::EC2::NatGateway", + }, + "PipelineResourcesVpcPublicSubnet3RouteTableAssociationA597E9BD": { + "Properties": { + "RouteTableId": { + "Ref": "PipelineResourcesVpcPublicSubnet3RouteTableB8C2FF69", + }, + "SubnetId": { + "Ref": "PipelineResourcesVpcPublicSubnet3Subnet154058BD", + }, + }, + "Type": "AWS::EC2::SubnetRouteTableAssociation", + }, + "PipelineResourcesVpcPublicSubnet3RouteTableB8C2FF69": { + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet3", + }, + ], + "VpcId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + }, + "Type": "AWS::EC2::RouteTable", + }, + "PipelineResourcesVpcPublicSubnet3Subnet154058BD": { + "Properties": { + "AvailabilityZone": "dummy1c", + "CidrBlock": "10.0.64.0/19", + "MapPublicIpOnLaunch": true, + "Tags": [ + { + "Key": "aws-cdk:subnet-name", + "Value": "Public", + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Public", + }, + { + "Key": "Name", + "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet3", + }, + ], + "VpcId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + }, + "Type": "AWS::EC2::Subnet", + }, + "PipelineResourcesVpcVPCGWD5E21195": { + "Properties": { + "InternetGatewayId": { + "Ref": "PipelineResourcesVpcIGW375CBF19", + }, + "VpcId": { + "Ref": "PipelineResourcesVpc54FB4A02", + }, + }, + "Type": "AWS::EC2::VPCGatewayAttachment", + }, + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5", + ], + { + "Ref": "BootstrapVersion", + }, + ], + }, + ], + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", + }, + ], + }, + }, +} +`; diff --git a/test/__snapshots__/embedded-linux-pipeline.test.ts.snap b/test/__snapshots__/embedded-linux-pipeline.test.ts.snap deleted file mode 100644 index f1f29b4..0000000 --- a/test/__snapshots__/embedded-linux-pipeline.test.ts.snap +++ /dev/null @@ -1,7805 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` -{ - "Outputs": { - "BuildOutput": { - "Description": "The output bucket of this pipeline.", - "Value": { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - }, - }, - "Parameters": { - "BootstrapVersion": { - "Default": "/cdk-bootstrap/hnb659fds/version", - "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", - "Type": "AWS::SSM::Parameter::Value", - }, - }, - "Resources": { - "ArtifactAccessLoggingAutoDeleteObjectsCustomResourceD9DFD1B2": { - "DeletionPolicy": "Delete", - "DependsOn": [ - "ArtifactAccessLoggingPolicyDC97CE59", - ], - "Properties": { - "BucketName": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn", - ], - }, - }, - "Type": "Custom::S3AutoDeleteObjects", - "UpdateReplacePolicy": "Delete", - }, - "ArtifactAccessLoggingD6FCABA3": { - "DeletionPolicy": "Delete", - "Properties": { - "AccessControl": "LogDeliveryWrite", - "OwnershipControls": { - "Rules": [ - { - "ObjectOwnership": "ObjectWriter", - }, - ], - }, - "Tags": [ - { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", - }, - ], - "VersioningConfiguration": { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", - }, - "ArtifactAccessLoggingPolicyDC97CE59": { - "Properties": { - "Bucket": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, - "Resource": [ - { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:PutBucketPolicy", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - ], - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, - "Resource": [ - { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "BuildProjectSecurityGroup28D27668": { - "Properties": { - "GroupDescription": "Security Group to allow attaching EFS", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "SecurityGroupIngress": [ - { - "CidrIp": { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttBucket83908E77CidrBlockD1D303CF", - }, - "Description": "NFS Mount Port", - "FromPort": 2049, - "IpProtocol": "tcp", - "ToPort": 2049, - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "CheckOSAndStop224E880C": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": "codepipeline:StopPipelineExecution", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codepipeline:eu-central-1:12341234:", - { - "Ref": "EmbeddedLinuxPipeline1DDFB4FE", - }, - ], - ], - }, - }, - { - "Action": "ecr:DescribeImages", - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "CheckOSAndStop224E880C", - "Roles": [ - { - "Ref": "OSImageCheckOnStartServiceRole2D11D1E2", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { - "DependsOn": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - ], - "Properties": { - "Code": { - "S3Bucket": "cdk-hnb659fds-assets-12341234-eu-central-1", - "S3Key": "arbitrary-file.ext", - }, - "Description": { - "Fn::Join": [ - "", - [ - "Lambda function for auto-deleting objects in ", - { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - " S3 bucket.", - ], - ], - }, - "Handler": "index.handler", - "MemorySize": 128, - "Role": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - "Runtime": "nodejs20.x", - "Timeout": 900, - }, - "Type": "AWS::Lambda::Function", - }, - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": [ - { - "Fn::Sub": "arn:\${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxBuildProject45760157": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - ], - "Properties": { - "Artifacts": { - "Type": "CODEPIPELINE", - }, - "Cache": { - "Type": "NO_CACHE", - }, - "EncryptionKey": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "Environment": { - "ComputeType": "BUILD_GENERAL1_2XLARGE", - "EnvironmentVariables": [ - { - "Name": "IMPORT_BUCKET", - "Type": "PLAINTEXT", - "Value": { - "Ref": "PipelineOutput78594CB5", - }, - }, - { - "Name": "ROLE_NAME", - "Type": "PLAINTEXT", - "Value": { - "Ref": "VMImportRoleAC246CAD", - }, - }, - { - "Name": "SCRIPT_URL", - "Type": "PLAINTEXT", - "Value": "s3://cdk-hnb659fds-assets-12341234-eu-central-1/arbitrary-file.ext", - }, - ], - "Image": { - "Fn::Join": [ - "", - [ - { - "Fn::Select": [ - 4, - { - "Fn::Split": [ - ":", - { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", - }, - ], - }, - ], - }, - ".dkr.ecr.", - { - "Fn::Select": [ - 3, - { - "Fn::Split": [ - ":", - { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", - }, - ], - }, - ], - }, - ".", - { - "Ref": "AWS::URLSuffix", - }, - "/", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefRepository22E53BBD9A9E013B", - }, - ":latest", - ], - ], - }, - "ImagePullCredentialsType": "SERVICE_ROLE", - "PrivilegedMode": true, - "Type": "LINUX_CONTAINER", - }, - "FileSystemLocations": [ - { - "Identifier": "tmp_dir", - "Location": { - "Fn::Join": [ - "", - [ - { - "Ref": "EmbeddedLinuxPipelineTempFilesystem8ECAD602", - }, - ".efs.eu-central-1.amazonaws.com:/", - ], - ], - }, - "MountPoint": "/build-output", - "Type": "EFS", - }, - { - "Identifier": "sstate_cache", - "Location": { - "Fn::Join": [ - "", - [ - { - "Ref": "EmbeddedLinuxPipelineSStateFilesystem36BA2630", - }, - ".efs.eu-central-1.amazonaws.com:/", - ], - ], - }, - "MountPoint": "/sstate-cache", - "Type": "EFS", - }, - { - "Identifier": "dl_dir", - "Location": { - "Fn::Join": [ - "", - [ - { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - ".efs.eu-central-1.amazonaws.com:/", - ], - ], - }, - "MountPoint": "/downloads", - "Type": "EFS", - }, - ], - "LogsConfig": { - "CloudWatchLogs": { - "GroupName": { - "Ref": "PipelineBuildLogs0533272F", - }, - "Status": "ENABLED", - }, - }, - "ServiceRole": { - "Fn::GetAtt": [ - "EmbeddedLinuxBuildProjectRole4EBABAB2", - "Arn", - ], - }, - "Source": { - "BuildSpec": "build.buildspec.yml", - "Type": "CODEPIPELINE", - }, - "TimeoutInMinutes": 240, - "VpcConfig": { - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - ], - "Subnets": [ - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - }, - "Type": "AWS::CodeBuild::Project", - }, - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "ec2:CreateNetworkInterface", - "ec2:DescribeNetworkInterfaces", - "ec2:DeleteNetworkInterface", - "ec2:DescribeSubnets", - "ec2:DescribeSecurityGroups", - "ec2:DescribeDhcpOptions", - "ec2:DescribeVpcs", - ], - "Effect": "Allow", - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "Roles": [ - { - "Ref": "EmbeddedLinuxBuildProjectRole4EBABAB2", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxBuildProjectRole4EBABAB2": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "codebuild.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "ecr:BatchCheckLayerAvailability", - "ecr:GetDownloadUrlForLayer", - "ecr:BatchGetImage", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", - }, - }, - { - "Action": "ecr:GetAuthorizationToken", - "Effect": "Allow", - "Resource": "*", - }, - { - "Action": [ - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineBuildLogs0533272F", - "Arn", - ], - }, - }, - { - "Action": "ec2:CreateNetworkInterfacePermission", - "Condition": { - "StringEquals": { - "ec2:AuthorizedService": "codebuild.amazonaws.com", - "ec2:Subnet": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":subnet/", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":subnet/", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":subnet/", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - ], - ], - }, - ], - }, - }, - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":network-interface/*", - ], - ], - }, - }, - { - "Action": [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":logs:eu-central-1:12341234:log-group:/aws/codebuild/", - { - "Ref": "EmbeddedLinuxBuildProject45760157", - }, - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":logs:eu-central-1:12341234:log-group:/aws/codebuild/", - { - "Ref": "EmbeddedLinuxBuildProject45760157", - }, - ":*", - ], - ], - }, - ], - }, - { - "Action": [ - "codebuild:CreateReportGroup", - "codebuild:CreateReport", - "codebuild:UpdateReport", - "codebuild:BatchPutTestCases", - "codebuild:BatchPutCodeCoverages", - ], - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codebuild:eu-central-1:12341234:report-group/", - { - "Ref": "EmbeddedLinuxBuildProject45760157", - }, - "-*", - ], - ], - }, - }, - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "OutputBucketEncryptionKey0E569549", - "Arn", - ], - }, - }, - { - "Action": [ - "ec2:CreateImage", - "ec2:CreateTags", - "ec2:DescribeImages", - "ec2:DescribeSnapshots", - "ec2:DescribeImportSnapshotTasks", - "ec2:DescribeTags", - "ec2:CancelImportTask", - ], - "Effect": "Allow", - "Resource": "*", - }, - { - "Action": "ec2:ImportSnapshot", - "Effect": "Allow", - "Resource": [ - "arn:aws:ec2:eu-central-1:12341234:import-snapshot-task/*", - "arn:aws:ec2:eu-central-1::snapshot/*", - ], - }, - { - "Action": [ - "s3:GetObject", - "s3:ListBucket", - "s3:PutObject", - "s3:PutObjectTagging", - "s3:AbortMultipartUpload", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "ec2:RegisterImage", - "ec2:DeregisterImage", - "ec2:CreateStoreImageTask", - ], - "Effect": "Allow", - "Resource": [ - "arn:aws:ec2:eu-central-1::image/*", - "arn:aws:ec2:eu-central-1::snapshot/snap-*", - ], - }, - { - "Action": [ - "ebs:CompleteSnapshot", - "ebs:GetSnapshotBlock", - "ebs:ListChangedBlocks", - "ebs:ListSnapshotBlocks", - "ebs:PutSnapshotBlock", - ], - "Effect": "Allow", - "Resource": "arn:aws:ec2:eu-central-1::snapshot/*", - }, - { - "Action": [ - "ec2:DescribeStoreImageTasks", - "ec2:GetEbsEncryptionByDefault", - ], - "Effect": "Allow", - "Resource": "*", - }, - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":s3:::cdk-hnb659fds-assets-12341234-eu-central-1", - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":s3:::cdk-hnb659fds-assets-12341234-eu-central-1/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": [ - "kms:Decrypt", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": "codecommit:GitPull", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "SourceRepoSourceRepositoryC86045A8", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "Roles": [ - { - "Ref": "EmbeddedLinuxBuildProjectRole4EBABAB2", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipeline1DDFB4FE": { - "DependsOn": [ - "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9", - "EmbeddedLinuxPipelineRole1094A815", - ], - "Properties": { - "ArtifactStore": { - "EncryptionKey": { - "Id": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "Type": "KMS", - }, - "Location": { - "Ref": "PipelineArtifacts4A9B2621", - }, - "Type": "S3", - }, - "PipelineType": "V1", - "RestartExecutionOnUpdate": true, - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineRole1094A815", - "Arn", - ], - }, - "Stages": [ - { - "Actions": [ - { - "ActionTypeId": { - "Category": "Source", - "Owner": "AWS", - "Provider": "CodeCommit", - "Version": "1", - }, - "Configuration": { - "BranchName": "main", - "OutputArtifactFormat": "CODEBUILD_CLONE_REF", - "PollForSourceChanges": false, - "RepositoryName": { - "Fn::GetAtt": [ - "SourceRepoSourceRepositoryC86045A8", - "Name", - ], - }, - }, - "Name": "Source", - "OutputArtifacts": [ - { - "Name": "Artifact_Source_Source", - }, - ], - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6", - "Arn", - ], - }, - "RunOrder": 1, - }, - ], - "Name": "Source", - }, - { - "Actions": [ - { - "ActionTypeId": { - "Category": "Build", - "Owner": "AWS", - "Provider": "CodeBuild", - "Version": "1", - }, - "Configuration": { - "ProjectName": { - "Ref": "EmbeddedLinuxBuildProject45760157", - }, - }, - "InputArtifacts": [ - { - "Name": "Artifact_Source_Source", - }, - ], - "Name": "Build", - "OutputArtifacts": [ - { - "Name": "Artifact_Build_Build", - }, - ], - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4", - "Arn", - ], - }, - "RunOrder": 1, - }, - ], - "Name": "Build", - }, - { - "Actions": [ - { - "ActionTypeId": { - "Category": "Deploy", - "Owner": "AWS", - "Provider": "S3", - "Version": "1", - }, - "Configuration": { - "BucketName": { - "Ref": "PipelineOutput78594CB5", - }, - "Extract": "true", - }, - "InputArtifacts": [ - { - "Name": "Artifact_Build_Build", - }, - ], - "Name": "Artifact", - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750", - "Arn", - ], - }, - "RunOrder": 1, - }, - ], - "Name": "Artifact", - }, - ], - }, - "Type": "AWS::CodePipeline::Pipeline", - }, - "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineArtifactCodePipelineActionRoleDefaultPolicyD75CCCBC": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - "kms:Decrypt", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "OutputBucketEncryptionKey0E569549", - "Arn", - ], - }, - }, - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineArtifactCodePipelineActionRoleDefaultPolicyD75CCCBC", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineBuildCodePipelineActionRoleDefaultPolicy176F5E4B": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "codebuild:BatchGetBuilds", - "codebuild:StartBuild", - "codebuild:StopBuild", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "EmbeddedLinuxBuildProject45760157", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineBuildCodePipelineActionRoleDefaultPolicy176F5E4B", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineDownloadsFilesystem1772812C": { - "DeletionPolicy": "Delete", - "Properties": { - "Encrypted": true, - "FileSystemTags": [ - { - "Key": "Name", - "Value": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EmbeddedLinuxPipelineDownloadsFilesystem", - }, - ], - }, - "Type": "AWS::EFS::FileSystem", - "UpdateReplacePolicy": "Delete", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsMountTarget1CA5C8C01": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsMountTarget2BC3B1054": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsMountTarget3C062C6FF": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38": { - "Properties": { - "GroupDescription": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EmbeddedLinuxPipelineDownloadsFilesystem/EfsSecurityGroup", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "Tags": [ - { - "Key": "Name", - "Value": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EmbeddedLinuxPipelineDownloadsFilesystem", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroupfromPokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992BuildProjectSecurityGroup1FC90CF5204930D27033": { - "Properties": { - "Description": "from PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992BuildProjectSecurityGroup1FC90CF5:2049", - "FromPort": 2049, - "GroupId": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - "IpProtocol": "tcp", - "SourceSecurityGroupId": { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - "ToPort": 2049, - }, - "Type": "AWS::EC2::SecurityGroupIngress", - }, - "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": "codepipeline:StartPipelineExecution", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codepipeline:eu-central-1:12341234:", - { - "Ref": "EmbeddedLinuxPipeline1DDFB4FE", - }, - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineEventsRoleF9DA96F1", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineEventsRoleF9DA96F1": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "events.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineRole1094A815": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "codepipeline.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6", - "Arn", - ], - }, - }, - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4", - "Arn", - ], - }, - }, - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineRole1094A815", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineSStateFilesystem36BA2630": { - "DeletionPolicy": "Delete", - "Properties": { - "Encrypted": true, - "FileSystemTags": [ - { - "Key": "Name", - "Value": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EmbeddedLinuxPipelineSStateFilesystem", - }, - ], - }, - "Type": "AWS::EFS::FileSystem", - "UpdateReplacePolicy": "Delete", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsMountTarget15401AFF6": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineSStateFilesystem36BA2630", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsMountTarget25BFCAE34": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineSStateFilesystem36BA2630", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsMountTarget347551AC1": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineSStateFilesystem36BA2630", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2": { - "Properties": { - "GroupDescription": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EmbeddedLinuxPipelineSStateFilesystem/EfsSecurityGroup", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "Tags": [ - { - "Key": "Name", - "Value": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EmbeddedLinuxPipelineSStateFilesystem", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroupfromPokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992BuildProjectSecurityGroup1FC90CF5204976011793": { - "Properties": { - "Description": "from PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992BuildProjectSecurityGroup1FC90CF5:2049", - "FromPort": 2049, - "GroupId": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2", - "GroupId", - ], - }, - "IpProtocol": "tcp", - "SourceSecurityGroupId": { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - "ToPort": 2049, - }, - "Type": "AWS::EC2::SecurityGroupIngress", - }, - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleDefaultPolicyE4783D85": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": [ - "codecommit:GetBranch", - "codecommit:GetCommit", - "codecommit:UploadArchive", - "codecommit:GetUploadArchiveStatus", - "codecommit:CancelUploadArchive", - "codecommit:GetRepository", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "SourceRepoSourceRepositoryC86045A8", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineSourceCodePipelineActionRoleDefaultPolicyE4783D85", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineTempFilesystem8ECAD602": { - "DeletionPolicy": "Delete", - "Properties": { - "Encrypted": true, - "FileSystemTags": [ - { - "Key": "Name", - "Value": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EmbeddedLinuxPipelineTempFilesystem", - }, - ], - }, - "Type": "AWS::EFS::FileSystem", - "UpdateReplacePolicy": "Delete", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsMountTarget1C1FB920C": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineTempFilesystem8ECAD602", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsMountTarget240F5557C": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineTempFilesystem8ECAD602", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsMountTarget31EDABBCB": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineTempFilesystem8ECAD602", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213": { - "Properties": { - "GroupDescription": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EmbeddedLinuxPipelineTempFilesystem/EfsSecurityGroup", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "Tags": [ - { - "Key": "Name", - "Value": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EmbeddedLinuxPipelineTempFilesystem", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupfromPokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992BuildProjectSecurityGroup1FC90CF520495E3C3DB5": { - "Properties": { - "Description": "from PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992BuildProjectSecurityGroup1FC90CF5:2049", - "FromPort": 2049, - "GroupId": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213", - "GroupId", - ], - }, - "IpProtocol": "tcp", - "SourceSecurityGroupId": { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - "ToPort": 2049, - }, - "Type": "AWS::EC2::SecurityGroupIngress", - }, - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A": { - "DependsOn": [ - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB", - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", - ], - "Properties": { - "Code": { - "S3Bucket": "cdk-hnb659fds-assets-12341234-eu-central-1", - "S3Key": "arbitrary-file.ext", - }, - "Handler": "index.handler", - "Role": { - "Fn::GetAtt": [ - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", - "Arn", - ], - }, - "Runtime": "nodejs20.x", - "Timeout": 900, - }, - "Type": "AWS::Lambda::Function", - }, - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB": { - "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", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "logs:PutRetentionPolicy", - "logs:DeleteRetentionPolicy", - ], - "Effect": "Allow", - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB", - "Roles": [ - { - "Ref": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "OSImageCheckOnStart0C599B99": { - "DependsOn": [ - "OSImageCheckOnStartServiceRole2D11D1E2", - ], - "Properties": { - "Code": { - "ZipFile": { - "Fn::Join": [ - "", - [ - " -import boto3 -import json - -ecr_client = boto3.client('ecr') -codepipeline_client = boto3.client('codepipeline') - -def handler(event, context): - print("Received event: " + json.dumps(event, indent=2)) - response = ecr_client.describe_images(repositoryName='", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefRepository22E53BBD9A9E013B", - }, - "', filter={'tagStatus': 'TAGGED'}) - for i in response['imageDetails']: - if 'undefined' in i['imageTags']: - break - else: - print('OS image not found. Stopping execution.') - response = codepipeline_client.stop_pipeline_execution( - pipelineName=event['detail']['pipeline'], - pipelineExecutionId=event['detail']['execution-id'], - abandon=True, - reason='OS image not found in ECR repository. Stopping pipeline until image is present.') - ", - ], - ], - }, - }, - "Handler": "index.handler", - "Role": { - "Fn::GetAtt": [ - "OSImageCheckOnStartServiceRole2D11D1E2", - "Arn", - ], - }, - "Runtime": "python3.10", - }, - "Type": "AWS::Lambda::Function", - }, - "OSImageCheckOnStartLogRetention2E659F28": { - "Properties": { - "LogGroupName": { - "Fn::Join": [ - "", - [ - "/aws/lambda/", - { - "Ref": "OSImageCheckOnStart0C599B99", - }, - ], - ], - }, - "RetentionInDays": 3653, - "ServiceToken": { - "Fn::GetAtt": [ - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", - "Arn", - ], - }, - }, - "Type": "Custom::LogRetention", - }, - "OSImageCheckOnStartServiceRole2D11D1E2": { - "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", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "OnPipelineStartRuleAllowEventRulePokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992OSImageCheckOnStartFD79EDB4E0B2CA41": { - "Properties": { - "Action": "lambda:InvokeFunction", - "FunctionName": { - "Fn::GetAtt": [ - "OSImageCheckOnStart0C599B99", - "Arn", - ], - }, - "Principal": "events.amazonaws.com", - "SourceArn": { - "Fn::GetAtt": [ - "OnPipelineStartRuleC732FFCF", - "Arn", - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "OnPipelineStartRuleC732FFCF": { - "Properties": { - "EventPattern": { - "detail": { - "execution-trigger": { - "trigger-type": [ - "CreatePipeline", - ], - }, - "state": [ - "STARTED", - ], - }, - "detail-type": [ - "CodePipeline Pipeline Execution State Change", - ], - "source": [ - "aws.codepipeline", - ], - }, - "State": "ENABLED", - "Targets": [ - { - "Arn": { - "Fn::GetAtt": [ - "OSImageCheckOnStart0C599B99", - "Arn", - ], - }, - "Id": "Target0", - }, - ], - }, - "Type": "AWS::Events::Rule", - }, - "OutputBucketEncryptionKey0E569549": { - "DeletionPolicy": "Delete", - "Properties": { - "EnableKeyRotation": true, - "KeyPolicy": { - "Statement": [ - { - "Action": "kms:*", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::KMS::Key", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifactKeyEC0C0075": { - "DeletionPolicy": "Delete", - "Properties": { - "EnableKeyRotation": true, - "KeyPolicy": { - "Statement": [ - { - "Action": "kms:*", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::KMS::Key", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifacts4A9B2621": { - "DeletionPolicy": "Delete", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "KMSMasterKeyID": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "SSEAlgorithm": "aws:kms", - }, - }, - ], - }, - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true, - }, - "Tags": [ - { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", - }, - ], - "VersioningConfiguration": { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifactsAutoDeleteObjectsCustomResourceFEF48A36": { - "DeletionPolicy": "Delete", - "DependsOn": [ - "PipelineArtifactsPolicy87787A0D", - ], - "Properties": { - "BucketName": { - "Ref": "PipelineArtifacts4A9B2621", - }, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn", - ], - }, - }, - "Type": "Custom::S3AutoDeleteObjects", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifactsPolicy87787A0D": { - "Properties": { - "Bucket": { - "Ref": "PipelineArtifacts4A9B2621", - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:PutBucketPolicy", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - ], - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "PipelineBuildLogs0533272F": { - "DeletionPolicy": "Retain", - "Properties": { - "RetentionInDays": 3653, - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - }, - "PipelineOutput78594CB5": { - "DeletionPolicy": "Delete", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "KMSMasterKeyID": { - "Fn::GetAtt": [ - "OutputBucketEncryptionKey0E569549", - "Arn", - ], - }, - "SSEAlgorithm": "aws:kms", - }, - }, - ], - }, - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - }, - "Tags": [ - { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", - }, - ], - "VersioningConfiguration": { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", - }, - "PipelineOutputAutoDeleteObjectsCustomResourceF3013510": { - "DeletionPolicy": "Delete", - "DependsOn": [ - "PipelineOutputPolicyCB4CC2E6", - ], - "Properties": { - "BucketName": { - "Ref": "PipelineOutput78594CB5", - }, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn", - ], - }, - }, - "Type": "Custom::S3AutoDeleteObjects", - "UpdateReplacePolicy": "Delete", - }, - "PipelineOutputPolicyCB4CC2E6": { - "Properties": { - "Bucket": { - "Ref": "PipelineOutput78594CB5", - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:PutBucketPolicy", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - ], - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "SourceRepoSourceRepositoryC86045A8": { - "Properties": { - "Code": { - "BranchName": "main", - "S3": { - "Bucket": "cdk-hnb659fds-assets-12341234-eu-central-1", - "Key": "arbitrary-file.ext", - }, - }, - "RepositoryName": "layer-repo-PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992", - }, - "Type": "AWS::CodeCommit::Repository", - }, - "SourceRepoSourceRepositoryPokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992EmbeddedLinuxPipeline27218C26mainEventRuleA20329DD": { - "Properties": { - "EventPattern": { - "detail": { - "event": [ - "referenceCreated", - "referenceUpdated", - ], - "referenceName": [ - "main", - ], - }, - "detail-type": [ - "CodeCommit Repository State Change", - ], - "resources": [ - { - "Fn::GetAtt": [ - "SourceRepoSourceRepositoryC86045A8", - "Arn", - ], - }, - ], - "source": [ - "aws.codecommit", - ], - }, - "State": "ENABLED", - "Targets": [ - { - "Arn": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codepipeline:eu-central-1:12341234:", - { - "Ref": "EmbeddedLinuxPipeline1DDFB4FE", - }, - ], - ], - }, - "Id": "Target0", - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineEventsRoleF9DA96F1", - "Arn", - ], - }, - }, - ], - }, - "Type": "AWS::Events::Rule", - }, - "VMImportRoleAC246CAD": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Condition": { - "StringEquals": { - "sts:ExternalId": "vmimport", - }, - }, - "Effect": "Allow", - "Principal": { - "Service": "vmie.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": [ - { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:GetBucketLocation", - "s3:GetObject", - "s3:ListBucket", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "ec2:CreateTags", - "ec2:DescribeTags", - ], - "Condition": { - "StringEquals": { - "ec2:ResourceTag/CreatedBy": [ - "aws4embeddedlinux-ci", - ], - }, - }, - "Effect": "Allow", - "Resource": "*", - }, - { - "Action": "ec2:CopySnapshot", - "Effect": "Allow", - "Resource": "arn:aws:ec2:eu-central-1::snapshot/*", - }, - { - "Action": "ec2:DescribeSnapshots", - "Effect": "Allow", - "Resource": "*", - }, - { - "Action": [ - "kms:CreateGrant", - "kms:Decrypt", - "kms:DescribeKey", - "kms:GenerateDataKeyWithoutPlaintext", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "OutputBucketEncryptionKey0E569549", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "importPolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - }, - "Rules": { - "CheckBootstrapVersion": { - "Assertions": [ - { - "Assert": { - "Fn::Not": [ - { - "Fn::Contains": [ - [ - "1", - "2", - "3", - "4", - "5", - ], - { - "Ref": "BootstrapVersion", - }, - ], - }, - ], - }, - "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", - }, - ], - }, - }, -} -`; - -exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` -{ - "Outputs": { - "BuildOutput": { - "Description": "The output bucket of this pipeline.", - "Value": { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - }, - }, - "Parameters": { - "BootstrapVersion": { - "Default": "/cdk-bootstrap/hnb659fds/version", - "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", - "Type": "AWS::SSM::Parameter::Value", - }, - }, - "Resources": { - "ArtifactAccessLoggingAutoDeleteObjectsCustomResourceD9DFD1B2": { - "DeletionPolicy": "Delete", - "DependsOn": [ - "ArtifactAccessLoggingPolicyDC97CE59", - ], - "Properties": { - "BucketName": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn", - ], - }, - }, - "Type": "Custom::S3AutoDeleteObjects", - "UpdateReplacePolicy": "Delete", - }, - "ArtifactAccessLoggingD6FCABA3": { - "DeletionPolicy": "Delete", - "Properties": { - "AccessControl": "LogDeliveryWrite", - "OwnershipControls": { - "Rules": [ - { - "ObjectOwnership": "ObjectWriter", - }, - ], - }, - "Tags": [ - { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", - }, - ], - "VersioningConfiguration": { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", - }, - "ArtifactAccessLoggingPolicyDC97CE59": { - "Properties": { - "Bucket": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, - "Resource": [ - { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:PutBucketPolicy", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - ], - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, - "Resource": [ - { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "BuildProjectSecurityGroup28D27668": { - "Properties": { - "GroupDescription": "Security Group to allow attaching EFS", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "SecurityGroupIngress": [ - { - "CidrIp": { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttBucket83908E77CidrBlockD1D303CF", - }, - "Description": "NFS Mount Port", - "FromPort": 2049, - "IpProtocol": "tcp", - "ToPort": 2049, - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "CheckOSAndStop224E880C": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": "codepipeline:StopPipelineExecution", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codepipeline:eu-central-1:12341234:", - { - "Ref": "EmbeddedLinuxPipeline1DDFB4FE", - }, - ], - ], - }, - }, - { - "Action": "ecr:DescribeImages", - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "CheckOSAndStop224E880C", - "Roles": [ - { - "Ref": "OSImageCheckOnStartServiceRole2D11D1E2", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { - "DependsOn": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - ], - "Properties": { - "Code": { - "S3Bucket": "cdk-hnb659fds-assets-12341234-eu-central-1", - "S3Key": "arbitrary-file.ext", - }, - "Description": { - "Fn::Join": [ - "", - [ - "Lambda function for auto-deleting objects in ", - { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - " S3 bucket.", - ], - ], - }, - "Handler": "index.handler", - "MemorySize": 128, - "Role": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - "Runtime": "nodejs20.x", - "Timeout": 900, - }, - "Type": "AWS::Lambda::Function", - }, - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": [ - { - "Fn::Sub": "arn:\${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxBuildProject45760157": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - ], - "Properties": { - "Artifacts": { - "Type": "CODEPIPELINE", - }, - "Cache": { - "Type": "NO_CACHE", - }, - "EncryptionKey": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "Environment": { - "ComputeType": "BUILD_GENERAL1_2XLARGE", - "EnvironmentVariables": [ - { - "Name": "IMPORT_BUCKET", - "Type": "PLAINTEXT", - "Value": { - "Ref": "PipelineOutput78594CB5", - }, - }, - { - "Name": "ROLE_NAME", - "Type": "PLAINTEXT", - "Value": { - "Ref": "VMImportRoleAC246CAD", - }, - }, - { - "Name": "SCRIPT_URL", - "Type": "PLAINTEXT", - "Value": "s3://cdk-hnb659fds-assets-12341234-eu-central-1/arbitrary-file.ext", - }, - ], - "Image": { - "Fn::Join": [ - "", - [ - { - "Fn::Select": [ - 4, - { - "Fn::Split": [ - ":", - { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", - }, - ], - }, - ], - }, - ".dkr.ecr.", - { - "Fn::Select": [ - 3, - { - "Fn::Split": [ - ":", - { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", - }, - ], - }, - ], - }, - ".", - { - "Ref": "AWS::URLSuffix", - }, - "/", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefRepository22E53BBD9A9E013B", - }, - ":latest", - ], - ], - }, - "ImagePullCredentialsType": "SERVICE_ROLE", - "PrivilegedMode": true, - "Type": "LINUX_CONTAINER", - }, - "FileSystemLocations": [ - { - "Identifier": "tmp_dir", - "Location": { - "Fn::Join": [ - "", - [ - { - "Ref": "EmbeddedLinuxPipelineTempFilesystem8ECAD602", - }, - ".efs.eu-central-1.amazonaws.com:/", - ], - ], - }, - "MountPoint": "/build-output", - "Type": "EFS", - }, - { - "Identifier": "sstate_cache", - "Location": { - "Fn::Join": [ - "", - [ - { - "Ref": "EmbeddedLinuxPipelineSStateFilesystem36BA2630", - }, - ".efs.eu-central-1.amazonaws.com:/", - ], - ], - }, - "MountPoint": "/sstate-cache", - "Type": "EFS", - }, - { - "Identifier": "dl_dir", - "Location": { - "Fn::Join": [ - "", - [ - { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - ".efs.eu-central-1.amazonaws.com:/", - ], - ], - }, - "MountPoint": "/downloads", - "Type": "EFS", - }, - ], - "LogsConfig": { - "CloudWatchLogs": { - "GroupName": { - "Ref": "PipelineBuildLogs0533272F", - }, - "Status": "ENABLED", - }, - }, - "ServiceRole": { - "Fn::GetAtt": [ - "EmbeddedLinuxBuildProjectRole4EBABAB2", - "Arn", - ], - }, - "Source": { - "BuildSpec": "build.buildspec.yml", - "Type": "CODEPIPELINE", - }, - "TimeoutInMinutes": 240, - "VpcConfig": { - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - ], - "Subnets": [ - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - }, - "Type": "AWS::CodeBuild::Project", - }, - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "ec2:CreateNetworkInterface", - "ec2:DescribeNetworkInterfaces", - "ec2:DeleteNetworkInterface", - "ec2:DescribeSubnets", - "ec2:DescribeSecurityGroups", - "ec2:DescribeDhcpOptions", - "ec2:DescribeVpcs", - ], - "Effect": "Allow", - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "Roles": [ - { - "Ref": "EmbeddedLinuxBuildProjectRole4EBABAB2", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxBuildProjectRole4EBABAB2": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "codebuild.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "ecr:BatchCheckLayerAvailability", - "ecr:GetDownloadUrlForLayer", - "ecr:BatchGetImage", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", - }, - }, - { - "Action": "ecr:GetAuthorizationToken", - "Effect": "Allow", - "Resource": "*", - }, - { - "Action": [ - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineBuildLogs0533272F", - "Arn", - ], - }, - }, - { - "Action": "ec2:CreateNetworkInterfacePermission", - "Condition": { - "StringEquals": { - "ec2:AuthorizedService": "codebuild.amazonaws.com", - "ec2:Subnet": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":subnet/", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":subnet/", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":subnet/", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - ], - ], - }, - ], - }, - }, - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":network-interface/*", - ], - ], - }, - }, - { - "Action": [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":logs:eu-central-1:12341234:log-group:/aws/codebuild/", - { - "Ref": "EmbeddedLinuxBuildProject45760157", - }, - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":logs:eu-central-1:12341234:log-group:/aws/codebuild/", - { - "Ref": "EmbeddedLinuxBuildProject45760157", - }, - ":*", - ], - ], - }, - ], - }, - { - "Action": [ - "codebuild:CreateReportGroup", - "codebuild:CreateReport", - "codebuild:UpdateReport", - "codebuild:BatchPutTestCases", - "codebuild:BatchPutCodeCoverages", - ], - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codebuild:eu-central-1:12341234:report-group/", - { - "Ref": "EmbeddedLinuxBuildProject45760157", - }, - "-*", - ], - ], - }, - }, - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "OutputBucketEncryptionKey0E569549", - "Arn", - ], - }, - }, - { - "Action": [ - "ec2:CreateImage", - "ec2:CreateTags", - "ec2:DescribeImages", - "ec2:DescribeSnapshots", - "ec2:DescribeImportSnapshotTasks", - "ec2:DescribeTags", - "ec2:CancelImportTask", - ], - "Effect": "Allow", - "Resource": "*", - }, - { - "Action": "ec2:ImportSnapshot", - "Effect": "Allow", - "Resource": [ - "arn:aws:ec2:eu-central-1:12341234:import-snapshot-task/*", - "arn:aws:ec2:eu-central-1::snapshot/*", - ], - }, - { - "Action": [ - "s3:GetObject", - "s3:ListBucket", - "s3:PutObject", - "s3:PutObjectTagging", - "s3:AbortMultipartUpload", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "ec2:RegisterImage", - "ec2:DeregisterImage", - "ec2:CreateStoreImageTask", - ], - "Effect": "Allow", - "Resource": [ - "arn:aws:ec2:eu-central-1::image/*", - "arn:aws:ec2:eu-central-1::snapshot/snap-*", - ], - }, - { - "Action": [ - "ebs:CompleteSnapshot", - "ebs:GetSnapshotBlock", - "ebs:ListChangedBlocks", - "ebs:ListSnapshotBlocks", - "ebs:PutSnapshotBlock", - ], - "Effect": "Allow", - "Resource": "arn:aws:ec2:eu-central-1::snapshot/*", - }, - { - "Action": [ - "ec2:DescribeStoreImageTasks", - "ec2:GetEbsEncryptionByDefault", - ], - "Effect": "Allow", - "Resource": "*", - }, - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":s3:::cdk-hnb659fds-assets-12341234-eu-central-1", - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":s3:::cdk-hnb659fds-assets-12341234-eu-central-1/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": [ - "kms:Decrypt", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": "codecommit:GitPull", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "SourceRepoSourceRepositoryC86045A8", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "Roles": [ - { - "Ref": "EmbeddedLinuxBuildProjectRole4EBABAB2", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipeline1DDFB4FE": { - "DependsOn": [ - "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9", - "EmbeddedLinuxPipelineRole1094A815", - ], - "Properties": { - "ArtifactStore": { - "EncryptionKey": { - "Id": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "Type": "KMS", - }, - "Location": { - "Ref": "PipelineArtifacts4A9B2621", - }, - "Type": "S3", - }, - "PipelineType": "V1", - "RestartExecutionOnUpdate": true, - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineRole1094A815", - "Arn", - ], - }, - "Stages": [ - { - "Actions": [ - { - "ActionTypeId": { - "Category": "Source", - "Owner": "AWS", - "Provider": "CodeCommit", - "Version": "1", - }, - "Configuration": { - "BranchName": "main", - "OutputArtifactFormat": "CODEBUILD_CLONE_REF", - "PollForSourceChanges": false, - "RepositoryName": { - "Fn::GetAtt": [ - "SourceRepoSourceRepositoryC86045A8", - "Name", - ], - }, - }, - "Name": "Source", - "OutputArtifacts": [ - { - "Name": "Artifact_Source_Source", - }, - ], - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6", - "Arn", - ], - }, - "RunOrder": 1, - }, - ], - "Name": "Source", - }, - { - "Actions": [ - { - "ActionTypeId": { - "Category": "Build", - "Owner": "AWS", - "Provider": "CodeBuild", - "Version": "1", - }, - "Configuration": { - "ProjectName": { - "Ref": "EmbeddedLinuxBuildProject45760157", - }, - }, - "InputArtifacts": [ - { - "Name": "Artifact_Source_Source", - }, - ], - "Name": "Build", - "OutputArtifacts": [ - { - "Name": "Artifact_Build_Build", - }, - ], - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4", - "Arn", - ], - }, - "RunOrder": 1, - }, - ], - "Name": "Build", - }, - { - "Actions": [ - { - "ActionTypeId": { - "Category": "Deploy", - "Owner": "AWS", - "Provider": "S3", - "Version": "1", - }, - "Configuration": { - "BucketName": { - "Ref": "PipelineOutput78594CB5", - }, - "Extract": "true", - }, - "InputArtifacts": [ - { - "Name": "Artifact_Build_Build", - }, - ], - "Name": "Artifact", - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750", - "Arn", - ], - }, - "RunOrder": 1, - }, - ], - "Name": "Artifact", - }, - ], - }, - "Type": "AWS::CodePipeline::Pipeline", - }, - "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineArtifactCodePipelineActionRoleDefaultPolicyD75CCCBC": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - "kms:Decrypt", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "OutputBucketEncryptionKey0E569549", - "Arn", - ], - }, - }, - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineArtifactCodePipelineActionRoleDefaultPolicyD75CCCBC", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineBuildCodePipelineActionRoleDefaultPolicy176F5E4B": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "codebuild:BatchGetBuilds", - "codebuild:StartBuild", - "codebuild:StopBuild", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "EmbeddedLinuxBuildProject45760157", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineBuildCodePipelineActionRoleDefaultPolicy176F5E4B", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineDownloadsFilesystem1772812C": { - "DeletionPolicy": "Delete", - "Properties": { - "Encrypted": true, - "FileSystemTags": [ - { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineDownloadsFilesystem", - }, - ], - }, - "Type": "AWS::EFS::FileSystem", - "UpdateReplacePolicy": "Delete", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsMountTarget1CA5C8C01": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsMountTarget2BC3B1054": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsMountTarget3C062C6FF": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38": { - "Properties": { - "GroupDescription": "MyTestStack/EmbeddedLinuxPipelineDownloadsFilesystem/EfsSecurityGroup", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "Tags": [ - { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineDownloadsFilesystem", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroupfromMyTestStackBuildProjectSecurityGroupA374A3A920495E2D9CF2": { - "Properties": { - "Description": "from MyTestStackBuildProjectSecurityGroupA374A3A9:2049", - "FromPort": 2049, - "GroupId": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - "IpProtocol": "tcp", - "SourceSecurityGroupId": { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - "ToPort": 2049, - }, - "Type": "AWS::EC2::SecurityGroupIngress", - }, - "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": "codepipeline:StartPipelineExecution", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codepipeline:eu-central-1:12341234:", - { - "Ref": "EmbeddedLinuxPipeline1DDFB4FE", - }, - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineEventsRoleF9DA96F1", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineEventsRoleF9DA96F1": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "events.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineRole1094A815": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "codepipeline.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6", - "Arn", - ], - }, - }, - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4", - "Arn", - ], - }, - }, - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineRole1094A815", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineSStateFilesystem36BA2630": { - "DeletionPolicy": "Delete", - "Properties": { - "Encrypted": true, - "FileSystemTags": [ - { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineSStateFilesystem", - }, - ], - }, - "Type": "AWS::EFS::FileSystem", - "UpdateReplacePolicy": "Delete", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsMountTarget15401AFF6": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineSStateFilesystem36BA2630", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsMountTarget25BFCAE34": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineSStateFilesystem36BA2630", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsMountTarget347551AC1": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineSStateFilesystem36BA2630", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2": { - "Properties": { - "GroupDescription": "MyTestStack/EmbeddedLinuxPipelineSStateFilesystem/EfsSecurityGroup", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "Tags": [ - { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineSStateFilesystem", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroupfromMyTestStackBuildProjectSecurityGroupA374A3A92049D2B7AC43": { - "Properties": { - "Description": "from MyTestStackBuildProjectSecurityGroupA374A3A9:2049", - "FromPort": 2049, - "GroupId": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2", - "GroupId", - ], - }, - "IpProtocol": "tcp", - "SourceSecurityGroupId": { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - "ToPort": 2049, - }, - "Type": "AWS::EC2::SecurityGroupIngress", - }, - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleDefaultPolicyE4783D85": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": [ - "codecommit:GetBranch", - "codecommit:GetCommit", - "codecommit:UploadArchive", - "codecommit:GetUploadArchiveStatus", - "codecommit:CancelUploadArchive", - "codecommit:GetRepository", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "SourceRepoSourceRepositoryC86045A8", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineSourceCodePipelineActionRoleDefaultPolicyE4783D85", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineTempFilesystem8ECAD602": { - "DeletionPolicy": "Delete", - "Properties": { - "Encrypted": true, - "FileSystemTags": [ - { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineTempFilesystem", - }, - ], - }, - "Type": "AWS::EFS::FileSystem", - "UpdateReplacePolicy": "Delete", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsMountTarget1C1FB920C": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineTempFilesystem8ECAD602", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsMountTarget240F5557C": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineTempFilesystem8ECAD602", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsMountTarget31EDABBCB": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineTempFilesystem8ECAD602", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213": { - "Properties": { - "GroupDescription": "MyTestStack/EmbeddedLinuxPipelineTempFilesystem/EfsSecurityGroup", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "Tags": [ - { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineTempFilesystem", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupfromMyTestStackBuildProjectSecurityGroupA374A3A9204979E58A91": { - "Properties": { - "Description": "from MyTestStackBuildProjectSecurityGroupA374A3A9:2049", - "FromPort": 2049, - "GroupId": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213", - "GroupId", - ], - }, - "IpProtocol": "tcp", - "SourceSecurityGroupId": { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - "ToPort": 2049, - }, - "Type": "AWS::EC2::SecurityGroupIngress", - }, - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A": { - "DependsOn": [ - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB", - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", - ], - "Properties": { - "Code": { - "S3Bucket": "cdk-hnb659fds-assets-12341234-eu-central-1", - "S3Key": "arbitrary-file.ext", - }, - "Handler": "index.handler", - "Role": { - "Fn::GetAtt": [ - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", - "Arn", - ], - }, - "Runtime": "nodejs20.x", - "Timeout": 900, - }, - "Type": "AWS::Lambda::Function", - }, - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB": { - "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", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "logs:PutRetentionPolicy", - "logs:DeleteRetentionPolicy", - ], - "Effect": "Allow", - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB", - "Roles": [ - { - "Ref": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "OSImageCheckOnStart0C599B99": { - "DependsOn": [ - "OSImageCheckOnStartServiceRole2D11D1E2", - ], - "Properties": { - "Code": { - "ZipFile": { - "Fn::Join": [ - "", - [ - " -import boto3 -import json - -ecr_client = boto3.client('ecr') -codepipeline_client = boto3.client('codepipeline') - -def handler(event, context): - print("Received event: " + json.dumps(event, indent=2)) - response = ecr_client.describe_images(repositoryName='", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefRepository22E53BBD9A9E013B", - }, - "', filter={'tagStatus': 'TAGGED'}) - for i in response['imageDetails']: - if 'undefined' in i['imageTags']: - break - else: - print('OS image not found. Stopping execution.') - response = codepipeline_client.stop_pipeline_execution( - pipelineName=event['detail']['pipeline'], - pipelineExecutionId=event['detail']['execution-id'], - abandon=True, - reason='OS image not found in ECR repository. Stopping pipeline until image is present.') - ", - ], - ], - }, - }, - "Handler": "index.handler", - "Role": { - "Fn::GetAtt": [ - "OSImageCheckOnStartServiceRole2D11D1E2", - "Arn", - ], - }, - "Runtime": "python3.10", - }, - "Type": "AWS::Lambda::Function", - }, - "OSImageCheckOnStartLogRetention2E659F28": { - "Properties": { - "LogGroupName": { - "Fn::Join": [ - "", - [ - "/aws/lambda/", - { - "Ref": "OSImageCheckOnStart0C599B99", - }, - ], - ], - }, - "RetentionInDays": 3653, - "ServiceToken": { - "Fn::GetAtt": [ - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", - "Arn", - ], - }, - }, - "Type": "Custom::LogRetention", - }, - "OSImageCheckOnStartServiceRole2D11D1E2": { - "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", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "OnPipelineStartRuleAllowEventRuleMyTestStackOSImageCheckOnStart16BFD20B7F872FCA": { - "Properties": { - "Action": "lambda:InvokeFunction", - "FunctionName": { - "Fn::GetAtt": [ - "OSImageCheckOnStart0C599B99", - "Arn", - ], - }, - "Principal": "events.amazonaws.com", - "SourceArn": { - "Fn::GetAtt": [ - "OnPipelineStartRuleC732FFCF", - "Arn", - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "OnPipelineStartRuleC732FFCF": { - "Properties": { - "EventPattern": { - "detail": { - "execution-trigger": { - "trigger-type": [ - "CreatePipeline", - ], - }, - "state": [ - "STARTED", - ], - }, - "detail-type": [ - "CodePipeline Pipeline Execution State Change", - ], - "source": [ - "aws.codepipeline", - ], - }, - "State": "ENABLED", - "Targets": [ - { - "Arn": { - "Fn::GetAtt": [ - "OSImageCheckOnStart0C599B99", - "Arn", - ], - }, - "Id": "Target0", - }, - ], - }, - "Type": "AWS::Events::Rule", - }, - "OutputBucketEncryptionKey0E569549": { - "DeletionPolicy": "Delete", - "Properties": { - "EnableKeyRotation": true, - "KeyPolicy": { - "Statement": [ - { - "Action": "kms:*", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::KMS::Key", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifactKeyEC0C0075": { - "DeletionPolicy": "Delete", - "Properties": { - "EnableKeyRotation": true, - "KeyPolicy": { - "Statement": [ - { - "Action": "kms:*", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::KMS::Key", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifacts4A9B2621": { - "DeletionPolicy": "Delete", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "KMSMasterKeyID": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "SSEAlgorithm": "aws:kms", - }, - }, - ], - }, - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true, - }, - "Tags": [ - { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", - }, - ], - "VersioningConfiguration": { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifactsAutoDeleteObjectsCustomResourceFEF48A36": { - "DeletionPolicy": "Delete", - "DependsOn": [ - "PipelineArtifactsPolicy87787A0D", - ], - "Properties": { - "BucketName": { - "Ref": "PipelineArtifacts4A9B2621", - }, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn", - ], - }, - }, - "Type": "Custom::S3AutoDeleteObjects", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifactsPolicy87787A0D": { - "Properties": { - "Bucket": { - "Ref": "PipelineArtifacts4A9B2621", - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:PutBucketPolicy", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - ], - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "PipelineBuildLogs0533272F": { - "DeletionPolicy": "Retain", - "Properties": { - "RetentionInDays": 3653, - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - }, - "PipelineOutput78594CB5": { - "DeletionPolicy": "Delete", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "KMSMasterKeyID": { - "Fn::GetAtt": [ - "OutputBucketEncryptionKey0E569549", - "Arn", - ], - }, - "SSEAlgorithm": "aws:kms", - }, - }, - ], - }, - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - }, - "Tags": [ - { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", - }, - ], - "VersioningConfiguration": { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", - }, - "PipelineOutputAutoDeleteObjectsCustomResourceF3013510": { - "DeletionPolicy": "Delete", - "DependsOn": [ - "PipelineOutputPolicyCB4CC2E6", - ], - "Properties": { - "BucketName": { - "Ref": "PipelineOutput78594CB5", - }, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn", - ], - }, - }, - "Type": "Custom::S3AutoDeleteObjects", - "UpdateReplacePolicy": "Delete", - }, - "PipelineOutputPolicyCB4CC2E6": { - "Properties": { - "Bucket": { - "Ref": "PipelineOutput78594CB5", - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:PutBucketPolicy", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - ], - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "SourceRepoSourceRepositoryC86045A8": { - "Properties": { - "Code": { - "BranchName": "main", - "S3": { - "Bucket": "cdk-hnb659fds-assets-12341234-eu-central-1", - "Key": "arbitrary-file.ext", - }, - }, - "RepositoryName": "layer-repo-MyTestStack", - }, - "Type": "AWS::CodeCommit::Repository", - }, - "SourceRepoSourceRepositoryMyTestStackEmbeddedLinuxPipeline3F66E11BmainEventRule5C93E610": { - "Properties": { - "EventPattern": { - "detail": { - "event": [ - "referenceCreated", - "referenceUpdated", - ], - "referenceName": [ - "main", - ], - }, - "detail-type": [ - "CodeCommit Repository State Change", - ], - "resources": [ - { - "Fn::GetAtt": [ - "SourceRepoSourceRepositoryC86045A8", - "Arn", - ], - }, - ], - "source": [ - "aws.codecommit", - ], - }, - "State": "ENABLED", - "Targets": [ - { - "Arn": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codepipeline:eu-central-1:12341234:", - { - "Ref": "EmbeddedLinuxPipeline1DDFB4FE", - }, - ], - ], - }, - "Id": "Target0", - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineEventsRoleF9DA96F1", - "Arn", - ], - }, - }, - ], - }, - "Type": "AWS::Events::Rule", - }, - "VMImportRoleAC246CAD": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Condition": { - "StringEquals": { - "sts:ExternalId": "vmimport", - }, - }, - "Effect": "Allow", - "Principal": { - "Service": "vmie.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Policies": [ - { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:GetBucketLocation", - "s3:GetObject", - "s3:ListBucket", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "ec2:CreateTags", - "ec2:DescribeTags", - ], - "Condition": { - "StringEquals": { - "ec2:ResourceTag/CreatedBy": [ - "aws4embeddedlinux-ci", - ], - }, - }, - "Effect": "Allow", - "Resource": "*", - }, - { - "Action": "ec2:CopySnapshot", - "Effect": "Allow", - "Resource": "arn:aws:ec2:eu-central-1::snapshot/*", - }, - { - "Action": "ec2:DescribeSnapshots", - "Effect": "Allow", - "Resource": "*", - }, - { - "Action": [ - "kms:CreateGrant", - "kms:Decrypt", - "kms:DescribeKey", - "kms:GenerateDataKeyWithoutPlaintext", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "OutputBucketEncryptionKey0E569549", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "importPolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - }, - "Rules": { - "CheckBootstrapVersion": { - "Assertions": [ - { - "Assert": { - "Fn::Not": [ - { - "Fn::Contains": [ - [ - "1", - "2", - "3", - "4", - "5", - ], - { - "Ref": "BootstrapVersion", - }, - ], - }, - ], - }, - "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", - }, - ], - }, - }, -} -`; - -exports[`Pipeline Snapshot Poky Pipeline 1`] = ` -{ - "Outputs": { - "BuildOutput": { - "Description": "The output bucket of this pipeline.", - "Value": { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - }, - }, - "Parameters": { - "BootstrapVersion": { - "Default": "/cdk-bootstrap/hnb659fds/version", - "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", - "Type": "AWS::SSM::Parameter::Value", - }, - }, - "Resources": { - "ArtifactAccessLoggingAutoDeleteObjectsCustomResourceD9DFD1B2": { - "DeletionPolicy": "Delete", - "DependsOn": [ - "ArtifactAccessLoggingPolicyDC97CE59", - ], - "Properties": { - "BucketName": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn", - ], - }, - }, - "Type": "Custom::S3AutoDeleteObjects", - "UpdateReplacePolicy": "Delete", - }, - "ArtifactAccessLoggingD6FCABA3": { - "DeletionPolicy": "Delete", - "Properties": { - "AccessControl": "LogDeliveryWrite", - "OwnershipControls": { - "Rules": [ - { - "ObjectOwnership": "ObjectWriter", - }, - ], - }, - "Tags": [ - { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", - }, - ], - "VersioningConfiguration": { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", - }, - "ArtifactAccessLoggingPolicyDC97CE59": { - "Properties": { - "Bucket": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, - "Resource": [ - { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:PutBucketPolicy", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - ], - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, - "Resource": [ - { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "ArtifactAccessLoggingD6FCABA3", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "BuildProjectSecurityGroup28D27668": { - "Properties": { - "GroupDescription": "Security Group to allow attaching EFS", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "SecurityGroupIngress": [ - { - "CidrIp": { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttBucket83908E77CidrBlockD1D303CF", - }, - "Description": "NFS Mount Port", - "FromPort": 2049, - "IpProtocol": "tcp", - "ToPort": 2049, - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "CheckOSAndStop224E880C": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": "codepipeline:StopPipelineExecution", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codepipeline:eu-central-1:12341234:", - { - "Ref": "EmbeddedLinuxPipeline1DDFB4FE", - }, - ], - ], - }, - }, - { - "Action": "ecr:DescribeImages", - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "CheckOSAndStop224E880C", - "Roles": [ - { - "Ref": "OSImageCheckOnStartServiceRole2D11D1E2", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F": { - "DependsOn": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - ], - "Properties": { - "Code": { - "S3Bucket": "cdk-hnb659fds-assets-12341234-eu-central-1", - "S3Key": "faa95a81ae7d7373f3e1f242268f904eb748d8d0fdd306e8a6fe515a1905a7d6.zip", - }, - "Description": { - "Fn::Join": [ - "", - [ - "Lambda function for auto-deleting objects in ", - { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - " S3 bucket.", - ], - ], - }, - "Handler": "index.handler", - "MemorySize": 128, - "Role": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - "Runtime": "nodejs20.x", - "Timeout": 900, - }, - "Type": "AWS::Lambda::Function", - }, - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "lambda.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "ManagedPolicyArns": [ - { - "Fn::Sub": "arn:\${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxBuildProject45760157": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - ], - "Properties": { - "Artifacts": { - "Type": "CODEPIPELINE", - }, - "Cache": { - "Type": "NO_CACHE", - }, - "EncryptionKey": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "Environment": { - "ComputeType": "BUILD_GENERAL1_2XLARGE", - "Image": { - "Fn::Join": [ - "", - [ - { - "Fn::Select": [ - 4, - { - "Fn::Split": [ - ":", - { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", - }, - ], - }, - ], - }, - ".dkr.ecr.", - { - "Fn::Select": [ - 3, - { - "Fn::Split": [ - ":", - { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", - }, - ], - }, - ], - }, - ".", - { - "Ref": "AWS::URLSuffix", - }, - "/", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefRepository22E53BBD9A9E013B", - }, - ":latest", - ], - ], - }, - "ImagePullCredentialsType": "SERVICE_ROLE", - "PrivilegedMode": true, - "Type": "LINUX_CONTAINER", - }, - "FileSystemLocations": [ - { - "Identifier": "tmp_dir", - "Location": { - "Fn::Join": [ - "", - [ - { - "Ref": "EmbeddedLinuxPipelineTempFilesystem8ECAD602", - }, - ".efs.eu-central-1.amazonaws.com:/", - ], - ], - }, - "MountPoint": "/build-output", - "Type": "EFS", - }, - { - "Identifier": "sstate_cache", - "Location": { - "Fn::Join": [ - "", - [ - { - "Ref": "EmbeddedLinuxPipelineSStateFilesystem36BA2630", - }, - ".efs.eu-central-1.amazonaws.com:/", - ], - ], - }, - "MountPoint": "/sstate-cache", - "Type": "EFS", - }, - { - "Identifier": "dl_dir", - "Location": { - "Fn::Join": [ - "", - [ - { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - ".efs.eu-central-1.amazonaws.com:/", - ], - ], - }, - "MountPoint": "/downloads", - "Type": "EFS", - }, - ], - "LogsConfig": { - "CloudWatchLogs": { - "GroupName": { - "Ref": "PipelineBuildLogs0533272F", - }, - "Status": "ENABLED", - }, - }, - "ServiceRole": { - "Fn::GetAtt": [ - "EmbeddedLinuxBuildProjectRole4EBABAB2", - "Arn", - ], - }, - "Source": { - "BuildSpec": "build.buildspec.yml", - "Type": "CODEPIPELINE", - }, - "TimeoutInMinutes": 240, - "VpcConfig": { - "SecurityGroupIds": [ - { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - ], - "Subnets": [ - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - }, - "Type": "AWS::CodeBuild::Project", - }, - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "ec2:CreateNetworkInterface", - "ec2:DescribeNetworkInterfaces", - "ec2:DeleteNetworkInterface", - "ec2:DescribeSubnets", - "ec2:DescribeSecurityGroups", - "ec2:DescribeDhcpOptions", - "ec2:DescribeVpcs", - ], - "Effect": "Allow", - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "Roles": [ - { - "Ref": "EmbeddedLinuxBuildProjectRole4EBABAB2", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxBuildProjectRole4EBABAB2": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "codebuild.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "ecr:BatchCheckLayerAvailability", - "ecr:GetDownloadUrlForLayer", - "ecr:BatchGetImage", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", - }, - }, - { - "Action": "ecr:GetAuthorizationToken", - "Effect": "Allow", - "Resource": "*", - }, - { - "Action": [ - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineBuildLogs0533272F", - "Arn", - ], - }, - }, - { - "Action": "ec2:CreateNetworkInterfacePermission", - "Condition": { - "StringEquals": { - "ec2:AuthorizedService": "codebuild.amazonaws.com", - "ec2:Subnet": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":subnet/", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":subnet/", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":subnet/", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - ], - ], - }, - ], - }, - }, - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":network-interface/*", - ], - ], - }, - }, - { - "Action": [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":logs:eu-central-1:12341234:log-group:/aws/codebuild/", - { - "Ref": "EmbeddedLinuxBuildProject45760157", - }, - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":logs:eu-central-1:12341234:log-group:/aws/codebuild/", - { - "Ref": "EmbeddedLinuxBuildProject45760157", - }, - ":*", - ], - ], - }, - ], - }, - { - "Action": [ - "codebuild:CreateReportGroup", - "codebuild:CreateReport", - "codebuild:UpdateReport", - "codebuild:BatchPutTestCases", - "codebuild:BatchPutCodeCoverages", - ], - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codebuild:eu-central-1:12341234:report-group/", - { - "Ref": "EmbeddedLinuxBuildProject45760157", - }, - "-*", - ], - ], - }, - }, - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": [ - "kms:Decrypt", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": "codecommit:GitPull", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "SourceRepoSourceRepositoryC86045A8", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "Roles": [ - { - "Ref": "EmbeddedLinuxBuildProjectRole4EBABAB2", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipeline1DDFB4FE": { - "DependsOn": [ - "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9", - "EmbeddedLinuxPipelineRole1094A815", - ], - "Properties": { - "ArtifactStore": { - "EncryptionKey": { - "Id": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "Type": "KMS", - }, - "Location": { - "Ref": "PipelineArtifacts4A9B2621", - }, - "Type": "S3", - }, - "PipelineType": "V1", - "RestartExecutionOnUpdate": true, - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineRole1094A815", - "Arn", - ], - }, - "Stages": [ - { - "Actions": [ - { - "ActionTypeId": { - "Category": "Source", - "Owner": "AWS", - "Provider": "CodeCommit", - "Version": "1", - }, - "Configuration": { - "BranchName": "main", - "OutputArtifactFormat": "CODEBUILD_CLONE_REF", - "PollForSourceChanges": false, - "RepositoryName": { - "Fn::GetAtt": [ - "SourceRepoSourceRepositoryC86045A8", - "Name", - ], - }, - }, - "Name": "Source", - "OutputArtifacts": [ - { - "Name": "Artifact_Source_Source", - }, - ], - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6", - "Arn", - ], - }, - "RunOrder": 1, - }, - ], - "Name": "Source", - }, - { - "Actions": [ - { - "ActionTypeId": { - "Category": "Build", - "Owner": "AWS", - "Provider": "CodeBuild", - "Version": "1", - }, - "Configuration": { - "ProjectName": { - "Ref": "EmbeddedLinuxBuildProject45760157", - }, - }, - "InputArtifacts": [ - { - "Name": "Artifact_Source_Source", - }, - ], - "Name": "Build", - "OutputArtifacts": [ - { - "Name": "Artifact_Build_Build", - }, - ], - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4", - "Arn", - ], - }, - "RunOrder": 1, - }, - ], - "Name": "Build", - }, - { - "Actions": [ - { - "ActionTypeId": { - "Category": "Deploy", - "Owner": "AWS", - "Provider": "S3", - "Version": "1", - }, - "Configuration": { - "BucketName": { - "Ref": "PipelineOutput78594CB5", - }, - "Extract": "true", - }, - "InputArtifacts": [ - { - "Name": "Artifact_Build_Build", - }, - ], - "Name": "Artifact", - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750", - "Arn", - ], - }, - "RunOrder": 1, - }, - ], - "Name": "Artifact", - }, - ], - }, - "Type": "AWS::CodePipeline::Pipeline", - }, - "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineArtifactCodePipelineActionRoleDefaultPolicyD75CCCBC": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineArtifactCodePipelineActionRoleDefaultPolicyD75CCCBC", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineBuildCodePipelineActionRoleDefaultPolicy176F5E4B": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "codebuild:BatchGetBuilds", - "codebuild:StartBuild", - "codebuild:StopBuild", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "EmbeddedLinuxBuildProject45760157", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineBuildCodePipelineActionRoleDefaultPolicy176F5E4B", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineDownloadsFilesystem1772812C": { - "DeletionPolicy": "Delete", - "Properties": { - "Encrypted": true, - "FileSystemTags": [ - { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineDownloadsFilesystem", - }, - ], - }, - "Type": "AWS::EFS::FileSystem", - "UpdateReplacePolicy": "Delete", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsMountTarget1CA5C8C01": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsMountTarget2BC3B1054": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsMountTarget3C062C6FF": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38": { - "Properties": { - "GroupDescription": "MyTestStack/EmbeddedLinuxPipelineDownloadsFilesystem/EfsSecurityGroup", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "Tags": [ - { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineDownloadsFilesystem", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroupfromMyTestStackBuildProjectSecurityGroupA374A3A920495E2D9CF2": { - "Properties": { - "Description": "from MyTestStackBuildProjectSecurityGroupA374A3A9:2049", - "FromPort": 2049, - "GroupId": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - "IpProtocol": "tcp", - "SourceSecurityGroupId": { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - "ToPort": 2049, - }, - "Type": "AWS::EC2::SecurityGroupIngress", - }, - "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": "codepipeline:StartPipelineExecution", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codepipeline:eu-central-1:12341234:", - { - "Ref": "EmbeddedLinuxPipeline1DDFB4FE", - }, - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineEventsRoleF9DA96F1", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineEventsRoleF9DA96F1": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "events.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineRole1094A815": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "codepipeline.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6", - "Arn", - ], - }, - }, - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4", - "Arn", - ], - }, - }, - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineRole1094A815", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineSStateFilesystem36BA2630": { - "DeletionPolicy": "Delete", - "Properties": { - "Encrypted": true, - "FileSystemTags": [ - { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineSStateFilesystem", - }, - ], - }, - "Type": "AWS::EFS::FileSystem", - "UpdateReplacePolicy": "Delete", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsMountTarget15401AFF6": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineSStateFilesystem36BA2630", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsMountTarget25BFCAE34": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineSStateFilesystem36BA2630", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsMountTarget347551AC1": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineSStateFilesystem36BA2630", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2": { - "Properties": { - "GroupDescription": "MyTestStack/EmbeddedLinuxPipelineSStateFilesystem/EfsSecurityGroup", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "Tags": [ - { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineSStateFilesystem", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroupfromMyTestStackBuildProjectSecurityGroupA374A3A92049D2B7AC43": { - "Properties": { - "Description": "from MyTestStackBuildProjectSecurityGroupA374A3A9:2049", - "FromPort": 2049, - "GroupId": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineSStateFilesystemEfsSecurityGroup4099B7F2", - "GroupId", - ], - }, - "IpProtocol": "tcp", - "SourceSecurityGroupId": { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - "ToPort": 2049, - }, - "Type": "AWS::EC2::SecurityGroupIngress", - }, - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleDefaultPolicyE4783D85": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - "s3:PutObject", - "s3:PutObjectLegalHold", - "s3:PutObjectRetention", - "s3:PutObjectTagging", - "s3:PutObjectVersionTagging", - "s3:Abort*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - { - "Action": [ - "codecommit:GetBranch", - "codecommit:GetCommit", - "codecommit:UploadArchive", - "codecommit:GetUploadArchiveStatus", - "codecommit:CancelUploadArchive", - "codecommit:GetRepository", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "SourceRepoSourceRepositoryC86045A8", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "EmbeddedLinuxPipelineSourceCodePipelineActionRoleDefaultPolicyE4783D85", - "Roles": [ - { - "Ref": "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineTempFilesystem8ECAD602": { - "DeletionPolicy": "Delete", - "Properties": { - "Encrypted": true, - "FileSystemTags": [ - { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineTempFilesystem", - }, - ], - }, - "Type": "AWS::EFS::FileSystem", - "UpdateReplacePolicy": "Delete", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsMountTarget1C1FB920C": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineTempFilesystem8ECAD602", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsMountTarget240F5557C": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineTempFilesystem8ECAD602", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsMountTarget31EDABBCB": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineTempFilesystem8ECAD602", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213": { - "Properties": { - "GroupDescription": "MyTestStack/EmbeddedLinuxPipelineTempFilesystem/EfsSecurityGroup", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "Tags": [ - { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineTempFilesystem", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupfromMyTestStackBuildProjectSecurityGroupA374A3A9204979E58A91": { - "Properties": { - "Description": "from MyTestStackBuildProjectSecurityGroupA374A3A9:2049", - "FromPort": 2049, - "GroupId": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213", - "GroupId", - ], - }, - "IpProtocol": "tcp", - "SourceSecurityGroupId": { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - "ToPort": 2049, - }, - "Type": "AWS::EC2::SecurityGroupIngress", - }, - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A": { - "DependsOn": [ - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB", - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", - ], - "Properties": { - "Code": { - "S3Bucket": "cdk-hnb659fds-assets-12341234-eu-central-1", - "S3Key": "2819175352ad1ce0dae768e83fc328fb70fb5f10b4a8ff0ccbcb791f02b0716d.zip", - }, - "Handler": "index.handler", - "Role": { - "Fn::GetAtt": [ - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", - "Arn", - ], - }, - "Runtime": "nodejs20.x", - "Timeout": 900, - }, - "Type": "AWS::Lambda::Function", - }, - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB": { - "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", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "logs:PutRetentionPolicy", - "logs:DeleteRetentionPolicy", - ], - "Effect": "Allow", - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB", - "Roles": [ - { - "Ref": "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRole9741ECFB", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "OSImageCheckOnStart0C599B99": { - "DependsOn": [ - "OSImageCheckOnStartServiceRole2D11D1E2", - ], - "Properties": { - "Code": { - "ZipFile": { - "Fn::Join": [ - "", - [ - " -import boto3 -import json - -ecr_client = boto3.client('ecr') -codepipeline_client = boto3.client('codepipeline') - -def handler(event, context): - print("Received event: " + json.dumps(event, indent=2)) - response = ecr_client.describe_images(repositoryName='", - { - "Fn::ImportValue": "RepoStack:ExportsOutputRefRepository22E53BBD9A9E013B", - }, - "', filter={'tagStatus': 'TAGGED'}) - for i in response['imageDetails']: - if 'undefined' in i['imageTags']: - break - else: - print('OS image not found. Stopping execution.') - response = codepipeline_client.stop_pipeline_execution( - pipelineName=event['detail']['pipeline'], - pipelineExecutionId=event['detail']['execution-id'], - abandon=True, - reason='OS image not found in ECR repository. Stopping pipeline until image is present.') - ", - ], - ], - }, - }, - "Handler": "index.handler", - "Role": { - "Fn::GetAtt": [ - "OSImageCheckOnStartServiceRole2D11D1E2", - "Arn", - ], - }, - "Runtime": "python3.10", - }, - "Type": "AWS::Lambda::Function", - }, - "OSImageCheckOnStartLogRetention2E659F28": { - "Properties": { - "LogGroupName": { - "Fn::Join": [ - "", - [ - "/aws/lambda/", - { - "Ref": "OSImageCheckOnStart0C599B99", - }, - ], - ], - }, - "RetentionInDays": 3653, - "ServiceToken": { - "Fn::GetAtt": [ - "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", - "Arn", - ], - }, - }, - "Type": "Custom::LogRetention", - }, - "OSImageCheckOnStartServiceRole2D11D1E2": { - "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", - ], - ], - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - "OnPipelineStartRuleAllowEventRuleMyTestStackOSImageCheckOnStart16BFD20B7F872FCA": { - "Properties": { - "Action": "lambda:InvokeFunction", - "FunctionName": { - "Fn::GetAtt": [ - "OSImageCheckOnStart0C599B99", - "Arn", - ], - }, - "Principal": "events.amazonaws.com", - "SourceArn": { - "Fn::GetAtt": [ - "OnPipelineStartRuleC732FFCF", - "Arn", - ], - }, - }, - "Type": "AWS::Lambda::Permission", - }, - "OnPipelineStartRuleC732FFCF": { - "Properties": { - "EventPattern": { - "detail": { - "execution-trigger": { - "trigger-type": [ - "CreatePipeline", - ], - }, - "state": [ - "STARTED", - ], - }, - "detail-type": [ - "CodePipeline Pipeline Execution State Change", - ], - "source": [ - "aws.codepipeline", - ], - }, - "State": "ENABLED", - "Targets": [ - { - "Arn": { - "Fn::GetAtt": [ - "OSImageCheckOnStart0C599B99", - "Arn", - ], - }, - "Id": "Target0", - }, - ], - }, - "Type": "AWS::Events::Rule", - }, - "PipelineArtifactKeyEC0C0075": { - "DeletionPolicy": "Delete", - "Properties": { - "EnableKeyRotation": true, - "KeyPolicy": { - "Statement": [ - { - "Action": "kms:*", - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::12341234:root", - ], - ], - }, - }, - "Resource": "*", - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::KMS::Key", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifacts4A9B2621": { - "DeletionPolicy": "Delete", - "Properties": { - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "KMSMasterKeyID": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "SSEAlgorithm": "aws:kms", - }, - }, - ], - }, - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - }, - "PublicAccessBlockConfiguration": { - "BlockPublicAcls": true, - "BlockPublicPolicy": true, - "IgnorePublicAcls": true, - "RestrictPublicBuckets": true, - }, - "Tags": [ - { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", - }, - ], - "VersioningConfiguration": { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifactsAutoDeleteObjectsCustomResourceFEF48A36": { - "DeletionPolicy": "Delete", - "DependsOn": [ - "PipelineArtifactsPolicy87787A0D", - ], - "Properties": { - "BucketName": { - "Ref": "PipelineArtifacts4A9B2621", - }, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn", - ], - }, - }, - "Type": "Custom::S3AutoDeleteObjects", - "UpdateReplacePolicy": "Delete", - }, - "PipelineArtifactsPolicy87787A0D": { - "Properties": { - "Bucket": { - "Ref": "PipelineArtifacts4A9B2621", - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:PutBucketPolicy", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - ], - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineArtifacts4A9B2621", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "PipelineBuildLogs0533272F": { - "DeletionPolicy": "Retain", - "Properties": { - "RetentionInDays": 3653, - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - }, - "PipelineOutput78594CB5": { - "DeletionPolicy": "Delete", - "Properties": { - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "ArtifactAccessLoggingD6FCABA3", - }, - }, - "Tags": [ - { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", - }, - ], - "VersioningConfiguration": { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", - }, - "PipelineOutputAutoDeleteObjectsCustomResourceF3013510": { - "DeletionPolicy": "Delete", - "DependsOn": [ - "PipelineOutputPolicyCB4CC2E6", - ], - "Properties": { - "BucketName": { - "Ref": "PipelineOutput78594CB5", - }, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn", - ], - }, - }, - "Type": "Custom::S3AutoDeleteObjects", - "UpdateReplacePolicy": "Delete", - }, - "PipelineOutputPolicyCB4CC2E6": { - "Properties": { - "Bucket": { - "Ref": "PipelineOutput78594CB5", - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:PutBucketPolicy", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - ], - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineOutput78594CB5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, - "SourceRepoSourceRepositoryC86045A8": { - "Properties": { - "Code": { - "BranchName": "main", - "S3": { - "Bucket": "cdk-hnb659fds-assets-12341234-eu-central-1", - "Key": "03d16bf861cb657df931bd33404567ac7f02ff927d18a45f5cc7f7cc981bb7ce.zip", - }, - }, - "RepositoryName": "layer-repo-MyTestStack", - }, - "Type": "AWS::CodeCommit::Repository", - }, - "SourceRepoSourceRepositoryMyTestStackEmbeddedLinuxPipeline3F66E11BmainEventRule5C93E610": { - "Properties": { - "EventPattern": { - "detail": { - "event": [ - "referenceCreated", - "referenceUpdated", - ], - "referenceName": [ - "main", - ], - }, - "detail-type": [ - "CodeCommit Repository State Change", - ], - "resources": [ - { - "Fn::GetAtt": [ - "SourceRepoSourceRepositoryC86045A8", - "Arn", - ], - }, - ], - "source": [ - "aws.codecommit", - ], - }, - "State": "ENABLED", - "Targets": [ - { - "Arn": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codepipeline:eu-central-1:12341234:", - { - "Ref": "EmbeddedLinuxPipeline1DDFB4FE", - }, - ], - ], - }, - "Id": "Target0", - "RoleArn": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineEventsRoleF9DA96F1", - "Arn", - ], - }, - }, - ], - }, - "Type": "AWS::Events::Rule", - }, - }, - "Rules": { - "CheckBootstrapVersion": { - "Assertions": [ - { - "Assert": { - "Fn::Not": [ - { - "Fn::Contains": [ - [ - "1", - "2", - "3", - "4", - "5", - ], - { - "Ref": "BootstrapVersion", - }, - ], - }, - ], - }, - "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", - }, - ], - }, - }, -} -`; diff --git a/test/__snapshots__/network.test.ts.snap b/test/__snapshots__/network.test.ts.snap deleted file mode 100644 index 30c6a66..0000000 --- a/test/__snapshots__/network.test.ts.snap +++ /dev/null @@ -1,665 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Pipeline Networking Snapshot 1`] = ` -{ - "Parameters": { - "BootstrapVersion": { - "Default": "/cdk-bootstrap/hnb659fds/version", - "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", - "Type": "AWS::SSM::Parameter::Value", - }, - }, - "Resources": { - "LogGroupF5B46931": { - "DeletionPolicy": "Retain", - "Properties": { - "RetentionInDays": 3653, - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", - }, - "PipelineVpc0543904A": { - "Properties": { - "CidrBlock": "10.0.0.0/16", - "EnableDnsHostnames": true, - "EnableDnsSupport": true, - "InstanceTenancy": "default", - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc", - }, - ], - }, - "Type": "AWS::EC2::VPC", - }, - "PipelineVpcIGW3FA4A524": { - "Properties": { - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc", - }, - ], - }, - "Type": "AWS::EC2::InternetGateway", - }, - "PipelineVpcPrivateSubnet1DefaultRouteC225ACC6": { - "Properties": { - "DestinationCidrBlock": "0.0.0.0/0", - "NatGatewayId": { - "Ref": "PipelineVpcPublicSubnet1NATGatewayA4388274", - }, - "RouteTableId": { - "Ref": "PipelineVpcPrivateSubnet1RouteTable6D8B603D", - }, - }, - "Type": "AWS::EC2::Route", - }, - "PipelineVpcPrivateSubnet1RouteTable6D8B603D": { - "Properties": { - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PrivateSubnet1", - }, - ], - "VpcId": { - "Ref": "PipelineVpc0543904A", - }, - }, - "Type": "AWS::EC2::RouteTable", - }, - "PipelineVpcPrivateSubnet1RouteTableAssociation791F1EF2": { - "Properties": { - "RouteTableId": { - "Ref": "PipelineVpcPrivateSubnet1RouteTable6D8B603D", - }, - "SubnetId": { - "Ref": "PipelineVpcPrivateSubnet1Subnet442DCECC", - }, - }, - "Type": "AWS::EC2::SubnetRouteTableAssociation", - }, - "PipelineVpcPrivateSubnet1Subnet442DCECC": { - "Properties": { - "AvailabilityZone": "dummy1a", - "CidrBlock": "10.0.96.0/19", - "MapPublicIpOnLaunch": false, - "Tags": [ - { - "Key": "aws-cdk:subnet-name", - "Value": "Private", - }, - { - "Key": "aws-cdk:subnet-type", - "Value": "Private", - }, - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PrivateSubnet1", - }, - ], - "VpcId": { - "Ref": "PipelineVpc0543904A", - }, - }, - "Type": "AWS::EC2::Subnet", - }, - "PipelineVpcPrivateSubnet2DefaultRouteF3A9A6B9": { - "Properties": { - "DestinationCidrBlock": "0.0.0.0/0", - "NatGatewayId": { - "Ref": "PipelineVpcPublicSubnet2NATGateway5B528D21", - }, - "RouteTableId": { - "Ref": "PipelineVpcPrivateSubnet2RouteTable9A31913F", - }, - }, - "Type": "AWS::EC2::Route", - }, - "PipelineVpcPrivateSubnet2RouteTable9A31913F": { - "Properties": { - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PrivateSubnet2", - }, - ], - "VpcId": { - "Ref": "PipelineVpc0543904A", - }, - }, - "Type": "AWS::EC2::RouteTable", - }, - "PipelineVpcPrivateSubnet2RouteTableAssociationC502A5A4": { - "Properties": { - "RouteTableId": { - "Ref": "PipelineVpcPrivateSubnet2RouteTable9A31913F", - }, - "SubnetId": { - "Ref": "PipelineVpcPrivateSubnet2SubnetE21FED10", - }, - }, - "Type": "AWS::EC2::SubnetRouteTableAssociation", - }, - "PipelineVpcPrivateSubnet2SubnetE21FED10": { - "Properties": { - "AvailabilityZone": "dummy1b", - "CidrBlock": "10.0.128.0/19", - "MapPublicIpOnLaunch": false, - "Tags": [ - { - "Key": "aws-cdk:subnet-name", - "Value": "Private", - }, - { - "Key": "aws-cdk:subnet-type", - "Value": "Private", - }, - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PrivateSubnet2", - }, - ], - "VpcId": { - "Ref": "PipelineVpc0543904A", - }, - }, - "Type": "AWS::EC2::Subnet", - }, - "PipelineVpcPrivateSubnet3DefaultRoute8706A1DD": { - "Properties": { - "DestinationCidrBlock": "0.0.0.0/0", - "NatGatewayId": { - "Ref": "PipelineVpcPublicSubnet3NATGateway69775315", - }, - "RouteTableId": { - "Ref": "PipelineVpcPrivateSubnet3RouteTableBF7276B0", - }, - }, - "Type": "AWS::EC2::Route", - }, - "PipelineVpcPrivateSubnet3RouteTableAssociationEB416B63": { - "Properties": { - "RouteTableId": { - "Ref": "PipelineVpcPrivateSubnet3RouteTableBF7276B0", - }, - "SubnetId": { - "Ref": "PipelineVpcPrivateSubnet3SubnetFCC0E247", - }, - }, - "Type": "AWS::EC2::SubnetRouteTableAssociation", - }, - "PipelineVpcPrivateSubnet3RouteTableBF7276B0": { - "Properties": { - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PrivateSubnet3", - }, - ], - "VpcId": { - "Ref": "PipelineVpc0543904A", - }, - }, - "Type": "AWS::EC2::RouteTable", - }, - "PipelineVpcPrivateSubnet3SubnetFCC0E247": { - "Properties": { - "AvailabilityZone": "dummy1c", - "CidrBlock": "10.0.160.0/19", - "MapPublicIpOnLaunch": false, - "Tags": [ - { - "Key": "aws-cdk:subnet-name", - "Value": "Private", - }, - { - "Key": "aws-cdk:subnet-type", - "Value": "Private", - }, - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PrivateSubnet3", - }, - ], - "VpcId": { - "Ref": "PipelineVpc0543904A", - }, - }, - "Type": "AWS::EC2::Subnet", - }, - "PipelineVpcPublicSubnet1DefaultRoute44F3E91D": { - "DependsOn": [ - "PipelineVpcVPCGW3256101F", - ], - "Properties": { - "DestinationCidrBlock": "0.0.0.0/0", - "GatewayId": { - "Ref": "PipelineVpcIGW3FA4A524", - }, - "RouteTableId": { - "Ref": "PipelineVpcPublicSubnet1RouteTableE9A67515", - }, - }, - "Type": "AWS::EC2::Route", - }, - "PipelineVpcPublicSubnet1EIPBD0800F9": { - "Properties": { - "Domain": "vpc", - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PublicSubnet1", - }, - ], - }, - "Type": "AWS::EC2::EIP", - }, - "PipelineVpcPublicSubnet1NATGatewayA4388274": { - "DependsOn": [ - "PipelineVpcPublicSubnet1DefaultRoute44F3E91D", - "PipelineVpcPublicSubnet1RouteTableAssociation6D13736B", - ], - "Properties": { - "AllocationId": { - "Fn::GetAtt": [ - "PipelineVpcPublicSubnet1EIPBD0800F9", - "AllocationId", - ], - }, - "SubnetId": { - "Ref": "PipelineVpcPublicSubnet1Subnet26FF83E2", - }, - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PublicSubnet1", - }, - ], - }, - "Type": "AWS::EC2::NatGateway", - }, - "PipelineVpcPublicSubnet1RouteTableAssociation6D13736B": { - "Properties": { - "RouteTableId": { - "Ref": "PipelineVpcPublicSubnet1RouteTableE9A67515", - }, - "SubnetId": { - "Ref": "PipelineVpcPublicSubnet1Subnet26FF83E2", - }, - }, - "Type": "AWS::EC2::SubnetRouteTableAssociation", - }, - "PipelineVpcPublicSubnet1RouteTableE9A67515": { - "Properties": { - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PublicSubnet1", - }, - ], - "VpcId": { - "Ref": "PipelineVpc0543904A", - }, - }, - "Type": "AWS::EC2::RouteTable", - }, - "PipelineVpcPublicSubnet1Subnet26FF83E2": { - "Properties": { - "AvailabilityZone": "dummy1a", - "CidrBlock": "10.0.0.0/19", - "MapPublicIpOnLaunch": true, - "Tags": [ - { - "Key": "aws-cdk:subnet-name", - "Value": "Public", - }, - { - "Key": "aws-cdk:subnet-type", - "Value": "Public", - }, - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PublicSubnet1", - }, - ], - "VpcId": { - "Ref": "PipelineVpc0543904A", - }, - }, - "Type": "AWS::EC2::Subnet", - }, - "PipelineVpcPublicSubnet2DefaultRoute04C861A0": { - "DependsOn": [ - "PipelineVpcVPCGW3256101F", - ], - "Properties": { - "DestinationCidrBlock": "0.0.0.0/0", - "GatewayId": { - "Ref": "PipelineVpcIGW3FA4A524", - }, - "RouteTableId": { - "Ref": "PipelineVpcPublicSubnet2RouteTable5219ED4D", - }, - }, - "Type": "AWS::EC2::Route", - }, - "PipelineVpcPublicSubnet2EIPB92B2C07": { - "Properties": { - "Domain": "vpc", - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PublicSubnet2", - }, - ], - }, - "Type": "AWS::EC2::EIP", - }, - "PipelineVpcPublicSubnet2NATGateway5B528D21": { - "DependsOn": [ - "PipelineVpcPublicSubnet2DefaultRoute04C861A0", - "PipelineVpcPublicSubnet2RouteTableAssociation54D39738", - ], - "Properties": { - "AllocationId": { - "Fn::GetAtt": [ - "PipelineVpcPublicSubnet2EIPB92B2C07", - "AllocationId", - ], - }, - "SubnetId": { - "Ref": "PipelineVpcPublicSubnet2Subnet64F58E18", - }, - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PublicSubnet2", - }, - ], - }, - "Type": "AWS::EC2::NatGateway", - }, - "PipelineVpcPublicSubnet2RouteTable5219ED4D": { - "Properties": { - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PublicSubnet2", - }, - ], - "VpcId": { - "Ref": "PipelineVpc0543904A", - }, - }, - "Type": "AWS::EC2::RouteTable", - }, - "PipelineVpcPublicSubnet2RouteTableAssociation54D39738": { - "Properties": { - "RouteTableId": { - "Ref": "PipelineVpcPublicSubnet2RouteTable5219ED4D", - }, - "SubnetId": { - "Ref": "PipelineVpcPublicSubnet2Subnet64F58E18", - }, - }, - "Type": "AWS::EC2::SubnetRouteTableAssociation", - }, - "PipelineVpcPublicSubnet2Subnet64F58E18": { - "Properties": { - "AvailabilityZone": "dummy1b", - "CidrBlock": "10.0.32.0/19", - "MapPublicIpOnLaunch": true, - "Tags": [ - { - "Key": "aws-cdk:subnet-name", - "Value": "Public", - }, - { - "Key": "aws-cdk:subnet-type", - "Value": "Public", - }, - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PublicSubnet2", - }, - ], - "VpcId": { - "Ref": "PipelineVpc0543904A", - }, - }, - "Type": "AWS::EC2::Subnet", - }, - "PipelineVpcPublicSubnet3DefaultRouteDD586919": { - "DependsOn": [ - "PipelineVpcVPCGW3256101F", - ], - "Properties": { - "DestinationCidrBlock": "0.0.0.0/0", - "GatewayId": { - "Ref": "PipelineVpcIGW3FA4A524", - }, - "RouteTableId": { - "Ref": "PipelineVpcPublicSubnet3RouteTableD6F00678", - }, - }, - "Type": "AWS::EC2::Route", - }, - "PipelineVpcPublicSubnet3EIPA3CA7521": { - "Properties": { - "Domain": "vpc", - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PublicSubnet3", - }, - ], - }, - "Type": "AWS::EC2::EIP", - }, - "PipelineVpcPublicSubnet3NATGateway69775315": { - "DependsOn": [ - "PipelineVpcPublicSubnet3DefaultRouteDD586919", - "PipelineVpcPublicSubnet3RouteTableAssociation163F9BEA", - ], - "Properties": { - "AllocationId": { - "Fn::GetAtt": [ - "PipelineVpcPublicSubnet3EIPA3CA7521", - "AllocationId", - ], - }, - "SubnetId": { - "Ref": "PipelineVpcPublicSubnet3SubnetE08894FF", - }, - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PublicSubnet3", - }, - ], - }, - "Type": "AWS::EC2::NatGateway", - }, - "PipelineVpcPublicSubnet3RouteTableAssociation163F9BEA": { - "Properties": { - "RouteTableId": { - "Ref": "PipelineVpcPublicSubnet3RouteTableD6F00678", - }, - "SubnetId": { - "Ref": "PipelineVpcPublicSubnet3SubnetE08894FF", - }, - }, - "Type": "AWS::EC2::SubnetRouteTableAssociation", - }, - "PipelineVpcPublicSubnet3RouteTableD6F00678": { - "Properties": { - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PublicSubnet3", - }, - ], - "VpcId": { - "Ref": "PipelineVpc0543904A", - }, - }, - "Type": "AWS::EC2::RouteTable", - }, - "PipelineVpcPublicSubnet3SubnetE08894FF": { - "Properties": { - "AvailabilityZone": "dummy1c", - "CidrBlock": "10.0.64.0/19", - "MapPublicIpOnLaunch": true, - "Tags": [ - { - "Key": "aws-cdk:subnet-name", - "Value": "Public", - }, - { - "Key": "aws-cdk:subnet-type", - "Value": "Public", - }, - { - "Key": "Name", - "Value": "PipelineNetworkStack/PipelineVpc/PublicSubnet3", - }, - ], - "VpcId": { - "Ref": "PipelineVpc0543904A", - }, - }, - "Type": "AWS::EC2::Subnet", - }, - "PipelineVpcVPCGW3256101F": { - "Properties": { - "InternetGatewayId": { - "Ref": "PipelineVpcIGW3FA4A524", - }, - "VpcId": { - "Ref": "PipelineVpc0543904A", - }, - }, - "Type": "AWS::EC2::VPCGatewayAttachment", - }, - "VPCFlowLogsFlowLogD2BDB2A5": { - "Properties": { - "DeliverLogsPermissionArn": { - "Fn::GetAtt": [ - "VPCFlowLogsIAMRoleFF7B3C14", - "Arn", - ], - }, - "LogDestinationType": "cloud-watch-logs", - "LogGroupName": { - "Ref": "LogGroupF5B46931", - }, - "ResourceId": { - "Ref": "PipelineVpc0543904A", - }, - "ResourceType": "VPC", - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/VPCFlowLogs", - }, - ], - "TrafficType": "ALL", - }, - "Type": "AWS::EC2::FlowLog", - }, - "VPCFlowLogsIAMRoleDefaultPolicy0D9292CF": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "logs:CreateLogStream", - "logs:PutLogEvents", - "logs:DescribeLogStreams", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "LogGroupF5B46931", - "Arn", - ], - }, - }, - { - "Action": "iam:PassRole", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "VPCFlowLogsIAMRoleFF7B3C14", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "VPCFlowLogsIAMRoleDefaultPolicy0D9292CF", - "Roles": [ - { - "Ref": "VPCFlowLogsIAMRoleFF7B3C14", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "VPCFlowLogsIAMRoleFF7B3C14": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "vpc-flow-logs.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - "Tags": [ - { - "Key": "Name", - "Value": "PipelineNetworkStack/VPCFlowLogs", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, - }, - "Rules": { - "CheckBootstrapVersion": { - "Assertions": [ - { - "Assert": { - "Fn::Not": [ - { - "Fn::Contains": [ - [ - "1", - "2", - "3", - "4", - "5", - ], - { - "Ref": "BootstrapVersion", - }, - ], - }, - ], - }, - "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", - }, - ], - }, - }, -} -`; diff --git a/test/__snapshots__/source-repo.test.ts.snap b/test/__snapshots__/source-repo.test.ts.snap deleted file mode 100644 index d9190e0..0000000 --- a/test/__snapshots__/source-repo.test.ts.snap +++ /dev/null @@ -1,55 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Pipeline Source Repository Snapshot 1`] = ` -{ - "Parameters": { - "BootstrapVersion": { - "Default": "/cdk-bootstrap/hnb659fds/version", - "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]", - "Type": "AWS::SSM::Parameter::Value", - }, - }, - "Resources": { - "MyTestStackSourceRepository1F6C3AB0": { - "Properties": { - "Code": { - "BranchName": "main", - "S3": { - "Bucket": "cdk-hnb659fds-assets-12341234-eu-central-1", - "Key": "03d16bf861cb657df931bd33404567ac7f02ff927d18a45f5cc7f7cc981bb7ce.zip", - }, - }, - "RepositoryName": "charlie", - }, - "Type": "AWS::CodeCommit::Repository", - }, - }, - "Rules": { - "CheckBootstrapVersion": { - "Assertions": [ - { - "Assert": { - "Fn::Not": [ - { - "Fn::Contains": [ - [ - "1", - "2", - "3", - "4", - "5", - ], - { - "Ref": "BootstrapVersion", - }, - ], - }, - ], - }, - "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.", - }, - ], - }, - }, -} -`; diff --git a/test/build-image-data-nag.test.ts b/test/build-image-data-nag.test.ts deleted file mode 100644 index 5010c6f..0000000 --- a/test/build-image-data-nag.test.ts +++ /dev/null @@ -1,78 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { BuildImageDataStack } from '../lib/build-image-data'; - -import { Annotations, Match } from 'aws-cdk-lib/assertions'; -import { App, Aspects, Stack } from 'aws-cdk-lib'; -import { AwsSolutionsChecks, NagSuppressions } from 'cdk-nag'; - -describe('BuildImageDataStack cdk-nag AwsSolutions Pack', () => { - let stack: Stack; - let app: App; - - beforeAll(() => { - // GIVEN - app = new App(); - const props = { - bucketName: 'test-bucket', - removalPolicy: cdk.RemovalPolicy.DESTROY, - autoDeleteObjects: true, - env: { account: '111111111111', region: 'eu-central-1' }, - }; - stack = new BuildImageDataStack(app, 'MyTestStack', props); - - NagSuppressions.addResourceSuppressionsByPath( - stack, - '/MyTestStack/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Resource', - [ - { - id: 'AwsSolutions-L1', - reason: 'This Lambda function is 3rd Party (from CDK libs)', - }, - ] - ); - - NagSuppressions.addResourceSuppressionsByPath( - stack, - 'MyTestStack/BuildImageBucketRole/DefaultPolicy/Resource', - [ - { - id: 'AwsSolutions-IAM5', - reason: - 'Because these are the default permissions assigned to a CDK default created role.', - }, - ] - ); - - NagSuppressions.addResourceSuppressionsByPath( - stack, - '/MyTestStack/BuildImageBucketRole/Resource', - [ - { - id: 'AwsSolutions-IAM5', - reason: - '/aws/lambda/BuildImageData-CustomCDKBucketDeployment* is needed here.', - }, - ] - ); - - // WHEN - Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); - }); - - // THEN - test('No unsuppressed Warnings', () => { - const warnings = Annotations.fromStack(stack).findWarning( - '*', - Match.stringLikeRegexp('AwsSolutions-.*') - ); - expect(warnings).toHaveLength(0); - }); - - test('No unsuppressed Errors', () => { - const errors = Annotations.fromStack(stack).findError( - '*', - Match.stringLikeRegexp('AwsSolutions-.*') - ); - expect(errors).toHaveLength(0); - }); -}); diff --git a/test/build-image-data.test.ts b/test/build-image-data.test.ts deleted file mode 100644 index 0f241d7..0000000 --- a/test/build-image-data.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Template } from 'aws-cdk-lib/assertions'; -import { BuildImageDataStack } from '../lib/build-image-data'; -import { normalizedTemplateFromStack } from './util'; - -describe('Build Image Data', () => { - const props = { - bucketName: 'test-bucket', - removalPolicy: cdk.RemovalPolicy.DESTROY, - autoDeleteObjects: true, - env: { account: '111111111111', region: 'eu-central-1' }, - }; - - test('S3 Bucket Has Versioning Enabled', () => { - const app = new cdk.App(); - const stack = new BuildImageDataStack(app, 'MyTestStack', props); - const template = Template.fromStack(stack); - template.hasResourceProperties('AWS::S3::Bucket', { - BucketName: 'test-bucket', - }); - - template.allResourcesProperties('AWS::S3::Bucket', { - VersioningConfiguration: { Status: 'Enabled' }, - }); - }); - - test('Snapshot', () => { - const app = new cdk.App(); - const stack = new BuildImageDataStack(app, 'MyTestStack', props); - /* We must change some randomly generated file names used in the S3 asset construct. */ - const templateWithConstKeys = normalizedTemplateFromStack(stack); - expect(templateWithConstKeys).toMatchSnapshot(); - }); -}); diff --git a/test/build-image-pipeline-nag.test.ts b/test/build-image-pipeline-nag.test.ts deleted file mode 100644 index 586311f..0000000 --- a/test/build-image-pipeline-nag.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { - BuildImagePipelineStack, - ImageKind, -} from '../lib/build-image-pipeline'; -import { Repository } from 'aws-cdk-lib/aws-ecr'; -import { Bucket } from 'aws-cdk-lib/aws-s3'; - -import { Annotations, Match } from 'aws-cdk-lib/assertions'; -import { App, Aspects, Stack } from 'aws-cdk-lib'; -import { AwsSolutionsChecks, NagSuppressions } from 'cdk-nag'; - -describe('BuildImagePipelineStack cdk-nag AwsSolutions Pack', () => { - let stack: Stack; - let app: App; - - beforeAll(() => { - // GIVEN - const env = { account: '111111111111', region: 'eu-central-1' }; - app = new cdk.App(); - const repoStack = new cdk.Stack(app, 'RepoStack', { env }); - const repository = new Repository(repoStack, 'Repository', {}); - const dataBucket = new Bucket(repoStack, 'Bucket', {}); - - const props = { - env, - imageKind: ImageKind.Ubuntu22_04, - repository, - dataBucket, - }; - - stack = new BuildImagePipelineStack(repoStack, 'MyTestStack', props); - NagSuppressions.addStackSuppressions(stack, [ - { - id: 'AwsSolutions-CB3', - reason: 'Privilege Mode Required To Build Docker Containers.', - }, - ]); - - NagSuppressions.addResourceSuppressionsByPath( - repoStack, - '/RepoStack/MyTestStack/BuildImagePipeline/Role/DefaultPolicy/Resource', - [ - { - id: 'AwsSolutions-IAM5', - reason: - 'Because these are the default permissions assigned to a CDK default created role.', - }, - ] - ); - NagSuppressions.addResourceSuppressionsByPath( - repoStack, - '/RepoStack/MyTestStack/BuildImagePipeline/Source/Build-Image-Source/CodePipelineActionRole/DefaultPolicy/Resource', - [ - { - id: 'AwsSolutions-IAM5', - reason: - 'Because these are the default permissions assigned to a CDK default created role.', - }, - ] - ); - - NagSuppressions.addResourceSuppressionsByPath( - repoStack, - '/RepoStack/MyTestStack/BuildImageProject/Role/DefaultPolicy/Resource', - [ - { - id: 'AwsSolutions-IAM5', - reason: - 'Because these are the default permissions assigned to a CDK default created role.', - }, - ] - ); - - // WHEN - Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); - }); - - // THEN - test('No unsuppressed Warnings', () => { - const warnings = Annotations.fromStack(stack).findWarning( - '*', - Match.stringLikeRegexp('AwsSolutions-.*') - ); - - expect(warnings).toHaveLength(0); - }); - - test('No unsuppressed Errors', () => { - const errors = Annotations.fromStack(stack).findError( - '*', - Match.stringLikeRegexp('AwsSolutions-.*') - ); - expect(errors).toHaveLength(0); - }); -}); diff --git a/test/build-image-pipeline.test.ts b/test/build-image-pipeline.test.ts deleted file mode 100644 index 76ccc21..0000000 --- a/test/build-image-pipeline.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Template } from 'aws-cdk-lib/assertions'; -import { - BuildImagePipelineStack, - ImageKind, -} from '../lib/build-image-pipeline'; -import { Repository } from 'aws-cdk-lib/aws-ecr'; -import { Bucket } from 'aws-cdk-lib/aws-s3'; - -describe('Build Image Pipeline', () => { - const env = { account: '111111111111', region: 'eu-central-1' }; - - test('Build Image Pipeline Instantiates', () => { - const app = new cdk.App(); - const repoStack = new cdk.Stack(app, 'RepoStack', { env }); - const repository = new Repository(repoStack, 'Repository', {}); - const dataBucket = new Bucket(repoStack, 'Bucket', {}); - - const props = { - env, - imageKind: ImageKind.Ubuntu22_04, - repository, - dataBucket, - }; - - const stack = new BuildImagePipelineStack(repoStack, 'MyTestStack', props); - const template = Template.fromStack(stack); - template.resourceCountIs('AWS::CodePipeline::Pipeline', 1); - template.resourceCountIs('AWS::Logs::LogGroup', 1); - template.allResourcesProperties('AWS::Logs::LogGroup', { - RetentionInDays: 3653, - }); - template.allResourcesProperties('AWS::S3::Bucket', { - VersioningConfiguration: { Status: 'Enabled' }, - }); - }); - - test('Snapshot', () => { - const app = new cdk.App(); - const repoStack = new cdk.Stack(app, 'RepoStack', { env }); - const repository = new Repository(repoStack, 'Repository', {}); - const dataBucket = new Bucket(repoStack, 'Bucket', {}); - - const props = { - env, - imageKind: ImageKind.Ubuntu22_04, - repository, - dataBucket, - }; - - const stack = new BuildImagePipelineStack(repoStack, 'MyTestStack', props); - const template = Template.fromStack(stack); - expect(template).toMatchSnapshot(); - }); -}); diff --git a/test/build-image-repo-nag.test.ts b/test/build-image-repo-nag.test.ts deleted file mode 100644 index 0cd9ef8..0000000 --- a/test/build-image-repo-nag.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { BuildImageRepoStack } from '../lib/build-image-repo'; -import { Annotations, Match } from 'aws-cdk-lib/assertions'; -import { App, Aspects, Stack } from 'aws-cdk-lib'; -import { AwsSolutionsChecks } from 'cdk-nag'; - -describe('Build Image Repository cdk-nag AwsSolutions Pack', () => { - const props = { - env: { account: '111111111111', region: 'eu-central-1' }, - }; - let stack: Stack; - let app: App; - - beforeAll(() => { - // GIVEN - app = new App(); - stack = new BuildImageRepoStack(app, 'MyTestStack', props); - // WHEN - Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); - }); - // THEN - test('No unsuppressed Warnings', () => { - const warnings = Annotations.fromStack(stack).findWarning( - '*', - Match.stringLikeRegexp('AwsSolutions-.*') - ); - expect(warnings).toHaveLength(0); - }); - - test('No unsuppressed Errors', () => { - const errors = Annotations.fromStack(stack).findError( - '*', - Match.stringLikeRegexp('AwsSolutions-.*') - ); - expect(errors).toHaveLength(0); - }); -}); diff --git a/test/build-image-repo.test.ts b/test/build-image-repo.test.ts deleted file mode 100644 index d77d1f1..0000000 --- a/test/build-image-repo.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Template } from 'aws-cdk-lib/assertions'; -import { BuildImageRepoStack } from '../lib/build-image-repo'; - -describe('Build Image Repository', () => { - const props = { - env: { account: '111111111111', region: 'eu-central-1' }, - }; - - test('Snapshot', () => { - const app = new cdk.App(); - const stack = new BuildImageRepoStack(app, 'MyTestStack', props); - const template = Template.fromStack(stack); - expect(template).toMatchSnapshot(); - }); -}); diff --git a/test/codepipeline-embedded-linux-base-image-nag.test.ts b/test/codepipeline-embedded-linux-base-image-nag.test.ts new file mode 100644 index 0000000..a2b2e66 --- /dev/null +++ b/test/codepipeline-embedded-linux-base-image-nag.test.ts @@ -0,0 +1,148 @@ +import * as cdk from "aws-cdk-lib"; +import { Annotations, Match } from "aws-cdk-lib/assertions"; +import { AwsSolutionsChecks, NagSuppressions } from "cdk-nag"; +import * as ecr from "aws-cdk-lib/aws-ecr"; +import * as kms from "aws-cdk-lib/aws-kms"; +import * as s3 from "aws-cdk-lib/aws-s3"; +import { + EmbeddedLinuxCodePipelineBaseImageProps, + EmbeddedLinuxCodePipelineBaseImageStack, +} from "../lib/codepipeline-embedded-linux-base-image"; +import { DEFAULT_ENV } from "./util"; + +function addNagSuppressions(stack: cdk.Stack) { + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Resource`, + [ + { + id: "AwsSolutions-L1", + reason: "This Lambda function is 3rd Party (from CDK libs)", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/CodePipelineBuildBaseImageBucketDeploymentRole/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because CodePipelineBuildBaseImageBucketDeploymentRole/Resource is needed here.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/CodePipelineBuildBaseImageBucketDeploymentRole/DefaultPolicy/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/CodePipelineBuildBaseImageProject/Role/DefaultPolicy/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/CodePipelineBuildBaseImageCodePipeline/Role/DefaultPolicy/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/CodePipelineBuildBaseImageCodePipeline/Source/Source/CodePipelineActionRole/DefaultPolicy/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); +} + +describe("EmbeddedLinuxCodePipelineBaseImageStack cdk-nag AwsSolutions Pack", () => { + const app: cdk.App = new cdk.App(); + let stack: cdk.Stack; + + beforeAll(() => { + // GIVEN + const baseStack = new cdk.Stack(app, "BaseStack", { env: DEFAULT_ENV }); + + const encryptionKey = new kms.Key(baseStack, "EncryptionKey", { + removalPolicy: cdk.RemovalPolicy.DESTROY, + enableKeyRotation: true, + }); + const pipelineSourceBucket = new s3.Bucket( + baseStack, + "PipelineSourceBucket", + { + versioned: true, + }, + ); + const pipelineArtifactBucket = new s3.Bucket( + baseStack, + "PipelineArtifactBucket", + {}, + ); + const ecrRepository = new ecr.Repository(baseStack, "EcrRepository", {}); + + const props: EmbeddedLinuxCodePipelineBaseImageProps = { + env: DEFAULT_ENV, + pipelineSourceBucket: pipelineSourceBucket, + pipelineArtifactBucket: pipelineArtifactBucket, + ecrRepository: ecrRepository, + encryptionKey: encryptionKey, + }; + + stack = new EmbeddedLinuxCodePipelineBaseImageStack( + app, + "MyTestStack", + props, + ); + + addNagSuppressions(stack); + + // WHEN + cdk.Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); + }); + + // THEN + test("No unsuppressed Warnings", () => { + const results = Annotations.fromStack(stack).findWarning( + "*", + Match.stringLikeRegexp("AwsSolutions-.*"), + ); + for (const result of results) { + console.log(JSON.stringify(result, null, 4)); + } + expect(results).toHaveLength(0); + }); + test("No unsuppressed Errors", () => { + const results = Annotations.fromStack(stack).findError( + "*", + Match.stringLikeRegexp("AwsSolutions-.*"), + ); + for (const result of results) { + console.log(JSON.stringify(result, null, 4)); + } + expect(results).toHaveLength(0); + }); +}); diff --git a/test/codepipeline-embedded-linux-base-image.test.ts b/test/codepipeline-embedded-linux-base-image.test.ts new file mode 100644 index 0000000..9679efa --- /dev/null +++ b/test/codepipeline-embedded-linux-base-image.test.ts @@ -0,0 +1,65 @@ +import * as cdk from "aws-cdk-lib"; +import * as assertions from "aws-cdk-lib/assertions"; +import { PipelineResourcesProps, PipelineResourcesStack } from "../lib"; +import { + EmbeddedLinuxCodePipelineBaseImageProps, + EmbeddedLinuxCodePipelineBaseImageStack, +} from "../lib"; +import { DEFAULT_ENV, normalizedTemplateFromStack } from "./util"; + +// TODO +// - add test with PipelineResourcesProps values for various buckets +// - add test for other outouts + +describe("EmbeddedLinuxCodePipelineBaseImageStack", () => { + let app: cdk.App; + let stack: cdk.Stack; + let template: assertions.Template; + let pipelineResourcesStack: PipelineResourcesStack; + + const pipelineResourcesProps: PipelineResourcesProps = { + resource_prefix: "test", + env: DEFAULT_ENV, + }; + + beforeAll(() => { + // GIVEN + app = new cdk.App(); + pipelineResourcesStack = new PipelineResourcesStack( + app, + "MyResourceStack", + pipelineResourcesProps, + ); + + const embeddedLinuxCodePipelineBaseImageProps: EmbeddedLinuxCodePipelineBaseImageProps = + { + env: DEFAULT_ENV, + pipelineSourceBucket: pipelineResourcesStack.pipelineSourceBucket, + pipelineArtifactBucket: pipelineResourcesStack.pipelineArtifactBucket, + ecrRepository: pipelineResourcesStack.ecrRepository, + encryptionKey: pipelineResourcesStack.encryptionKey, + }; + stack = new EmbeddedLinuxCodePipelineBaseImageStack( + app, + "MyTestStack", + embeddedLinuxCodePipelineBaseImageProps, + ); + template = assertions.Template.fromStack(stack); + }); + + test("Has Resources", () => { + template.resourceCountIs("AWS::CodePipeline::Pipeline", 1); + template.resourceCountIs("AWS::CodeBuild::Project", 1); + template.resourceCountIs("AWS::Events::Rule", 2); // one for the S3 trigger and one for the weekly refresh + template.resourceCountIs("AWS::Logs::LogGroup", 1); + template.allResourcesProperties("AWS::Logs::LogGroup", { + RetentionInDays: 365, + }); + }); + + test("Snapshot", () => { + /* We must change some randomly generated file names used in the S3 asset construct. */ + const templateWithConstKeys = normalizedTemplateFromStack(stack); + expect(templateWithConstKeys).toMatchSnapshot(); + }); +}); diff --git a/test/codepipeline-embedded-linux-nag.test.ts b/test/codepipeline-embedded-linux-nag.test.ts new file mode 100644 index 0000000..065e74c --- /dev/null +++ b/test/codepipeline-embedded-linux-nag.test.ts @@ -0,0 +1,230 @@ +import * as cdk from "aws-cdk-lib"; +import * as ecr from "aws-cdk-lib/aws-ecr"; +import * as s3 from "aws-cdk-lib/aws-s3"; +import * as ec2 from "aws-cdk-lib/aws-ec2"; +import * as kms from "aws-cdk-lib/aws-kms"; + +import { Annotations, Match } from "aws-cdk-lib/assertions"; +import { AwsSolutionsChecks, NagSuppressions } from "cdk-nag"; +import { EmbeddedLinuxCodePipelineStack } from "../lib/codepipeline-embedded-linux"; +import { ProjectType } from "../lib"; +import { DEFAULT_ENV } from "./util"; + +function addNagSuppressions(stack: cdk.Stack) { + NagSuppressions.addStackSuppressions(stack, [ + { id: "CdkNagValidationFailure", reason: "Multiple Validation Failures." }, + { + id: "AwsSolutions-CB3", + reason: "CodeBuild Privilege mode is required for this pipeline.", + }, + { + id: "AwsSolutions-IAM4", + reason: "TODO: Re-evaluate managed policies per resources.", + }, + ]); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/EmbeddedLinuxCodePipelineBucketDeploymentRole/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "/aws/lambda/EmbeddedLinuxCodePipeline-CustomCDKBucketDeployment* is needed here.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Resource`, + [ + { + id: "AwsSolutions-L1", + reason: "This Lambda function is 3rd Party (from CDK libs)", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/EmbeddedLinuxCodePipelineProject/PolicyDocument/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/EmbeddedLinuxCodePipelineProject/Role/DefaultPolicy/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/EmbeddedLinuxCodePipelineBucketDeploymentRole/DefaultPolicy/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/EmbeddedLinuxCodePipeline/Role/DefaultPolicy/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/EmbeddedLinuxCodePipeline/Artifact/Artifact/CodePipelineActionRole/DefaultPolicy/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/EmbeddedLinuxCodePipeline/Source/Source/CodePipelineActionRole/DefaultPolicy/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8a/ServiceRole/DefaultPolicy/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "This is a default CDK created policy, with default policy permissions.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/EmbeddedLinuxCodePipelineOSImageCheckOnStart/Resource`, + [ + { + id: "AwsSolutions-L1", + reason: "There is no latest PYTHON version to set.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/EmbeddedLinuxCodePipelineVMImportRole/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: "Wildcard permissions needed on snapshots, bucket content.", + appliesTo: [ + { + regex: `/Resource::arn:aws:ec2:${DEFAULT_ENV.region}::snapshot/\\*$/g`, + }, + { + regex: `/Resource::/\\*$/g`, + }, + { + regex: `/Resource::BaseStack:ExportsOutputFnGetAttOutputBucket7114EB27Arn67D5716D/\\*$/g`, + }, + { + regex: `/Resource::\\*$/g`, + }, + ], + }, + ], + ); +} + +describe("EmbeddedLinuxCodePipelineStack cdk-nag AwsSolutions Pack", () => { + const app: cdk.App = new cdk.App(); + let stack: cdk.Stack; + + beforeAll(() => { + // GIVEN + const baseStack = new cdk.Stack(app, "BaseStack", { env: DEFAULT_ENV }); + + // GIVEN + const encryptionKey = new kms.Key(baseStack, "EncryptionKey", { + removalPolicy: cdk.RemovalPolicy.DESTROY, + enableKeyRotation: true, + }); + const pipelineSourceBucket = new s3.Bucket( + baseStack, + "pipelineSourceBucket", + { + versioned: true, + }, + ); + const pipelineArtifactBucket = new s3.Bucket( + baseStack, + "ArtifactBucket", + {}, + ); + const pipelineOutputBucket = new s3.Bucket(baseStack, "OutputBucket", { + encryptionKey: encryptionKey, + }); + const ecrRepository = new ecr.Repository(baseStack, "EcrRepository", {}); + const vpc = new ec2.Vpc(baseStack, "Vpc", {}); + + stack = new EmbeddedLinuxCodePipelineStack(app, "MyTestStack", { + env: DEFAULT_ENV, + pipelineSourceBucket: pipelineSourceBucket, + pipelineArtifactBucket: pipelineArtifactBucket, + pipelineOutputBucket: pipelineOutputBucket, + ecrRepository: ecrRepository, + ecrRepositoryImageTag: "ubuntu_22_04", + projectType: ProjectType.PokyAmi, + vpc: vpc, + pipelineArtifactPrefix: `${ProjectType.PokyAmi}`, + encryptionKey: encryptionKey, + }); + + addNagSuppressions(stack); + + // WHEN + cdk.Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); + }); + + // THEN + test("No unsuppressed Warnings", () => { + const results = Annotations.fromStack(stack).findWarning( + "*", + Match.stringLikeRegexp("AwsSolutions-.*"), + ); + for (const result of results) { + console.log(JSON.stringify(result, null, 4)); + } + expect(results).toHaveLength(0); + }); + test("No unsuppressed Errors", () => { + const results = Annotations.fromStack(stack).findError( + "*", + Match.stringLikeRegexp("AwsSolutions-.*"), + ); + for (const result of results) { + console.log(JSON.stringify(result, null, 4)); + } + expect(results).toHaveLength(0); + }); +}); diff --git a/test/codepipeline-embedded-linux.test.ts b/test/codepipeline-embedded-linux.test.ts new file mode 100644 index 0000000..0497075 --- /dev/null +++ b/test/codepipeline-embedded-linux.test.ts @@ -0,0 +1,100 @@ +import * as cdk from "aws-cdk-lib"; +import * as assertions from "aws-cdk-lib/assertions"; +import { + PipelineResourcesProps, + PipelineResourcesStack, + ProjectType, +} from "../lib"; +import { + EmbeddedLinuxCodePipelineBaseImageProps, + EmbeddedLinuxCodePipelineBaseImageStack, +} from "../lib"; +import { + EmbeddedLinuxCodePipelineProps, + EmbeddedLinuxCodePipelineStack, +} from "../lib"; +import { DEFAULT_ENV, normalizedTemplateFromStack } from "./util"; + +// TODO +// - add test with PipelineResourcesProps values for various buckets +// - add test for other outouts + +describe("EmbeddedLinuxCodePipelineStack", () => { + let app: cdk.App; + let stack: cdk.Stack; + let template: assertions.Template; + let pipelineResourcesStack: PipelineResourcesStack; + let embeddedLinuxCodePipelineBaseImageStack: EmbeddedLinuxCodePipelineBaseImageStack; + + const pipelineResourcesProps: PipelineResourcesProps = { + resource_prefix: "test", + env: DEFAULT_ENV, + }; + + beforeAll(() => { + // GIVEN + app = new cdk.App(); + pipelineResourcesStack = new PipelineResourcesStack( + app, + "MyResourceStack", + pipelineResourcesProps, + ); + + const embeddedLinuxCodePipelineBaseImageProps: EmbeddedLinuxCodePipelineBaseImageProps = + { + env: DEFAULT_ENV, + pipelineSourceBucket: pipelineResourcesStack.pipelineSourceBucket, + pipelineArtifactBucket: pipelineResourcesStack.pipelineArtifactBucket, + ecrRepository: pipelineResourcesStack.ecrRepository, + encryptionKey: pipelineResourcesStack.encryptionKey, + }; + + embeddedLinuxCodePipelineBaseImageStack = + new EmbeddedLinuxCodePipelineBaseImageStack( + app, + "MyBaseImageStack", + embeddedLinuxCodePipelineBaseImageProps, + ); + + const embeddedLinuxCodePipelineProps: EmbeddedLinuxCodePipelineProps = { + env: DEFAULT_ENV, + ecrRepository: embeddedLinuxCodePipelineBaseImageStack.ecrRepository, + ecrRepositoryImageTag: + embeddedLinuxCodePipelineBaseImageStack.ecrRepositoryImageTag, + pipelineSourceBucket: pipelineResourcesStack.pipelineSourceBucket, + pipelineArtifactBucket: pipelineResourcesStack.pipelineArtifactBucket, + pipelineOutputBucket: pipelineResourcesStack.pipelineOutputBucket, + projectType: ProjectType.Poky, + vpc: pipelineResourcesStack.vpc, + pipelineArtifactPrefix: `${ProjectType.Poky}`, + encryptionKey: pipelineResourcesStack.encryptionKey, + }; + + stack = new EmbeddedLinuxCodePipelineStack( + app, + "MyTestStack", + embeddedLinuxCodePipelineProps, + ); + template = assertions.Template.fromStack(stack); + }); + + test("Has Resources", () => { + template.resourceCountIs("AWS::CodePipeline::Pipeline", 1); + template.resourceCountIs("AWS::CodeBuild::Project", 1); + // AWS::Events::Rule: + // - the S3 trigger + // - the CodePipeline Execution State Change + // - the weekly refresh + template.resourceCountIs("AWS::Events::Rule", 3); + template.resourceCountIs("AWS::Logs::LogGroup", 1); + template.allResourcesProperties("AWS::Logs::LogGroup", { + RetentionInDays: 365, + }); + }); + + test("Snapshot", () => { + /* We must change some randomly generated file names used in the S3 asset construct. */ + const templateWithConstKeys = normalizedTemplateFromStack(stack); + expect(templateWithConstKeys).toMatchSnapshot(); + }); +}); diff --git a/test/codepipeline-resources-nag.test.ts b/test/codepipeline-resources-nag.test.ts new file mode 100644 index 0000000..310bee9 --- /dev/null +++ b/test/codepipeline-resources-nag.test.ts @@ -0,0 +1,46 @@ +import * as cdk from "aws-cdk-lib"; + +import { Annotations, Match } from "aws-cdk-lib/assertions"; +import { AwsSolutionsChecks } from "cdk-nag"; +import { DEFAULT_ENV } from "./util"; +import { PipelineResourcesStack } from "../lib"; + +describe("PipelineResourcesStack cdk-nag AwsSolutions Pack", () => { + const app: cdk.App = new cdk.App(); + let stack: cdk.Stack; + + beforeAll(() => { + // GIVEN + const props = { + env: DEFAULT_ENV, + resource_prefix: `${DEFAULT_ENV.account}-${DEFAULT_ENV.region}`, + }; + + stack = new PipelineResourcesStack(app, "MyTestStack", props); + + // WHEN + cdk.Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); + }); + + // THEN + test("No unsuppressed Warnings", () => { + const results = Annotations.fromStack(stack).findWarning( + "*", + Match.stringLikeRegexp("AwsSolutions-.*"), + ); + for (const result of results) { + console.log(JSON.stringify(result, null, 4)); + } + expect(results).toHaveLength(0); + }); + test("No unsuppressed Errors", () => { + const results = Annotations.fromStack(stack).findError( + "*", + Match.stringLikeRegexp("AwsSolutions-.*"), + ); + for (const result of results) { + console.log(JSON.stringify(result, null, 4)); + } + expect(results).toHaveLength(0); + }); +}); diff --git a/test/codepipeline-resources.test.ts b/test/codepipeline-resources.test.ts new file mode 100644 index 0000000..391e12c --- /dev/null +++ b/test/codepipeline-resources.test.ts @@ -0,0 +1,59 @@ +import * as cdk from "aws-cdk-lib"; +import * as assertions from "aws-cdk-lib/assertions"; +import { PipelineResourcesProps, PipelineResourcesStack } from "../lib"; +import { DEFAULT_ENV, normalizedTemplateFromStack } from "./util"; + +// TODO +// - add test with PipelineResourcesProps values for various buckets +// - add test for other outouts + +describe("PipelineResourcesStack", () => { + let stack: cdk.Stack, app: cdk.App, template: assertions.Template; + const props: PipelineResourcesProps = { + resource_prefix: "test", + env: DEFAULT_ENV, + }; + beforeAll(() => { + // GIVEN + app = new cdk.App(); + stack = new PipelineResourcesStack(app, "MyTestStack", props); + template = assertions.Template.fromStack(stack); + }); + + const bucketSuffixes = [`artifact`, `source`, `output`, `logs`]; + it.each(bucketSuffixes)(`Has S3 Bucket`, (bucketSuffix) => { + const bucketName = + `${props.resource_prefix}-${props.env?.account}-${props.env?.region}-${bucketSuffix}`.toLowerCase(); + template.hasResourceProperties("AWS::S3::Bucket", { + BucketName: bucketName, + }); + }); + + test("Has Versionned S3 Bucket - Source", () => { + expect( + Object.keys(template.findResources("AWS::S3::Bucket")).find((key) => + key.match(/^PipelineResourcesSourceBucket[A-F0-9]{8}$/), + ), + ).toBeDefined(); + expect( + Object.entries(template.findResources("AWS::S3::Bucket")).filter( + ([key, value]) => + key.match(/^PipelineResourcesSourceBucket[A-F0-9]{8}$/) && + value.Properties.VersioningConfiguration.Status == "Enabled", + ), + ).toHaveLength(1); + }); + + test("Logs Have Retention Period", () => { + template.resourceCountIs("AWS::Logs::LogGroup", 1); + template.allResourcesProperties("AWS::Logs::LogGroup", { + RetentionInDays: 365, + }); + }); + + test("Snapshot", () => { + /* We must change some randomly generated file names used in the S3 asset construct. */ + const templateWithConstKeys = normalizedTemplateFromStack(stack); + expect(templateWithConstKeys).toMatchSnapshot(); + }); +}); diff --git a/test/embedded-linux-pipeline-nag.test.ts b/test/embedded-linux-pipeline-nag.test.ts deleted file mode 100644 index e50a317..0000000 --- a/test/embedded-linux-pipeline-nag.test.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { EmbeddedLinuxPipelineStack } from '../lib/embedded-linux-pipeline'; -import { Repository } from 'aws-cdk-lib/aws-ecr'; -import { Vpc } from 'aws-cdk-lib/aws-ec2'; - -import { Annotations, Match } from 'aws-cdk-lib/assertions'; -import { App, Aspects, Stack } from 'aws-cdk-lib'; -import { AwsSolutionsChecks, NagSuppressions } from 'cdk-nag'; -import { ProjectKind } from '../lib'; - -describe('Pipeline cdk-nag AwsSolutions Pack', () => { - let stack: Stack; - let app: App; - let vpc: Vpc; - let imageRepo: Repository; - let newStack: Stack; - beforeAll(() => { - // GIVEN - app = new App(); - const env = { account: '12341234', region: 'eu-central-1' }; - newStack = new Stack(app, 'RepoStack', { env }); - imageRepo = new Repository(newStack, 'Repository', {}); - vpc = new Vpc(newStack, 'Bucket', {}); - - stack = new EmbeddedLinuxPipelineStack(app, 'MyTestStack', { - env, - imageRepo, - vpc, - projectKind: ProjectKind.PokyAmi, - }); - - NagSuppressions.addStackSuppressions(stack, [ - { - id: 'CdkNagValidationFailure', - reason: 'Multiple Validation Failures.', - }, - { - id: 'AwsSolutions-CB3', - reason: 'CodeBuild Privilege mode is required for this pipeline.', - }, - - { - id: 'AwsSolutions-IAM4', - reason: 'TODO: Re-evaluate managed policies per resources.', - }, - ]); - - NagSuppressions.addResourceSuppressionsByPath( - stack, - '/MyTestStack/VMImportRole/Resource', - [ - { - id: 'AwsSolutions-IAM5', - reason: 'Read permissions needed on bucket.', - appliesTo: [ - { - regex: '/Resource::/\\*$/g', - }, - { - regex: '/Resource::arn:aws:ec2:eu-central-1::snapshot/\\*$/g', - }, - { - regex: '/Resource::\\*$/g', - }, - ], - }, - ] - ); - - NagSuppressions.addResourceSuppressionsByPath( - stack, - '/MyTestStack/EmbeddedLinuxBuildProject/Role/DefaultPolicy/Resource', - [ - { - id: 'AwsSolutions-IAM5', - reason: - 'This is a default CDK created role, with default policy permissions.', - }, - ] - ); - NagSuppressions.addResourceSuppressionsByPath( - stack, - '/MyTestStack/EmbeddedLinuxBuildProject/PolicyDocument/Resource', - [ - { - id: 'AwsSolutions-IAM5', - reason: - 'This is a default CDK created policy, with default policy permissions.', - }, - ] - ); - NagSuppressions.addResourceSuppressionsByPath( - stack, - '/MyTestStack/EmbeddedLinuxPipeline/Role/DefaultPolicy/Resource', - [ - { - id: 'AwsSolutions-IAM5', - reason: - 'This is a default CDK created policy, with default policy permissions.', - }, - ] - ); - NagSuppressions.addResourceSuppressionsByPath( - stack, - '/MyTestStack/EmbeddedLinuxPipeline/Source/Source/CodePipelineActionRole/DefaultPolicy/Resource', - [ - { - id: 'AwsSolutions-IAM5', - reason: - 'This is a default CDK created policy, with default policy permissions.', - }, - ] - ); - - NagSuppressions.addResourceSuppressionsByPath( - stack, - '/MyTestStack/LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8a/ServiceRole/DefaultPolicy/Resource', - [ - { - id: 'AwsSolutions-IAM5', - reason: - 'This is a default CDK created policy, with default policy permissions.', - }, - ] - ); - NagSuppressions.addResourceSuppressionsByPath( - stack, - '/MyTestStack/EmbeddedLinuxPipeline/Artifact/Artifact/CodePipelineActionRole/DefaultPolicy/Resource', - [ - { - id: 'AwsSolutions-IAM5', - reason: - 'This is a default CDK created policy, with default policy permissions.', - }, - ] - ); - NagSuppressions.addResourceSuppressionsByPath( - stack, - '/MyTestStack/OSImageCheckOnStart/Resource', - [ - { - id: 'AwsSolutions-L1', - reason: 'There is no latest PYTHON version to set.', - }, - ] - ); - // WHEN - Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); - }); - - // THEN - test('No unsuppressed Warnings', () => { - const warnings = Annotations.fromStack(stack).findWarning( - '*', - Match.stringLikeRegexp('AwsSolutions-.*') - ); - - expect(warnings).toHaveLength(0); - }); - - test('No unsuppressed Errors', () => { - const errors = Annotations.fromStack(stack).findError( - '*', - Match.stringLikeRegexp('AwsSolutions-.*') - ); - - expect(errors).toHaveLength(0); - }); -}); diff --git a/test/embedded-linux-pipeline.test.ts b/test/embedded-linux-pipeline.test.ts deleted file mode 100644 index d84a914..0000000 --- a/test/embedded-linux-pipeline.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Template } from 'aws-cdk-lib/assertions'; -import { EmbeddedLinuxPipelineStack } from '../lib/embedded-linux-pipeline'; -import { Repository } from 'aws-cdk-lib/aws-ecr'; -import { Vpc } from 'aws-cdk-lib/aws-ec2'; -import { ProjectKind } from '../lib'; -import { normalizedTemplateFromStack } from './util'; - -describe('Pipeline', () => { - const env = { account: '12341234', region: 'eu-central-1' }; - - test('Logs Have Retention', () => { - const app = new cdk.App(); - const newStack = new cdk.Stack(app, 'RepoStack', { env }); - const imageRepo = new Repository(newStack, 'Repository', {}); - const vpc = new Vpc(newStack, 'Bucket', {}); - - const stack = new EmbeddedLinuxPipelineStack(app, 'MyTestStack', { - env, - imageRepo, - vpc, - }); - const template = Template.fromStack(stack); - template.resourceCountIs('AWS::Logs::LogGroup', 1); - template.allResourcesProperties('AWS::Logs::LogGroup', { - RetentionInDays: 3653, - }); - }); - - test('S3 Bucket Has Versioning Enabled', () => { - const app = new cdk.App(); - const newStack = new cdk.Stack(app, 'RepoStack', { env }); - const imageRepo = new Repository(newStack, 'Repository', {}); - const vpc = new Vpc(newStack, 'Bucket', {}); - - const stack = new EmbeddedLinuxPipelineStack(app, 'MyTestStack', { - env, - imageRepo, - vpc, - }); - const template = Template.fromStack(stack); - template.allResourcesProperties('AWS::S3::Bucket', { - VersioningConfiguration: { Status: 'Enabled' }, - }); - }); - - test('Snapshot Poky Pipeline', () => { - const app = new cdk.App(); - const newStack = new cdk.Stack(app, 'RepoStack', { env }); - const imageRepo = new Repository(newStack, 'Repository', {}); - const vpc = new Vpc(newStack, 'Bucket', {}); - - const stack = new EmbeddedLinuxPipelineStack(app, 'MyTestStack', { - env, - imageRepo, - vpc, - }); - const template = Template.fromStack(stack); - expect(template).toMatchSnapshot(); - }); - - test('Snapshot Poky AMI Pipeline', () => { - const app = new cdk.App(); - const newStack = new cdk.Stack(app, 'RepoStack', { env }); - const imageRepo = new Repository(newStack, 'Repository', {}); - const vpc = new Vpc(newStack, 'Bucket', {}); - - const stack = new EmbeddedLinuxPipelineStack(app, 'MyTestStack', { - env, - imageRepo, - vpc, - projectKind: ProjectKind.PokyAmi, - }); - const template = normalizedTemplateFromStack(stack); - expect(template).toMatchSnapshot(); - }); - - test('Poky AMI Pipeline - check role name trim', () => { - const app = new cdk.App(); - const newStack = new cdk.Stack(app, 'RepoStack', { env }); - const imageRepo = new Repository(newStack, 'Repository', {}); - const vpc = new Vpc(newStack, 'Bucket', {}); - - const stack = new EmbeddedLinuxPipelineStack( - app, - 'PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992', - { - env, - imageRepo, - vpc, - projectKind: ProjectKind.PokyAmi, - } - ); - const template = normalizedTemplateFromStack(stack); - expect(template).toMatchSnapshot(); - }); -}); diff --git a/test/network.test-nag.test.ts b/test/network.test-nag.test.ts deleted file mode 100644 index cf085f9..0000000 --- a/test/network.test-nag.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { PipelineNetworkStack } from '../lib/network'; -import { Annotations, Match } from 'aws-cdk-lib/assertions'; -import { App, Aspects, Stack } from 'aws-cdk-lib'; -import { AwsSolutionsChecks } from 'cdk-nag'; - -describe('Pipeline Networking cdk-nag AwsSolutions Pack', () => { - const props = { - env: { account: '111111111111', region: 'eu-central-1' }, - }; - let stack: Stack; - let app: App; - // In this case we can use beforeAll() over beforeEach() since our tests - // do not modify the state of the application - beforeAll(() => { - // GIVEN - app = new App(); - stack = new PipelineNetworkStack(app, 'PipelineNetworkStack', props); - - // WHEN - Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); - }); - - // THEN - test('No unsuppressed Warnings', () => { - const warnings = Annotations.fromStack(stack).findWarning( - '*', - Match.stringLikeRegexp('AwsSolutions-.*') - ); - expect(warnings).toHaveLength(0); - }); - - test('No unsuppressed Errors', () => { - const errors = Annotations.fromStack(stack).findError( - '*', - Match.stringLikeRegexp('AwsSolutions-.*') - ); - expect(errors).toHaveLength(0); - }); -}); diff --git a/test/network.test.ts b/test/network.test.ts deleted file mode 100644 index 27609ee..0000000 --- a/test/network.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Template } from 'aws-cdk-lib/assertions'; -import { PipelineNetworkStack } from '../lib/network'; - -describe('Pipeline Networking', () => { - const props = { - env: { account: '111111111111', region: 'eu-central-1' }, - }; - - test('Logs Have Retention Period', () => { - const app = new cdk.App(); - const stack = new PipelineNetworkStack(app, 'PipelineNetworkStack', props); - const template = Template.fromStack(stack); - template.resourceCountIs('AWS::Logs::LogGroup', 1); - template.allResourcesProperties('AWS::Logs::LogGroup', { - RetentionInDays: 3653, - }); - }); - - test('Snapshot', () => { - const app = new cdk.App(); - const stack = new PipelineNetworkStack(app, 'PipelineNetworkStack', props); - const template = Template.fromStack(stack); - expect(template).toMatchSnapshot(); - }); -}); diff --git a/test/source-repo-nag.test.ts b/test/source-repo-nag.test.ts deleted file mode 100644 index 7e6ecd0..0000000 --- a/test/source-repo-nag.test.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { SourceRepo, ProjectKind } from '../lib/constructs/source-repo'; - -import { Annotations, Match } from 'aws-cdk-lib/assertions'; -import { App, Aspects, Stack } from 'aws-cdk-lib'; -import { AwsSolutionsChecks } from 'cdk-nag'; - -describe('Demo Source Repository cdk-nag AwsSolutions Pack', () => { - let stack: Stack; - let app: App; - - beforeAll(() => { - // GIVEN - const props = { - env: { account: '12341234', region: 'eu-central-1' }, - kind: ProjectKind.Poky, - repoName: 'charlie', - }; - - app = new App(); - stack = new Stack(app, 'TestStack', props); - new SourceRepo(stack, 'MyTestStack', props); - - // WHEN - Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); - }); - - // THEN - test('No unsuppressed Warnings', () => { - const warnings = Annotations.fromStack(stack).findWarning( - '*', - Match.stringLikeRegexp('AwsSolutions-.*') - ); - expect(warnings).toHaveLength(0); - }); - - test('No unsuppressed Errors', () => { - const errors = Annotations.fromStack(stack).findError( - '*', - Match.stringLikeRegexp('AwsSolutions-.*') - ); - expect(errors).toHaveLength(0); - }); -}); diff --git a/test/source-repo.test.ts b/test/source-repo.test.ts deleted file mode 100644 index 0ecaab0..0000000 --- a/test/source-repo.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as cdk from 'aws-cdk-lib'; -import { Template } from 'aws-cdk-lib/assertions'; -import { SourceRepo, ProjectKind } from '../lib/constructs/source-repo'; - -describe('Pipeline Source Repository', () => { - const props = { - env: { account: '12341234', region: 'eu-central-1' }, - kind: ProjectKind.Poky, - repoName: 'charlie', - }; - - test('Snapshot', () => { - const app = new cdk.App(); - const stack = new cdk.Stack(app, 'TestStack', props); - new SourceRepo(stack, 'MyTestStack', props); - const template = Template.fromStack(stack); - expect(template).toMatchSnapshot(); - }); -}); diff --git a/test/util.ts b/test/util.ts index 75afa2d..d071949 100644 --- a/test/util.ts +++ b/test/util.ts @@ -1,5 +1,5 @@ -import * as cdk from 'aws-cdk-lib'; -import { Template } from 'aws-cdk-lib/assertions'; +import * as cdk from "aws-cdk-lib"; +import { Template } from "aws-cdk-lib/assertions"; /** * Remove hashed asset values and put a normalized name in instead. @@ -9,9 +9,14 @@ export function normalizedTemplateFromStack(stack: cdk.Stack): Template { const templateWithConstKeys = JSON.parse( JSON.stringify(templateWithRandomKeys.toJSON()).replace( /[a-z0-9]{64}\.(zip|sh)/g, - 'arbitrary-file.ext' - ) + "arbitrary-file.ext", + ), ); return templateWithConstKeys; } + +export const DEFAULT_ENV = { + account: "111111111111", + region: "eu-central-1", +}; diff --git a/tsconfig.json b/tsconfig.json index a3c1c1c..b8ce2fc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,10 +2,7 @@ "compilerOptions": { "target": "ES2020", "module": "commonjs", - "lib": [ - "es2020", - "dom" - ], + "lib": ["es2020", "dom"], "declaration": true, "strict": true, "noImplicitAny": true, @@ -20,14 +17,9 @@ "inlineSources": true, "experimentalDecorators": true, "strictPropertyInitialization": false, - "typeRoots": [ - "./node_modules/@types" - ], - "outDir": "./dist" + "typeRoots": ["./node_modules/@types"], + "outDir": "./dist", + "resolveJsonModule": true }, - "exclude": [ - "node_modules", - "cdk.out", - "dist" - ] + "exclude": ["node_modules", "cdk.out", "dist"] } diff --git a/utils/build-assets.sh b/utils/build-assets.sh new file mode 100755 index 0000000..425cd67 --- /dev/null +++ b/utils/build-assets.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" + +WD="$SCRIPTPATH/.." + +# copy the folders into th dist folder +if [ -d $WD/dist/source-repo ]; then rm -rf $WD/dist/source-repo; fi +mkdir -p $WD/dist/source-repo +cp -r $WD/source-repo $WD/dist diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..542ddf3 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4843 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@ampproject/remapping@npm:^2.2.0": + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed + languageName: node + linkType: hard + +"@aws-cdk/asset-awscli-v1@npm:^2.2.208": + version: 2.2.224 + resolution: "@aws-cdk/asset-awscli-v1@npm:2.2.224" + checksum: 10c0/9199f2fc67faf0a7606e76241ad94ba25e81e361125933b648186869223a3e1b10698469f84216e14ef2fc04487302c4a9431463cf564c53919302a8ef5552df + languageName: node + linkType: hard + +"@aws-cdk/asset-kubectl-v20@npm:^2.1.3": + version: 2.1.4 + resolution: "@aws-cdk/asset-kubectl-v20@npm:2.1.4" + checksum: 10c0/ab9353104f8a49807c906ce0193a838c3c82f25e6fecfa5b5341d722730574b4b5824fbf62b17fe69f07df34796a3e77513a55327e05f34556b518b0424041d7 + languageName: node + linkType: hard + +"@aws-cdk/asset-node-proxy-agent-v6@npm:^2.1.0": + version: 2.1.0 + resolution: "@aws-cdk/asset-node-proxy-agent-v6@npm:2.1.0" + checksum: 10c0/1ac7bccf82afee69c05241a5ad66345fbd468678ce633bb43c5921c7241a3186231b3b65f9ac6b9924933349c826a9470c79a3ddf14a03fbfce43f14c4d957f2 + languageName: node + linkType: hard + +"@aws-cdk/cloud-assembly-schema@npm:^39.0.1": + version: 39.2.20 + resolution: "@aws-cdk/cloud-assembly-schema@npm:39.2.20" + dependencies: + jsonschema: "npm:~1.4.1" + semver: "npm:^7.7.1" + checksum: 10c0/94a96dc318627f2e3dfdd984134ad106f1e592d2eae41cd690069726c2f7aa4155e9f5196e71281eb199dc61b5f23cfbdbef59b8fda84d44da7a1aefb4a109af + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.26.5": + version: 7.26.8 + resolution: "@babel/compat-data@npm:7.26.8" + checksum: 10c0/66408a0388c3457fff1c2f6c3a061278dd7b3d2f0455ea29bb7b187fa52c60ae8b4054b3c0a184e21e45f0eaac63cf390737bc7504d1f4a088a6e7f652c068ca + languageName: node + linkType: hard + +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": + version: 7.26.9 + resolution: "@babel/core@npm:7.26.9" + dependencies: + "@ampproject/remapping": "npm:^2.2.0" + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.9" + "@babel/helper-compilation-targets": "npm:^7.26.5" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.9" + "@babel/parser": "npm:^7.26.9" + "@babel/template": "npm:^7.26.9" + "@babel/traverse": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/ed7212ff42a9453765787019b7d191b167afcacd4bd8fec10b055344ef53fa0cc648c9a80159ae4ecf870016a6318731e087042dcb68d1a2a9d34eb290dc014b + languageName: node + linkType: hard + +"@babel/generator@npm:^7.26.9, @babel/generator@npm:^7.7.2": + version: 7.26.9 + resolution: "@babel/generator@npm:7.26.9" + dependencies: + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10c0/6b78872128205224a9a9761b9ea7543a9a7902a04b82fc2f6801ead4de8f59056bab3fd17b1f834ca7b049555fc4c79234b9a6230dd9531a06525306050becad + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/helper-compilation-targets@npm:7.26.5" + dependencies: + "@babel/compat-data": "npm:^7.26.5" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/9da5c77e5722f1a2fcb3e893049a01d414124522bbf51323bb1a0c9dcd326f15279836450fc36f83c9e8a846f3c40e88be032ed939c5a9840922bed6073edfb4 + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" + dependencies: + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" + dependencies: + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.26.5 + resolution: "@babel/helper-plugin-utils@npm:7.26.5" + checksum: 10c0/cdaba71d4b891aa6a8dfbe5bac2f94effb13e5fa4c2c487667fdbaa04eae059b78b28d85a885071f45f7205aeb56d16759e1bed9c118b94b16e4720ef1ab0f65 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/helpers@npm:7.26.9" + dependencies: + "@babel/template": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + checksum: 10c0/3d4dbc4a33fe4181ed810cac52318b578294745ceaec07e2f6ecccf6cda55d25e4bfcea8f085f333bf911c9e1fc13320248dd1d5315ab47ad82ce1077410df05 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/parser@npm:7.26.9" + dependencies: + "@babel/types": "npm:^7.26.9" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/4b9ef3c9a0d4c328e5e5544f50fe8932c36f8a2c851e7f14a85401487cd3da75cad72c2e1bcec1eac55599a6bbb2fdc091f274c4fcafa6bdd112d4915ff087fc + languageName: node + linkType: hard + +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d13efb282838481348c71073b6be6245b35d4f2f964a8f71e4174f235009f929ef7613df25f8d2338e2d3e44bc4265a9f8638c6aaa136d7a61fe95985f9725c8 + languageName: node + linkType: hard + +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/686891b81af2bc74c39013655da368a480f17dd237bf9fbc32048e5865cb706d5a8f65438030da535b332b1d6b22feba336da8fa931f663b6b34e13147d12dde + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-properties@npm:^7.12.13": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.12.13" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/95168fa186416195280b1264fb18afcdcdcea780b3515537b766cb90de6ce042d42dd6a204a39002f794ae5845b02afb0fd4861a3308a861204a55e68310a120 + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-static-block@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/4464bf9115f4a2d02ce1454411baf9cfb665af1da53709c5c56953e5e2913745b0fcce82982a00463d6facbdd93445c691024e310b91431a1e2f024b158f6371 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-attributes@npm:^7.24.7": + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e594c185b12bfe0bbe7ca78dfeebe870e6d569a12128cac86f3164a075fe0ff70e25ddbd97fd0782906b91f65560c9dc6957716b7b4a68aba2516c9b7455e352 + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/0b08b5e4c3128523d8e346f8cfc86824f0da2697b1be12d71af50a31aff7a56ceb873ed28779121051475010c28d6146a6bfea8518b150b71eeb4e46190172ee + languageName: node + linkType: hard + +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e98f31b2ec406c57757d115aac81d0336e8434101c224edd9a5c93cefa53faf63eacc69f3138960c8b25401315af03df37f68d316c151c4b933136716ed6906e + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.25.9 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/d56597aff4df39d3decda50193b6dfbe596ca53f437ff2934622ce19a743bf7f43492d3fb3308b0289f5cee2b825d99ceb56526a2b9e7b68bf04901546c5618c + languageName: node + linkType: hard + +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2594cfbe29411ad5bc2ad4058de7b2f6a8c5b86eda525a993959438615479e59c012c14aec979e538d60a584a1a799b60d1b8942c3b18468cb9d99b8fd34cd0b + languageName: node + linkType: hard + +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/2024fbb1162899094cfc81152449b12bd0cc7053c6d4bda8ac2852545c87d0a851b1b72ed9560673cbf3ef6248257262c3c04aabf73117215c1b9cc7dd2542ce + languageName: node + linkType: hard + +"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.10.4" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/c55a82b3113480942c6aa2fcbe976ff9caa74b7b1109ff4369641dfbc88d1da348aceb3c31b6ed311c84d1e7c479440b961906c735d0ab494f688bf2fd5b9bb9 + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/ee1eab52ea6437e3101a0a7018b0da698545230015fc8ab129d292980ec6dff94d265e9e90070e8ae5fed42f08f1622c14c94552c77bcac784b37f503a82ff26 + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/27e2493ab67a8ea6d693af1287f7e9acec206d1213ff107a928e85e173741e1d594196f99fec50e9dde404b09164f39dec5864c767212154ffe1caa6af0bc5af + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.8.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/46edddf2faa6ebf94147b8e8540dfc60a5ab718e2de4d01b2c0bdf250a4d642c2bd47cbcbb739febcb2bf75514dbcefad3c52208787994b8d0f8822490f55e81 + languageName: node + linkType: hard + +"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/69822772561706c87f0a65bc92d0772cea74d6bc0911537904a676d5ff496a6d3ac4e05a166d8125fce4a16605bace141afc3611074e170a994e66e5397787f3 + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/14bf6e65d5bc1231ffa9def5f0ef30b19b51c218fcecaa78cd1bdf7939dfdf23f90336080b7f5196916368e399934ce5d581492d8292b46a2fb569d8b2da106f + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.25.9 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/5192ebe11bd46aea68b7a60fd9555465c59af7e279e71126788e59121b86e00b505816685ab4782abe159232b0f73854e804b54449820b0d950b397ee158caa2 + languageName: node + linkType: hard + +"@babel/template@npm:^7.26.9, @babel/template@npm:^7.3.3": + version: 7.26.9 + resolution: "@babel/template@npm:7.26.9" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + checksum: 10c0/019b1c4129cc01ad63e17529089c2c559c74709d225f595eee017af227fee11ae8a97a6ab19ae6768b8aa22d8d75dcb60a00b28f52e9fa78140672d928bc1ae9 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/traverse@npm:7.26.9" + dependencies: + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.9" + "@babel/parser": "npm:^7.26.9" + "@babel/template": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + debug: "npm:^4.3.1" + globals: "npm:^11.1.0" + checksum: 10c0/51dd57fa39ea34d04816806bfead04c74f37301269d24c192d1406dc6e244fea99713b3b9c5f3e926d9ef6aa9cd5c062ad4f2fc1caa9cf843d5e864484ac955e + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.9, @babel/types@npm:^7.3.3": + version: 7.26.9 + resolution: "@babel/types@npm:7.26.9" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10c0/999c56269ba00e5c57aa711fbe7ff071cd6990bafd1b978341ea7572cc78919986e2aa6ee51dacf4b6a7a6fa63ba4eb3f1a03cf55eee31b896a56d068b895964 + languageName: node + linkType: hard + +"@balena/dockerignore@npm:^1.0.2": + version: 1.0.2 + resolution: "@balena/dockerignore@npm:1.0.2" + checksum: 10c0/0bcb067e86f6734ab943ce4ce9a7c8611f2e983a70bccebf9d2309db57695c09dded7faf5be49c929c4c9e9a9174ae55fc625626de0fb9958823c37423d12f4e + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 10c0/6b80ae4cb3db53f486da2dc63b6e190a74c8c3cca16bb2733f234a0b6a9382b09b146488ae08e2b22cf00f6c83e20f3e040a2f7894f05c045c946d6a090b1d52 + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 10c0/05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/2aa0ac2fc50ff3f234408b10900ed4f1a0b19352f21346ad4cc3d83a1271481bdda11097baa45d484dd564c895e0762a27a8240be7a256b3ad47129e96528252 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 + languageName: node + linkType: hard + +"@eslint/compat@npm:^1.2.4": + version: 1.2.6 + resolution: "@eslint/compat@npm:1.2.6" + peerDependencies: + eslint: ^9.10.0 + peerDependenciesMeta: + eslint: + optional: true + checksum: 10c0/e767b62f1e43a1b4e3f9f1ac64546f8bcdf4f3fb84c504d8f1b0ea31a71f1607bcd11288c86c77b8ddd3d0bba9a9513d7203d4e6d15b1b3a1cff7718dea61b40 + languageName: node + linkType: hard + +"@eslint/config-array@npm:^0.19.0": + version: 0.19.2 + resolution: "@eslint/config-array@npm:0.19.2" + dependencies: + "@eslint/object-schema": "npm:^2.1.6" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10c0/dd68da9abb32d336233ac4fe0db1e15a0a8d794b6e69abb9e57545d746a97f6f542496ff9db0d7e27fab1438546250d810d90b1904ac67677215b8d8e7573f3d + languageName: node + linkType: hard + +"@eslint/core@npm:^0.11.0": + version: 0.11.0 + resolution: "@eslint/core@npm:0.11.0" + dependencies: + "@types/json-schema": "npm:^7.0.15" + checksum: 10c0/1e0671d035c908175f445864a7864cf6c6a8b67a5dfba8c47b2ac91e2d3ed36e8c1f2fd81d98a73264f8677055559699d4adb0f97d86588e616fc0dc9a4b86c9 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.2.0": + version: 3.2.0 + resolution: "@eslint/eslintrc@npm:3.2.0" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/43867a07ff9884d895d9855edba41acf325ef7664a8df41d957135a81a477ff4df4196f5f74dc3382627e5cc8b7ad6b815c2cea1b58f04a75aced7c43414ab8b + languageName: node + linkType: hard + +"@eslint/js@npm:9.20.0, @eslint/js@npm:^9.16.0": + version: 9.20.0 + resolution: "@eslint/js@npm:9.20.0" + checksum: 10c0/10e7b5b9e628b5192e8fc6b0ecd27cf48322947e83e999ff60f9f9e44ac8d499138bcb9383cbfa6e51e780d53b4e76ccc2d1753b108b7173b8404fd484d37328 + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.6": + version: 2.1.6 + resolution: "@eslint/object-schema@npm:2.1.6" + checksum: 10c0/b8cdb7edea5bc5f6a96173f8d768d3554a628327af536da2fc6967a93b040f2557114d98dbcdbf389d5a7b290985ad6a9ce5babc547f36fc1fde42e674d11a56 + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.2.5": + version: 0.2.6 + resolution: "@eslint/plugin-kit@npm:0.2.6" + dependencies: + "@eslint/core": "npm:^0.11.0" + levn: "npm:^0.4.1" + checksum: 10c0/2d4cc4497c62e2a6437039fdd778911d768b0706c6256568c4ff1ad8724f663b2fa04a5873db6a20a812be11166e78e0346acfde4b7149e10e92f7b0075a976e + languageName: node + linkType: hard + +"@gerrit0/mini-shiki@npm:^1.24.0": + version: 1.27.2 + resolution: "@gerrit0/mini-shiki@npm:1.27.2" + dependencies: + "@shikijs/engine-oniguruma": "npm:^1.27.2" + "@shikijs/types": "npm:^1.27.2" + "@shikijs/vscode-textmate": "npm:^10.0.1" + checksum: 10c0/aee681637d123e0e8c9ec154b117ce166dd8b4b9896341e617fef16d0b21ef91a17f6f90cc874137e33ca85b5898817b59bb8aea178cdb2fa6e75b0fff3640c2 + languageName: node + linkType: hard + +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 10c0/aa4e0152171c07879b458d0e8a704b8c3a89a8c0541726c6b65b81e84fd8b7564b5d6c633feadc6598307d34564bd53294b533491424e8e313d7ab6c7bc5dc67 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" + dependencies: + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.3.0" + checksum: 10c0/8356359c9f60108ec204cbd249ecd0356667359b2524886b357617c4a7c3b6aace0fd5a369f63747b926a762a88f8a25bc066fa1778508d110195ce7686243e1 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: 10c0/f0da1282dfb45e8120480b9e2e275e2ac9bbe1cf016d046fdad8e27cc1285c45bb9e711681237944445157b430093412b4446c1ab3fc4bb037861b5904101d3b + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.4.1": + version: 0.4.1 + resolution: "@humanwhocodes/retry@npm:0.4.1" + checksum: 10c0/be7bb6841c4c01d0b767d9bb1ec1c9359ee61421ce8ba66c249d035c5acdfd080f32d55a5c9e859cdd7868788b8935774f65b2caf24ec0b7bd7bf333791f063b + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 + languageName: node + linkType: hard + +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" + dependencies: + camelcase: "npm:^5.3.1" + find-up: "npm:^4.1.0" + get-package-type: "npm:^0.1.0" + js-yaml: "npm:^3.13.1" + resolve-from: "npm:^5.0.0" + checksum: 10c0/dd2a8b094887da5a1a2339543a4933d06db2e63cbbc2e288eb6431bd832065df0c099d091b6a67436e71b7d6bf85f01ce7c15f9253b4cbebcc3b9a496165ba42 + languageName: node + linkType: hard + +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 10c0/61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a + languageName: node + linkType: hard + +"@jest/console@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/console@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/7be408781d0a6f657e969cbec13b540c329671819c2f57acfad0dae9dbfe2c9be859f38fe99b35dba9ff1536937dc6ddc69fdcd2794812fa3c647a1619797f6c + languageName: node + linkType: hard + +"@jest/core@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/core@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/reporters": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-changed-files: "npm:^29.7.0" + jest-config: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-resolve-dependencies: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-ansi: "npm:^6.0.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/934f7bf73190f029ac0f96662c85cd276ec460d407baf6b0dbaec2872e157db4d55a7ee0b1c43b18874602f662b37cb973dda469a4e6d88b4e4845b521adeeb2 + languageName: node + linkType: hard + +"@jest/environment@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/environment@npm:29.7.0" + dependencies: + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + checksum: 10c0/c7b1b40c618f8baf4d00609022d2afa086d9c6acc706f303a70bb4b67275868f620ad2e1a9efc5edd418906157337cce50589a627a6400bbdf117d351b91ef86 + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect-utils@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + checksum: 10c0/60b79d23a5358dc50d9510d726443316253ecda3a7fb8072e1526b3e0d3b14f066ee112db95699b7a43ad3f0b61b750c72e28a5a1cac361d7a2bb34747fa938a + languageName: node + linkType: hard + +"@jest/expect@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/expect@npm:29.7.0" + dependencies: + expect: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b41f193fb697d3ced134349250aed6ccea075e48c4f803159db102b826a4e473397c68c31118259868fd69a5cba70e97e1c26d2c2ff716ca39dc73a2ccec037e + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/fake-timers@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@sinonjs/fake-timers": "npm:^10.0.2" + "@types/node": "npm:*" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/cf0a8bcda801b28dc2e2b2ba36302200ee8104a45ad7a21e6c234148932f826cb3bc57c8df3b7b815aeea0861d7b6ca6f0d4778f93b9219398ef28749e03595c + languageName: node + linkType: hard + +"@jest/globals@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/globals@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + jest-mock: "npm:^29.7.0" + checksum: 10c0/a385c99396878fe6e4460c43bd7bb0a5cc52befb462cc6e7f2a3810f9e7bcce7cdeb51908fd530391ee452dc856c98baa2c5f5fa8a5b30b071d31ef7f6955cea + languageName: node + linkType: hard + +"@jest/reporters@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/reporters@npm:29.7.0" + dependencies: + "@bcoe/v8-coverage": "npm:^0.2.3" + "@jest/console": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + collect-v8-coverage: "npm:^1.0.0" + exit: "npm:^0.1.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + istanbul-lib-coverage: "npm:^3.0.0" + istanbul-lib-instrument: "npm:^6.0.0" + istanbul-lib-report: "npm:^3.0.0" + istanbul-lib-source-maps: "npm:^4.0.0" + istanbul-reports: "npm:^3.1.3" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + slash: "npm:^3.0.0" + string-length: "npm:^4.0.1" + strip-ansi: "npm:^6.0.0" + v8-to-istanbul: "npm:^9.0.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 10c0/a754402a799541c6e5aff2c8160562525e2a47e7d568f01ebfc4da66522de39cbb809bbb0a841c7052e4270d79214e70aec3c169e4eae42a03bc1a8a20cb9fa2 + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" + dependencies: + "@sinclair/typebox": "npm:^0.27.8" + checksum: 10c0/b329e89cd5f20b9278ae1233df74016ebf7b385e0d14b9f4c1ad18d096c4c19d1e687aa113a9c976b16ec07f021ae53dea811fb8c1248a50ac34fbe009fdf6be + languageName: node + linkType: hard + +"@jest/source-map@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/source-map@npm:29.6.3" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.18" + callsites: "npm:^3.0.0" + graceful-fs: "npm:^4.2.9" + checksum: 10c0/a2f177081830a2e8ad3f2e29e20b63bd40bade294880b595acf2fc09ec74b6a9dd98f126a2baa2bf4941acd89b13a4ade5351b3885c224107083a0059b60a219 + languageName: node + linkType: hard + +"@jest/test-result@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-result@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + collect-v8-coverage: "npm:^1.0.0" + checksum: 10c0/7de54090e54a674ca173470b55dc1afdee994f2d70d185c80236003efd3fa2b753fff51ffcdda8e2890244c411fd2267529d42c4a50a8303755041ee493e6a04 + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/test-sequencer@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + slash: "npm:^3.0.0" + checksum: 10c0/593a8c4272797bb5628984486080cbf57aed09c7cfdc0a634e8c06c38c6bef329c46c0016e84555ee55d1cd1f381518cf1890990ff845524c1123720c8c1481b + languageName: node + linkType: hard + +"@jest/transform@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/transform@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/types": "npm:^29.6.3" + "@jridgewell/trace-mapping": "npm:^0.3.18" + babel-plugin-istanbul: "npm:^6.1.1" + chalk: "npm:^4.0.0" + convert-source-map: "npm:^2.0.0" + fast-json-stable-stringify: "npm:^2.1.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + pirates: "npm:^4.0.4" + slash: "npm:^3.0.0" + write-file-atomic: "npm:^4.0.2" + checksum: 10c0/7f4a7f73dcf45dfdf280c7aa283cbac7b6e5a904813c3a93ead7e55873761fc20d5c4f0191d2019004fac6f55f061c82eb3249c2901164ad80e362e7a7ede5a6 + languageName: node + linkType: hard + +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" + dependencies: + "@jest/schemas": "npm:^29.6.3" + "@types/istanbul-lib-coverage": "npm:^2.0.0" + "@types/istanbul-reports": "npm:^3.0.0" + "@types/node": "npm:*" + "@types/yargs": "npm:^17.0.8" + chalk: "npm:^4.0.0" + checksum: 10c0/ea4e493dd3fb47933b8ccab201ae573dcc451f951dc44ed2a86123cd8541b82aa9d2b1031caf9b1080d6673c517e2dcc25a44b2dc4f3fbc37bfc965d444888c0 + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: 10c0/fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + +"@microsoft/tsdoc-config@npm:0.17.1": + version: 0.17.1 + resolution: "@microsoft/tsdoc-config@npm:0.17.1" + dependencies: + "@microsoft/tsdoc": "npm:0.15.1" + ajv: "npm:~8.12.0" + jju: "npm:~1.4.0" + resolve: "npm:~1.22.2" + checksum: 10c0/a686355796f492f27af17e2a17d615221309caf4d9f9047a5a8f17f8625c467c4c81e2a7923ddafd71b892631d5e5013c4b8cc49c5867d3cc1d260fd90c1413d + languageName: node + linkType: hard + +"@microsoft/tsdoc@npm:0.15.1": + version: 0.15.1 + resolution: "@microsoft/tsdoc@npm:0.15.1" + checksum: 10c0/09948691fac56c45a0d1920de478d66a30371a325bd81addc92eea5654d95106ce173c440fea1a1bd5bb95b3a544b6d4def7bb0b5a846c05d043575d8369a20c + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 + languageName: node + linkType: hard + +"@pkgr/core@npm:^0.1.0": + version: 0.1.1 + resolution: "@pkgr/core@npm:0.1.1" + checksum: 10c0/3f7536bc7f57320ab2cf96f8973664bef624710c403357429fbf680a5c3b4843c1dbd389bb43daa6b1f6f1f007bb082f5abcb76bb2b5dc9f421647743b71d3d8 + languageName: node + linkType: hard + +"@shikijs/engine-oniguruma@npm:^1.27.2": + version: 1.29.2 + resolution: "@shikijs/engine-oniguruma@npm:1.29.2" + dependencies: + "@shikijs/types": "npm:1.29.2" + "@shikijs/vscode-textmate": "npm:^10.0.1" + checksum: 10c0/87d77e05af7fe862df40899a7034cbbd48d3635e27706873025e5035be578584d012f850208e97ca484d5e876bf802d4e23d0394d25026adb678eeb1d1f340ff + languageName: node + linkType: hard + +"@shikijs/types@npm:1.29.2, @shikijs/types@npm:^1.27.2": + version: 1.29.2 + resolution: "@shikijs/types@npm:1.29.2" + dependencies: + "@shikijs/vscode-textmate": "npm:^10.0.1" + "@types/hast": "npm:^3.0.4" + checksum: 10c0/37b4ac315effc03e7185aca1da0c2631ac55bdf613897476bd1d879105c41f86ccce6ebd0b78779513d88cc2ee371039f7efd95d604f77f21f180791978822b3 + languageName: node + linkType: hard + +"@shikijs/vscode-textmate@npm:^10.0.1": + version: 10.0.2 + resolution: "@shikijs/vscode-textmate@npm:10.0.2" + checksum: 10c0/36b682d691088ec244de292dc8f91b808f95c89466af421cf84cbab92230f03c8348649c14b3251991b10ce632b0c715e416e992dd5f28ff3221dc2693fd9462 + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.27.8": + version: 0.27.8 + resolution: "@sinclair/typebox@npm:0.27.8" + checksum: 10c0/ef6351ae073c45c2ac89494dbb3e1f87cc60a93ce4cde797b782812b6f97da0d620ae81973f104b43c9b7eaa789ad20ba4f6a1359f1cc62f63729a55a7d22d4e + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^3.0.0": + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" + dependencies: + type-detect: "npm:4.0.8" + checksum: 10c0/1227a7b5bd6c6f9584274db996d7f8cee2c8c350534b9d0141fc662eaf1f292ea0ae3ed19e5e5271c8fd390d27e492ca2803acd31a1978be2cdc6be0da711403 + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.3.0 + resolution: "@sinonjs/fake-timers@npm:10.3.0" + dependencies: + "@sinonjs/commons": "npm:^3.0.0" + checksum: 10c0/2e2fb6cc57f227912814085b7b01fede050cd4746ea8d49a1e44d5a0e56a804663b0340ae2f11af7559ea9bf4d087a11f2f646197a660ea3cb04e19efc04aa63 + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node10@npm:1.0.11" + checksum: 10c0/28a0710e5d039e0de484bdf85fee883bfd3f6a8980601f4d44066b0a6bcd821d31c4e231d1117731c4e24268bd4cf2a788a6787c12fc7f8d11014c07d582783c + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 10c0/dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 10c0/67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 10c0/05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.1.14": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" + dependencies: + "@babel/parser": "npm:^7.20.7" + "@babel/types": "npm:^7.20.7" + "@types/babel__generator": "npm:*" + "@types/babel__template": "npm:*" + "@types/babel__traverse": "npm:*" + checksum: 10c0/bdee3bb69951e833a4b811b8ee9356b69a61ed5b7a23e1a081ec9249769117fa83aaaf023bb06562a038eb5845155ff663e2d5c75dd95c1d5ccc91db012868ff + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.8 + resolution: "@types/babel__generator@npm:7.6.8" + dependencies: + "@babel/types": "npm:^7.0.0" + checksum: 10c0/f0ba105e7d2296bf367d6e055bb22996886c114261e2cb70bf9359556d0076c7a57239d019dee42bb063f565bade5ccb46009bce2044b2952d964bf9a454d6d2 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.4 + resolution: "@types/babel__template@npm:7.4.4" + dependencies: + "@babel/parser": "npm:^7.1.0" + "@babel/types": "npm:^7.0.0" + checksum: 10c0/cc84f6c6ab1eab1427e90dd2b76ccee65ce940b778a9a67be2c8c39e1994e6f5bbc8efa309f6cea8dc6754994524cd4d2896558df76d92e7a1f46ecffee7112b + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" + dependencies: + "@babel/types": "npm:^7.20.7" + checksum: 10c0/7ba7db61a53e28cac955aa99af280d2600f15a8c056619c05b6fc911cbe02c61aa4f2823299221b23ce0cce00b294c0e5f618ec772aa3f247523c2e48cf7b888 + languageName: node + linkType: hard + +"@types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.9 + resolution: "@types/graceful-fs@npm:4.1.9" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/235d2fc69741448e853333b7c3d1180a966dd2b8972c8cbcd6b2a0c6cd7f8d582ab2b8e58219dbc62cce8f1b40aa317ff78ea2201cdd8249da5025adebed6f0b + languageName: node + linkType: hard + +"@types/hast@npm:^3.0.4": + version: 3.0.4 + resolution: "@types/hast@npm:3.0.4" + dependencies: + "@types/unist": "npm:*" + checksum: 10c0/3249781a511b38f1d330fd1e3344eed3c4e7ea8eff82e835d35da78e637480d36fad37a78be5a7aed8465d237ad0446abc1150859d0fde395354ea634decf9f7 + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 10c0/3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" + dependencies: + "@types/istanbul-lib-coverage": "npm:*" + checksum: 10c0/247e477bbc1a77248f3c6de5dadaae85ff86ac2d76c5fc6ab1776f54512a745ff2a5f791d22b942e3990ddbd40f3ef5289317c4fca5741bedfaa4f01df89051c + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" + dependencies: + "@types/istanbul-lib-report": "npm:*" + checksum: 10c0/1647fd402aced5b6edac87274af14ebd6b3a85447ef9ad11853a70fd92a98d35f81a5d3ea9fcb5dbb5834e800c6e35b64475e33fcae6bfa9acc70d61497c54ee + languageName: node + linkType: hard + +"@types/jest@npm:^29.5.14": + version: 29.5.14 + resolution: "@types/jest@npm:29.5.14" + dependencies: + expect: "npm:^29.0.0" + pretty-format: "npm:^29.0.0" + checksum: 10c0/18e0712d818890db8a8dab3d91e9ea9f7f19e3f83c2e50b312f557017dc81466207a71f3ed79cf4428e813ba939954fa26ffa0a9a7f153181ba174581b1c2aed + languageName: node + linkType: hard + +"@types/json-schema@npm:^7.0.15": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 22.13.4 + resolution: "@types/node@npm:22.13.4" + dependencies: + undici-types: "npm:~6.20.0" + checksum: 10c0/3a234fa7766a3efc382cf81f66f474c26cdab2f54f43f757634c81c0444eb2160c2dabbde9741e4983078a318a88515b65416b5f1ab5478548579d7b3ead1d95 + languageName: node + linkType: hard + +"@types/node@npm:20.14.8": + version: 20.14.8 + resolution: "@types/node@npm:20.14.8" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 10c0/06d4643fa3b179b41fe19f9c75c240278ca1f7a313b3b837bc36ea119499c7ad77f06bbe72694ac04aa91ec77fe747baa09b889f4c435450c1724a26bd55f160 + languageName: node + linkType: hard + +"@types/stack-utils@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/stack-utils@npm:2.0.3" + checksum: 10c0/1f4658385ae936330581bcb8aa3a066df03867d90281cdf89cc356d404bd6579be0f11902304e1f775d92df22c6dd761d4451c804b0a4fba973e06211e9bd77c + languageName: node + linkType: hard + +"@types/unist@npm:*": + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 10c0/2b1e4adcab78388e088fcc3c0ae8700f76619dbcb4741d7d201f87e2cb346bfc29a89003cfea2d76c996e1061452e14fcd737e8b25aacf949c1f2d6b2bc3dd60 + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: 10c0/e71c3bd9d0b73ca82e10bee2064c384ab70f61034bbfb78e74f5206283fc16a6d85267b606b5c22cb2a3338373586786fed595b2009825d6a9115afba36560a0 + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.33 + resolution: "@types/yargs@npm:17.0.33" + dependencies: + "@types/yargs-parser": "npm:*" + checksum: 10c0/d16937d7ac30dff697801c3d6f235be2166df42e4a88bf730fa6dc09201de3727c0a9500c59a672122313341de5f24e45ee0ff579c08ce91928e519090b7906b + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:8.24.1, @typescript-eslint/eslint-plugin@npm:^8.18.0": + version: 8.24.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.24.1" + dependencies: + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.24.1" + "@typescript-eslint/type-utils": "npm:8.24.1" + "@typescript-eslint/utils": "npm:8.24.1" + "@typescript-eslint/visitor-keys": "npm:8.24.1" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.3.1" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^2.0.1" + peerDependencies: + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10c0/fe5f56f248370f40322a7cb2d96fbab724a7a8892895e3d41027c9a1df309916433633e04df84a1d3f9535d282953738b1ad627d8af37ab288a39a6e411afd76 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:8.24.1, @typescript-eslint/parser@npm:^8.18.0": + version: 8.24.1 + resolution: "@typescript-eslint/parser@npm:8.24.1" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.24.1" + "@typescript-eslint/types": "npm:8.24.1" + "@typescript-eslint/typescript-estree": "npm:8.24.1" + "@typescript-eslint/visitor-keys": "npm:8.24.1" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10c0/9de557698c8debf3de06b6adf6aa06a8345e0e38600e5ccbeda62270d1a4a757dfa191db89d4e86cf373103a11bef1965c9d9889f622c51f4f26d1bf12394ae3 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/scope-manager@npm:8.24.1" + dependencies: + "@typescript-eslint/types": "npm:8.24.1" + "@typescript-eslint/visitor-keys": "npm:8.24.1" + checksum: 10c0/779880743ed7ab67fe477f1ad5648bbd77ad69b4663b5a42024112004c8f231049b1e4eeb67e260005769c3bb005049e00a80b885e19d593ffb080bd39f4fa94 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/type-utils@npm:8.24.1" + dependencies: + "@typescript-eslint/typescript-estree": "npm:8.24.1" + "@typescript-eslint/utils": "npm:8.24.1" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^2.0.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10c0/ba248bc12068383374d9d077f9cca1815f347ea008d04d08ad7a54dbef70189a0da7872246f8369e6d30938fa7e408dadcda0ae71041be68fc836c886dd9c3ab + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/types@npm:8.24.1" + checksum: 10c0/ebb40ce16c746ef236dbcc25cb2e6950753ca6fb34d04ed7d477016370de1fdaf7402ed4569673c6ff14bf60af7124ff45c6ddd9328d2f8c94dc04178368e2a3 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.24.1" + dependencies: + "@typescript-eslint/types": "npm:8.24.1" + "@typescript-eslint/visitor-keys": "npm:8.24.1" + debug: "npm:^4.3.4" + fast-glob: "npm:^3.3.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^2.0.1" + peerDependencies: + typescript: ">=4.8.4 <5.8.0" + checksum: 10c0/8eeeae6e8de1cd83f2eddd52293e9c31a655e0974cc2d410f00ba2b6fd6bb9aec1c346192d5784d64d0d1b15a55e56e35550788c04dda87e0f1a99b21a3eb709 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/utils@npm:8.24.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@typescript-eslint/scope-manager": "npm:8.24.1" + "@typescript-eslint/types": "npm:8.24.1" + "@typescript-eslint/typescript-estree": "npm:8.24.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10c0/b3300d5c7e18ec524a46bf683052539f24df0d8c709e39e3bde9dfc6c65180610c46b875f1f4eaad5e311193a56acdfd7111a73f1e8aec4108e9cd19561bf8b8 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:8.24.1": + version: 8.24.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.24.1" + dependencies: + "@typescript-eslint/types": "npm:8.24.1" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10c0/ba09412fb4b1605aa73c890909c9a8dba2aa72e00ccd7d69baad17c564eedd77f489a06b1686985c7f0c49724787b82d76dcf4c146c4de44ef2c8776a9b6ad2b + languageName: node + linkType: hard + +"abbrev@npm:^3.0.0": + version: 3.0.0 + resolution: "abbrev@npm:3.0.0" + checksum: 10c0/049704186396f571650eb7b22ed3627b77a5aedf98bb83caf2eac81ca2a3e25e795394b0464cfb2d6076df3db6a5312139eac5b6a126ca296ac53c5008069c28 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 + languageName: node + linkType: hard + +"acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.4.1": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 + languageName: node + linkType: hard + +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.3 + resolution: "agent-base@npm:7.1.3" + checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"ajv@npm:^8.0.1": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 + languageName: node + linkType: hard + +"ajv@npm:~8.12.0": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" + dependencies: + fast-deep-equal: "npm:^3.1.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js: "npm:^4.2.2" + checksum: 10c0/ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: 10c0/9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df + languageName: node + linkType: hard + +"anymatch@npm:^3.0.3": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 10c0/f63d439cc383db1b9c5c6080d1e240bd14dae745f15d11ec5da863e182bbeca70df6c8191cffef5deba0b566ef98834610a68be79ac6379c95eeb26e1b310e25 + languageName: node + linkType: hard + +"async@npm:^3.2.3": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 + languageName: node + linkType: hard + +"aws-cdk-lib@npm:2.176.0": + version: 2.176.0 + resolution: "aws-cdk-lib@npm:2.176.0" + dependencies: + "@aws-cdk/asset-awscli-v1": "npm:^2.2.208" + "@aws-cdk/asset-kubectl-v20": "npm:^2.1.3" + "@aws-cdk/asset-node-proxy-agent-v6": "npm:^2.1.0" + "@aws-cdk/cloud-assembly-schema": "npm:^39.0.1" + "@balena/dockerignore": "npm:^1.0.2" + case: "npm:1.6.3" + fs-extra: "npm:^11.2.0" + ignore: "npm:^5.3.2" + jsonschema: "npm:^1.4.1" + mime-types: "npm:^2.1.35" + minimatch: "npm:^3.1.2" + punycode: "npm:^2.3.1" + semver: "npm:^7.6.3" + table: "npm:^6.8.2" + yaml: "npm:1.10.2" + peerDependencies: + constructs: ^10.0.0 + checksum: 10c0/8b2506f6245572b508dbe4221f1fd64161bae46aea26686f3616b8c34cedbd1bc3c7b0a8f65722c625f945805dad52976f3564dbfa05afe4dcd39b1cfdc3fe1b + languageName: node + linkType: hard + +"aws-cdk@npm:2.176.0": + version: 2.176.0 + resolution: "aws-cdk@npm:2.176.0" + dependencies: + fsevents: "npm:2.3.2" + dependenciesMeta: + fsevents: + optional: true + bin: + cdk: bin/cdk + checksum: 10c0/861dddf7dcc67806c9dae85e191af94080c6e76aaf47bf29c9b3971c6277738c5dbc64609c220b32ef4885d788360614aa1241617803d730dc1f77db2c5b7c23 + languageName: node + linkType: hard + +"aws4embeddedlinux-cdk-lib@workspace:.": + version: 0.0.0-use.local + resolution: "aws4embeddedlinux-cdk-lib@workspace:." + dependencies: + "@eslint/compat": "npm:^1.2.4" + "@eslint/eslintrc": "npm:^3.2.0" + "@eslint/js": "npm:^9.16.0" + "@types/jest": "npm:^29.5.14" + "@types/node": "npm:20.14.8" + "@typescript-eslint/eslint-plugin": "npm:^8.18.0" + "@typescript-eslint/parser": "npm:^8.18.0" + aws-cdk: "npm:2.176.0" + aws-cdk-lib: "npm:2.176.0" + cdk-nag: "npm:^2.35.0" + constructs: "npm:^10.4.2" + eslint: "npm:^9.16.0" + eslint-config-prettier: "npm:^9.1.0" + eslint-plugin-prettier: "npm:^5.2.1" + eslint-plugin-tsdoc: "npm:^0.4.0" + globals: "npm:^15.13.0" + jest: "npm:^29.7.0" + prettier: "npm:^3.4.2" + ts-jest: "npm:^29.2.5" + ts-node: "npm:^10.9.2" + typedoc: "npm:^0.27.4" + typescript: "npm:~5.7.2" + typescript-eslint: "npm:^8.18.0" + languageName: unknown + linkType: soft + +"babel-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "babel-jest@npm:29.7.0" + dependencies: + "@jest/transform": "npm:^29.7.0" + "@types/babel__core": "npm:^7.1.14" + babel-plugin-istanbul: "npm:^6.1.1" + babel-preset-jest: "npm:^29.6.3" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + slash: "npm:^3.0.0" + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 10c0/2eda9c1391e51936ca573dd1aedfee07b14c59b33dbe16ef347873ddd777bcf6e2fc739681e9e9661ab54ef84a3109a03725be2ac32cd2124c07ea4401cbe8c1 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@istanbuljs/load-nyc-config": "npm:^1.0.0" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-instrument: "npm:^5.0.4" + test-exclude: "npm:^6.0.0" + checksum: 10c0/1075657feb705e00fd9463b329921856d3775d9867c5054b449317d39153f8fbcebd3e02ebf00432824e647faff3683a9ca0a941325ef1afe9b3c4dd51b24beb + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-plugin-jest-hoist@npm:29.6.3" + dependencies: + "@babel/template": "npm:^7.3.3" + "@babel/types": "npm:^7.3.3" + "@types/babel__core": "npm:^7.1.14" + "@types/babel__traverse": "npm:^7.0.6" + checksum: 10c0/7e6451caaf7dce33d010b8aafb970e62f1b0c0b57f4978c37b0d457bbcf0874d75a395a102daf0bae0bd14eafb9f6e9a165ee5e899c0a4f1f3bb2e07b304ed2e + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.1.0 + resolution: "babel-preset-current-node-syntax@npm:1.1.0" + dependencies: + "@babel/plugin-syntax-async-generators": "npm:^7.8.4" + "@babel/plugin-syntax-bigint": "npm:^7.8.3" + "@babel/plugin-syntax-class-properties": "npm:^7.12.13" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" + "@babel/plugin-syntax-import-meta": "npm:^7.10.4" + "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" + "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/0b838d4412e3322cb4436f246e24e9c00bebcedfd8f00a2f51489db683bd35406bbd55a700759c28d26959c6e03f84dd6a1426f576f440267c1d7a73c5717281 + languageName: node + linkType: hard + +"babel-preset-jest@npm:^29.6.3": + version: 29.6.3 + resolution: "babel-preset-jest@npm:29.6.3" + dependencies: + babel-plugin-jest-hoist: "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ec5fd0276b5630b05f0c14bb97cc3815c6b31600c683ebb51372e54dcb776cff790bdeeabd5b8d01ede375a040337ccbf6a3ccd68d3a34219125945e167ad943 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"browserslist@npm:^4.24.0": + version: 4.24.4 + resolution: "browserslist@npm:4.24.4" + dependencies: + caniuse-lite: "npm:^1.0.30001688" + electron-to-chromium: "npm:^1.5.73" + node-releases: "npm:^2.0.19" + update-browserslist-db: "npm:^1.1.1" + bin: + browserslist: cli.js + checksum: 10c0/db7ebc1733cf471e0b490b4f47e3e2ea2947ce417192c9246644e92c667dd56a71406cc58f62ca7587caf828364892e9952904a02b7aead752bc65b62a37cfe9 + languageName: node + linkType: hard + +"bs-logger@npm:^0.2.6": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: "npm:2.x" + checksum: 10c0/80e89aaaed4b68e3374ce936f2eb097456a0dddbf11f75238dbd53140b1e39259f0d248a5089ed456f1158984f22191c3658d54a713982f676709fbe1a6fa5a0 + languageName: node + linkType: hard + +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: "npm:^0.4.0" + checksum: 10c0/24d8dfb7b6d457d73f32744e678a60cc553e4ec0e9e1a01cf614b44d85c3c87e188d3cc78ef0442ce5032ee6818de20a0162ba1074725c0d08908f62ea979227 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 + languageName: node + linkType: hard + +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" + dependencies: + "@npmcli/fs": "npm:^4.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: 10c0/92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 + languageName: node + linkType: hard + +"camelcase@npm:^6.2.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001688": + version: 1.0.30001700 + resolution: "caniuse-lite@npm:1.0.30001700" + checksum: 10c0/3d391bcdd193208166d3ad759de240b9c18ac3759dbd57195770f0fcd2eedcd47d5e853609aba1eee5a2def44b0a14eee457796bdb3451a27de0c8b27355017c + languageName: node + linkType: hard + +"case@npm:1.6.3": + version: 1.6.3 + resolution: "case@npm:1.6.3" + checksum: 10c0/43fcbb1dff1c4add94dd2bc98bd923d6616f10bff6959adf686d192c3db7d7ced35410761e1ac94cc4a1f5c41c86406ad79d390805539e421e8a77e553f67223 + languageName: node + linkType: hard + +"cdk-nag@npm:^2.35.0": + version: 2.35.24 + resolution: "cdk-nag@npm:2.35.24" + peerDependencies: + aws-cdk-lib: ^2.156.0 + constructs: ^10.0.5 + checksum: 10c0/12783afc8f2cef18e5fb70a988864a548250383e0a4e4430853458fc49f3241697f035b9c9516fe68f07d8f76dcbb6b85bdf6c8522639392aac78db05577e68f + languageName: node + linkType: hard + +"chalk@npm:^4.0.0, chalk@npm:^4.0.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: 10c0/57a09a86371331e0be35d9083ba429e86c4f4648ecbe27455dbfb343037c16ee6fdc7f6b61f433a57cc5ded5561d71c56a150e018f40c2ffb7bc93a26dae341e + languageName: node + linkType: hard + +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 10c0/6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.0.0": + version: 1.4.3 + resolution: "cjs-module-lexer@npm:1.4.3" + checksum: 10c0/076b3af85adc4d65dbdab1b5b240fe5b45d44fcf0ef9d429044dd94d19be5589376805c44fb2d4b3e684e5fe6a9b7cf3e426476a6507c45283c5fc6ff95240be + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 10c0/c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 + languageName: node + linkType: hard + +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.2 + resolution: "collect-v8-coverage@npm:1.0.2" + checksum: 10c0/ed7008e2e8b6852c5483b444a3ae6e976e088d4335a85aa0a9db2861c5f1d31bd2d7ff97a60469b3388deeba661a619753afbe201279fb159b4b9548ab8269a1 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"constructs@npm:^10.4.2": + version: 10.4.2 + resolution: "constructs@npm:10.4.2" + checksum: 10c0/dcd5edd631c7313964f89fffb7365e1eebaede16cbc9ae69eab5337710353913684b860ccc4b2a3dfaf147656f48f0ae7853ca94cb51833e152b46047ac7a4ff + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b + languageName: node + linkType: hard + +"create-jest@npm:^29.7.0": + version: 29.7.0 + resolution: "create-jest@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + exit: "npm:^0.1.2" + graceful-fs: "npm:^4.2.9" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + prompts: "npm:^2.0.1" + bin: + create-jest: bin/create-jest.js + checksum: 10c0/e7e54c280692470d3398f62a6238fd396327e01c6a0757002833f06d00afc62dd7bfe04ff2b9cd145264460e6b4d1eb8386f2925b7e567f97939843b7b0e812f + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de + languageName: node + linkType: hard + +"dedent@npm:^1.0.0": + version: 1.5.3 + resolution: "dedent@npm:1.5.3" + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + checksum: 10c0/d94bde6e6f780be4da4fd760288fcf755ec368872f4ac5218197200d86430aeb8d90a003a840bff1c20221188e3f23adced0119cb811c6873c70d0ac66d12832 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: 10c0/c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d + languageName: node + linkType: hard + +"diff-sequences@npm:^29.6.3": + version: 29.6.3 + resolution: "diff-sequences@npm:29.6.3" + checksum: 10c0/32e27ac7dbffdf2fb0eb5a84efd98a9ad084fbabd5ac9abb8757c6770d5320d2acd172830b28c4add29bb873d59420601dfc805ac4064330ce59b1adfd0593b2 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + languageName: node + linkType: hard + +"ejs@npm:^3.1.10": + version: 3.1.10 + resolution: "ejs@npm:3.1.10" + dependencies: + jake: "npm:^10.8.5" + bin: + ejs: bin/cli.js + checksum: 10c0/52eade9e68416ed04f7f92c492183340582a36482836b11eab97b159fcdcfdedc62233a1bf0bf5e5e1851c501f2dca0e2e9afd111db2599e4e7f53ee29429ae1 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.5.73": + version: 1.5.102 + resolution: "electron-to-chromium@npm:1.5.102" + checksum: 10c0/db07dab3ee3b7fbc39ad26203925669ade86b12a62d09fa14ae48a354a0f34d162ac9a2ca9d6f70ceb1b16821b01b155e56467702bcc915da1e1dd147dd034b4 + languageName: node + linkType: hard + +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 10c0/1573d0ae29ab34661b6c63251ff8f5facd24ccf6a823f19417ae8ba8c88ea450325788c67f16c99edec8de4b52ce93a10fe441ece389fd156e88ee7dab9bfa35 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"entities@npm:^4.4.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: "npm:^0.2.1" + checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + languageName: node + linkType: hard + +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^9.1.0": + version: 9.1.0 + resolution: "eslint-config-prettier@npm:9.1.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 10c0/6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d + languageName: node + linkType: hard + +"eslint-plugin-prettier@npm:^5.2.1": + version: 5.2.3 + resolution: "eslint-plugin-prettier@npm:5.2.3" + dependencies: + prettier-linter-helpers: "npm:^1.0.0" + synckit: "npm:^0.9.1" + peerDependencies: + "@types/eslint": ">=8.0.0" + eslint: ">=8.0.0" + eslint-config-prettier: "*" + prettier: ">=3.0.0" + peerDependenciesMeta: + "@types/eslint": + optional: true + eslint-config-prettier: + optional: true + checksum: 10c0/60d9c03491ec6080ac1d71d0bee1361539ff6beb9b91ac98cfa7176c9ed52b7dbe7119ebee5b441b479d447d17d802a4a492ee06095ef2f22c460e3dd6459302 + languageName: node + linkType: hard + +"eslint-plugin-tsdoc@npm:^0.4.0": + version: 0.4.0 + resolution: "eslint-plugin-tsdoc@npm:0.4.0" + dependencies: + "@microsoft/tsdoc": "npm:0.15.1" + "@microsoft/tsdoc-config": "npm:0.17.1" + checksum: 10c0/c65b67b789597683456cd346414451618b9a2ed40f4d6b02223426914ba83c37083c8d330d15808ff5e448c755bdb254ff0ffb1971688304168ed8d22dbcc7d3 + languageName: node + linkType: hard + +"eslint-scope@npm:^8.2.0": + version: 8.2.0 + resolution: "eslint-scope@npm:8.2.0" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/8d2d58e2136d548ac7e0099b1a90d9fab56f990d86eb518de1247a7066d38c908be2f3df477a79cf60d70b30ba18735d6c6e70e9914dca2ee515a729975d70d6 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 10c0/2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 + languageName: node + linkType: hard + +"eslint@npm:^9.16.0": + version: 9.20.1 + resolution: "eslint@npm:9.20.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.19.0" + "@eslint/core": "npm:^0.11.0" + "@eslint/eslintrc": "npm:^3.2.0" + "@eslint/js": "npm:9.20.0" + "@eslint/plugin-kit": "npm:^0.2.5" + "@humanfs/node": "npm:^0.16.6" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@humanwhocodes/retry": "npm:^0.4.1" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.6" + debug: "npm:^4.3.2" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^8.2.0" + eslint-visitor-keys: "npm:^4.2.0" + espree: "npm:^10.3.0" + esquery: "npm:^1.5.0" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^8.0.0" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true + bin: + eslint: bin/eslint.js + checksum: 10c0/056789dd5a00897730376f8c0a191e22840e97b7276916068ec096341cb2ec3a918c8bd474bf94ccd7b457ad9fbc16e5c521a993c7cc6ebcf241933e2fd378b0 + languageName: node + linkType: hard + +"espree@npm:^10.0.1, espree@npm:^10.3.0": + version: 10.3.0 + resolution: "espree@npm:10.3.0" + dependencies: + acorn: "npm:^8.14.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10c0/272beeaca70d0a1a047d61baff64db04664a33d7cfb5d144f84bc8a5c6194c6c8ebe9cc594093ca53add88baa23e59b01e69e8a0160ab32eac570482e165c462 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"esquery@npm:^1.5.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.0" + human-signals: "npm:^2.1.0" + is-stream: "npm:^2.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^4.0.1" + onetime: "npm:^5.1.2" + signal-exit: "npm:^3.0.3" + strip-final-newline: "npm:^2.0.0" + checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: 10c0/71d2ad9b36bc25bb8b104b17e830b40a08989be7f7d100b13269aaae7c3784c3e6e1e88a797e9e87523993a25ba27c8958959a554535370672cfb4d824af8989 + languageName: node + linkType: hard + +"expect@npm:^29.0.0, expect@npm:^29.7.0": + version: 29.7.0 + resolution: "expect@npm:29.7.0" + dependencies: + "@jest/expect-utils": "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/2eddeace66e68b8d8ee5f7be57f3014b19770caaf6815c7a08d131821da527fb8c8cb7b3dcd7c883d2d3d8d184206a4268984618032d1e4b16dc8d6596475d41 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.2 + resolution: "exponential-backoff@npm:3.1.2" + checksum: 10c0/d9d3e1eafa21b78464297df91f1776f7fbaa3d5e3f7f0995648ca5b89c069d17055033817348d9f4a43d1c20b0eab84f75af6991751e839df53e4dfd6f22e844 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-diff@npm:^1.1.2": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: 10c0/5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 + languageName: node + linkType: hard + +"fast-glob@npm:^3.3.2": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.8" + checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + +"fast-uri@npm:^3.0.1": + version: 3.0.6 + resolution: "fast-uri@npm:3.0.6" + checksum: 10c0/74a513c2af0584448aee71ce56005185f81239eab7a2343110e5bad50c39ad4fb19c5a6f99783ead1cac7ccaf3461a6034fda89fffa2b30b6d99b9f21c2f9d29 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.19.0 + resolution: "fastq@npm:1.19.0" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/d6a001638f1574a696660fcbba5300d017760432372c801632c325ca7c16819604841c92fd3ccadcdacec0966ca336363a5ff57bc5f0be335d8ea7ac6087b98f + languageName: node + linkType: hard + +"fb-watchman@npm:^2.0.0": + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: "npm:2.1.1" + checksum: 10c0/feae89ac148adb8f6ae8ccd87632e62b13563e6fb114cacb5265c51f585b17e2e268084519fb2edd133872f1d47a18e6bfd7e5e08625c0d41b93149694187581 + languageName: node + linkType: hard + +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" + dependencies: + flat-cache: "npm:^4.0.0" + checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 + languageName: node + linkType: hard + +"filelist@npm:^1.0.4": + version: 1.0.4 + resolution: "filelist@npm:1.0.4" + dependencies: + minimatch: "npm:^5.0.1" + checksum: 10c0/426b1de3944a3d153b053f1c0ebfd02dccd0308a4f9e832ad220707a6d1f1b3c9784d6cadf6b2f68f09a57565f63ebc7bcdc913ccf8012d834f472c46e596f41 + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 10c0/e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538 + languageName: node + linkType: hard + +"fs-extra@npm:^11.2.0": + version: 11.3.0 + resolution: "fs-extra@npm:11.3.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10c0/5f95e996186ff45463059feb115a22fb048bdaf7e487ecee8a8646c78ed8fdca63630e3077d4c16ce677051f5e60d3355a06f3cd61f3ca43f48cc58822a44d0a + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"fsevents@npm:2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/be78a3efa3e181cda3cf7a4637cb527bcebb0bd0ea0440105a3bb45b86f9245b307dc10a2507e8f4498a7d4ec349d1910f4d73e4d4495b16103106e07eee735b + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@npm:^2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: 10c0/e34cdf447fdf1902a1f6d5af737eaadf606d2ee3518287abde8910e04159368c268568174b2e71102b87b26c2020486f126bfca9c4fb1ceb986ff99b52ecd1be + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob@npm:^9.3.5": + version: 9.3.5 + resolution: "glob@npm:9.3.5" + dependencies: + fs.realpath: "npm:^1.0.0" + minimatch: "npm:^8.0.2" + minipass: "npm:^4.2.4" + path-scurry: "npm:^1.6.1" + checksum: 10c0/2f6c2b9ee019ee21dc258ae97a88719614591e4c979cb4580b1b9df6f0f778a3cb38b4bdaf18dfa584637ea10f89a3c5f2533a5e449cf8741514ad18b0951f2e + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 + languageName: node + linkType: hard + +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 10c0/b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d + languageName: node + linkType: hard + +"globals@npm:^15.13.0": + version: 15.15.0 + resolution: "globals@npm:15.15.0" + checksum: 10c0/f9ae80996392ca71316495a39bec88ac43ae3525a438b5626cd9d5ce9d5500d0a98a266409605f8cd7241c7acf57c354a48111ea02a767ba4f374b806d6861fe + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 10c0/208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:4" + checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"ignore@npm:^5.2.0, ignore@npm:^5.3.1, ignore@npm:^5.3.2": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.2.0 + resolution: "import-local@npm:3.2.0" + dependencies: + pkg-dir: "npm:^4.2.0" + resolve-cwd: "npm:^3.0.0" + bin: + import-local-fixture: fixtures/cli.js + checksum: 10c0/94cd6367a672b7e0cb026970c85b76902d2710a64896fa6de93bd5c571dd03b228c5759308959de205083e3b1c61e799f019c9e36ee8e9c523b993e1057f0433 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 + languageName: node + linkType: hard + +"is-core-module@npm:^2.16.0": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" + dependencies: + hasown: "npm:^2.0.2" + checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-generator-fn@npm:^2.0.0": + version: 2.1.0 + resolution: "is-generator-fn@npm:2.1.0" + checksum: 10c0/2957cab387997a466cd0bf5c1b6047bd21ecb32bdcfd8996b15747aa01002c1c88731802f1b3d34ac99f4f6874b626418bd118658cf39380fe5fff32a3af9c4d + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^5.0.4": + version: 5.2.1 + resolution: "istanbul-lib-instrument@npm:5.2.1" + dependencies: + "@babel/core": "npm:^7.12.3" + "@babel/parser": "npm:^7.14.7" + "@istanbuljs/schema": "npm:^0.1.2" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^6.3.0" + checksum: 10c0/8a1bdf3e377dcc0d33ec32fe2b6ecacdb1e4358fd0eb923d4326bb11c67622c0ceb99600a680f3dad5d29c66fc1991306081e339b4d43d0b8a2ab2e1d910a6ee + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^6.0.0": + version: 6.0.3 + resolution: "istanbul-lib-instrument@npm:6.0.3" + dependencies: + "@babel/core": "npm:^7.23.9" + "@babel/parser": "npm:^7.23.9" + "@istanbuljs/schema": "npm:^0.1.3" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^7.5.4" + checksum: 10c0/a1894e060dd2a3b9f046ffdc87b44c00a35516f5e6b7baf4910369acca79e506fc5323a816f811ae23d82334b38e3ddeb8b3b331bd2c860540793b59a8689128 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^4.0.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" + dependencies: + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + source-map: "npm:^0.6.1" + checksum: 10c0/19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3": + version: 3.1.7 + resolution: "istanbul-reports@npm:3.1.7" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: 10c0/a379fadf9cf8dc5dfe25568115721d4a7eb82fbd50b005a6672aff9c6989b20cc9312d7865814e0859cd8df58cbf664482e1d3604be0afde1f7fc3ccc1394a51 + languageName: node + linkType: hard + +"jake@npm:^10.8.5": + version: 10.9.2 + resolution: "jake@npm:10.9.2" + dependencies: + async: "npm:^3.2.3" + chalk: "npm:^4.0.2" + filelist: "npm:^1.0.4" + minimatch: "npm:^3.1.2" + bin: + jake: bin/cli.js + checksum: 10c0/c4597b5ed9b6a908252feab296485a4f87cba9e26d6c20e0ca144fb69e0c40203d34a2efddb33b3d297b8bd59605e6c1f44f6221ca1e10e69175ecbf3ff5fe31 + languageName: node + linkType: hard + +"jest-changed-files@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-changed-files@npm:29.7.0" + dependencies: + execa: "npm:^5.0.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + checksum: 10c0/e071384d9e2f6bb462231ac53f29bff86f0e12394c1b49ccafbad225ce2ab7da226279a8a94f421949920bef9be7ef574fd86aee22e8adfa149be73554ab828b + languageName: node + linkType: hard + +"jest-circus@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-circus@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/expect": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + co: "npm:^4.6.0" + dedent: "npm:^1.0.0" + is-generator-fn: "npm:^2.0.0" + jest-each: "npm:^29.7.0" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + pure-rand: "npm:^6.0.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/8d15344cf7a9f14e926f0deed64ed190c7a4fa1ed1acfcd81e4cc094d3cc5bf7902ebb7b874edc98ada4185688f90c91e1747e0dfd7ac12463b097968ae74b5e + languageName: node + linkType: hard + +"jest-cli@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-cli@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + create-jest: "npm:^29.7.0" + exit: "npm:^0.1.2" + import-local: "npm:^3.0.2" + jest-config: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + yargs: "npm:^17.3.1" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/a658fd55050d4075d65c1066364595962ead7661711495cfa1dfeecf3d6d0a8ffec532f3dbd8afbb3e172dd5fd2fb2e813c5e10256e7cf2fea766314942fb43a + languageName: node + linkType: hard + +"jest-config@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-config@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@jest/test-sequencer": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-jest: "npm:^29.7.0" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + deepmerge: "npm:^4.2.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-circus: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-runner: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + parse-json: "npm:^5.2.0" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-json-comments: "npm:^3.1.1" + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: 10c0/bab23c2eda1fff06e0d104b00d6adfb1d1aabb7128441899c9bff2247bd26710b050a5364281ce8d52b46b499153bf7e3ee88b19831a8f3451f1477a0246a0f1 + languageName: node + linkType: hard + +"jest-diff@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-diff@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + diff-sequences: "npm:^29.6.3" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/89a4a7f182590f56f526443dde69acefb1f2f0c9e59253c61d319569856c4931eae66b8a3790c443f529267a0ddba5ba80431c585deed81827032b2b2a1fc999 + languageName: node + linkType: hard + +"jest-docblock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-docblock@npm:29.7.0" + dependencies: + detect-newline: "npm:^3.0.0" + checksum: 10c0/d932a8272345cf6b6142bb70a2bb63e0856cc0093f082821577ea5bdf4643916a98744dfc992189d2b1417c38a11fa42466f6111526bc1fb81366f56410f3be9 + languageName: node + linkType: hard + +"jest-each@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-each@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + pretty-format: "npm:^29.7.0" + checksum: 10c0/f7f9a90ebee80cc688e825feceb2613627826ac41ea76a366fa58e669c3b2403d364c7c0a74d862d469b103c843154f8456d3b1c02b487509a12afa8b59edbb4 + languageName: node + linkType: hard + +"jest-environment-node@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-environment-node@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-mock: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + checksum: 10c0/61f04fec077f8b1b5c1a633e3612fc0c9aa79a0ab7b05600683428f1e01a4d35346c474bde6f439f9fcc1a4aa9a2861ff852d079a43ab64b02105d1004b2592b + languageName: node + linkType: hard + +"jest-get-type@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-get-type@npm:29.6.3" + checksum: 10c0/552e7a97a983d3c2d4e412a44eb7de0430ff773dd99f7500962c268d6dfbfa431d7d08f919c9d960530e5f7f78eb47f267ad9b318265e5092b3ff9ede0db7c2b + languageName: node + linkType: hard + +"jest-haste-map@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-haste-map@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/graceful-fs": "npm:^4.1.3" + "@types/node": "npm:*" + anymatch: "npm:^3.0.3" + fb-watchman: "npm:^2.0.0" + fsevents: "npm:^2.3.2" + graceful-fs: "npm:^4.2.9" + jest-regex-util: "npm:^29.6.3" + jest-util: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + micromatch: "npm:^4.0.4" + walker: "npm:^1.0.8" + dependenciesMeta: + fsevents: + optional: true + checksum: 10c0/2683a8f29793c75a4728787662972fedd9267704c8f7ef9d84f2beed9a977f1cf5e998c07b6f36ba5603f53cb010c911fe8cd0ac9886e073fe28ca66beefd30c + languageName: node + linkType: hard + +"jest-leak-detector@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-leak-detector@npm:29.7.0" + dependencies: + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/71bb9f77fc489acb842a5c7be030f2b9acb18574dc9fb98b3100fc57d422b1abc55f08040884bd6e6dbf455047a62f7eaff12aa4058f7cbdc11558718ca6a395 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-matcher-utils@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + pretty-format: "npm:^29.7.0" + checksum: 10c0/0d0e70b28fa5c7d4dce701dc1f46ae0922102aadc24ed45d594dd9b7ae0a8a6ef8b216718d1ab79e451291217e05d4d49a82666e1a3cc2b428b75cd9c933244e + languageName: node + linkType: hard + +"jest-message-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-message-util@npm:29.7.0" + dependencies: + "@babel/code-frame": "npm:^7.12.13" + "@jest/types": "npm:^29.6.3" + "@types/stack-utils": "npm:^2.0.0" + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + micromatch: "npm:^4.0.4" + pretty-format: "npm:^29.7.0" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.3" + checksum: 10c0/850ae35477f59f3e6f27efac5215f706296e2104af39232bb14e5403e067992afb5c015e87a9243ec4d9df38525ef1ca663af9f2f4766aa116f127247008bd22 + languageName: node + linkType: hard + +"jest-mock@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-mock@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + checksum: 10c0/7b9f8349ee87695a309fe15c46a74ab04c853369e5c40952d68061d9dc3159a0f0ed73e215f81b07ee97a9faaf10aebe5877a9d6255068a0977eae6a9ff1d5ac + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.2": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: 10c0/86eec0c78449a2de733a6d3e316d49461af6a858070e113c97f75fb742a48c2396ea94150cbca44159ffd4a959f743a47a8b37a792ef6fdad2cf0a5cba973fac + languageName: node + linkType: hard + +"jest-regex-util@npm:^29.6.3": + version: 29.6.3 + resolution: "jest-regex-util@npm:29.6.3" + checksum: 10c0/4e33fb16c4f42111159cafe26397118dcfc4cf08bc178a67149fb05f45546a91928b820894572679d62559839d0992e21080a1527faad65daaae8743a5705a3b + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve-dependencies@npm:29.7.0" + dependencies: + jest-regex-util: "npm:^29.6.3" + jest-snapshot: "npm:^29.7.0" + checksum: 10c0/b6e9ad8ae5b6049474118ea6441dfddd385b6d1fc471db0136f7c8fbcfe97137a9665e4f837a9f49f15a29a1deb95a14439b7aec812f3f99d08f228464930f0d + languageName: node + linkType: hard + +"jest-resolve@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-resolve@npm:29.7.0" + dependencies: + chalk: "npm:^4.0.0" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-pnp-resolver: "npm:^1.2.2" + jest-util: "npm:^29.7.0" + jest-validate: "npm:^29.7.0" + resolve: "npm:^1.20.0" + resolve.exports: "npm:^2.0.0" + slash: "npm:^3.0.0" + checksum: 10c0/59da5c9c5b50563e959a45e09e2eace783d7f9ac0b5dcc6375dea4c0db938d2ebda97124c8161310082760e8ebbeff9f6b177c15ca2f57fb424f637a5d2adb47 + languageName: node + linkType: hard + +"jest-runner@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runner@npm:29.7.0" + dependencies: + "@jest/console": "npm:^29.7.0" + "@jest/environment": "npm:^29.7.0" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + graceful-fs: "npm:^4.2.9" + jest-docblock: "npm:^29.7.0" + jest-environment-node: "npm:^29.7.0" + jest-haste-map: "npm:^29.7.0" + jest-leak-detector: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-resolve: "npm:^29.7.0" + jest-runtime: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + jest-watcher: "npm:^29.7.0" + jest-worker: "npm:^29.7.0" + p-limit: "npm:^3.1.0" + source-map-support: "npm:0.5.13" + checksum: 10c0/2194b4531068d939f14c8d3274fe5938b77fa73126aedf9c09ec9dec57d13f22c72a3b5af01ac04f5c1cf2e28d0ac0b4a54212a61b05f10b5d6b47f2a1097bb4 + languageName: node + linkType: hard + +"jest-runtime@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-runtime@npm:29.7.0" + dependencies: + "@jest/environment": "npm:^29.7.0" + "@jest/fake-timers": "npm:^29.7.0" + "@jest/globals": "npm:^29.7.0" + "@jest/source-map": "npm:^29.6.3" + "@jest/test-result": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + cjs-module-lexer: "npm:^1.0.0" + collect-v8-coverage: "npm:^1.0.0" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + jest-haste-map: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-mock: "npm:^29.7.0" + jest-regex-util: "npm:^29.6.3" + jest-resolve: "npm:^29.7.0" + jest-snapshot: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + slash: "npm:^3.0.0" + strip-bom: "npm:^4.0.0" + checksum: 10c0/7cd89a1deda0bda7d0941835434e44f9d6b7bd50b5c5d9b0fc9a6c990b2d4d2cab59685ab3cb2850ed4cc37059f6de903af5a50565d7f7f1192a77d3fd6dd2a6 + languageName: node + linkType: hard + +"jest-snapshot@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-snapshot@npm:29.7.0" + dependencies: + "@babel/core": "npm:^7.11.6" + "@babel/generator": "npm:^7.7.2" + "@babel/plugin-syntax-jsx": "npm:^7.7.2" + "@babel/plugin-syntax-typescript": "npm:^7.7.2" + "@babel/types": "npm:^7.3.3" + "@jest/expect-utils": "npm:^29.7.0" + "@jest/transform": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + babel-preset-current-node-syntax: "npm:^1.0.0" + chalk: "npm:^4.0.0" + expect: "npm:^29.7.0" + graceful-fs: "npm:^4.2.9" + jest-diff: "npm:^29.7.0" + jest-get-type: "npm:^29.6.3" + jest-matcher-utils: "npm:^29.7.0" + jest-message-util: "npm:^29.7.0" + jest-util: "npm:^29.7.0" + natural-compare: "npm:^1.4.0" + pretty-format: "npm:^29.7.0" + semver: "npm:^7.5.3" + checksum: 10c0/6e9003c94ec58172b4a62864a91c0146513207bedf4e0a06e1e2ac70a4484088a2683e3a0538d8ea913bcfd53dc54a9b98a98cdfa562e7fe1d1339aeae1da570 + languageName: node + linkType: hard + +"jest-util@npm:^29.0.0, jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + chalk: "npm:^4.0.0" + ci-info: "npm:^3.2.0" + graceful-fs: "npm:^4.2.9" + picomatch: "npm:^2.2.3" + checksum: 10c0/bc55a8f49fdbb8f51baf31d2a4f312fb66c9db1483b82f602c9c990e659cdd7ec529c8e916d5a89452ecbcfae4949b21b40a7a59d4ffc0cd813a973ab08c8150 + languageName: node + linkType: hard + +"jest-validate@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-validate@npm:29.7.0" + dependencies: + "@jest/types": "npm:^29.6.3" + camelcase: "npm:^6.2.0" + chalk: "npm:^4.0.0" + jest-get-type: "npm:^29.6.3" + leven: "npm:^3.1.0" + pretty-format: "npm:^29.7.0" + checksum: 10c0/a20b930480c1ed68778c739f4739dce39423131bc070cd2505ddede762a5570a256212e9c2401b7ae9ba4d7b7c0803f03c5b8f1561c62348213aba18d9dbece2 + languageName: node + linkType: hard + +"jest-watcher@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-watcher@npm:29.7.0" + dependencies: + "@jest/test-result": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.0.0" + emittery: "npm:^0.13.1" + jest-util: "npm:^29.7.0" + string-length: "npm:^4.0.1" + checksum: 10c0/ec6c75030562fc8f8c727cb8f3b94e75d831fc718785abfc196e1f2a2ebc9a2e38744a15147170039628a853d77a3b695561ce850375ede3a4ee6037a2574567 + languageName: node + linkType: hard + +"jest-worker@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" + dependencies: + "@types/node": "npm:*" + jest-util: "npm:^29.7.0" + merge-stream: "npm:^2.0.0" + supports-color: "npm:^8.0.0" + checksum: 10c0/5570a3a005b16f46c131968b8a5b56d291f9bbb85ff4217e31c80bd8a02e7de799e59a54b95ca28d5c302f248b54cbffde2d177c2f0f52ffcee7504c6eabf660 + languageName: node + linkType: hard + +"jest@npm:^29.7.0": + version: 29.7.0 + resolution: "jest@npm:29.7.0" + dependencies: + "@jest/core": "npm:^29.7.0" + "@jest/types": "npm:^29.6.3" + import-local: "npm:^3.0.2" + jest-cli: "npm:^29.7.0" + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 10c0/f40eb8171cf147c617cc6ada49d062fbb03b4da666cb8d39cdbfb739a7d75eea4c3ca150fb072d0d273dce0c753db4d0467d54906ad0293f59c54f9db4a09d8b + languageName: node + linkType: hard + +"jju@npm:~1.4.0": + version: 1.4.0 + resolution: "jju@npm:1.4.0" + checksum: 10c0/f3f444557e4364cfc06b1abf8331bf3778b26c0c8552ca54429bc0092652172fdea26cbffe33e1017b303d5aa506f7ede8571857400efe459cb7439180e2acad + languageName: node + linkType: hard + +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + languageName: node + linkType: hard + +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + languageName: node + linkType: hard + +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 + languageName: node + linkType: hard + +"json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" + dependenciesMeta: + graceful-fs: + optional: true + checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 + languageName: node + linkType: hard + +"jsonschema@npm:^1.4.1": + version: 1.5.0 + resolution: "jsonschema@npm:1.5.0" + checksum: 10c0/c24ddb8d741f02efc0da3ad9b597a275f6b595062903d3edbfaa535c3f9c4c98613df68da5cb6635ed9aeab30d658986fea61d7662fc5b2b92840d5a1e21235e + languageName: node + linkType: hard + +"jsonschema@npm:~1.4.1": + version: 1.4.1 + resolution: "jsonschema@npm:1.4.1" + checksum: 10c0/c3422d3fc7d33ff7234a806ffa909bb6fb5d1cd664bea229c64a1785dc04cbccd5fc76cf547c6ab6dd7881dbcaf3540a6a9f925a5956c61a9cd3e23a3c1796ef + languageName: node + linkType: hard + +"keyv@npm:^4.5.4": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b + languageName: node + linkType: hard + +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 10c0/cd778ba3fbab0f4d0500b7e87d1f6e1f041507c56fdcd47e8256a3012c98aaee371d4c15e0a76e0386107af2d42e2b7466160a2d80688aaa03e66e49949f42df + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d + languageName: node + linkType: hard + +"linkify-it@npm:^5.0.0": + version: 5.0.0 + resolution: "linkify-it@npm:5.0.0" + dependencies: + uc.micro: "npm:^2.0.0" + checksum: 10c0/ff4abbcdfa2003472fc3eb4b8e60905ec97718e11e33cca52059919a4c80cc0e0c2a14d23e23d8c00e5402bc5a885cdba8ca053a11483ab3cc8b3c7a52f88e2d + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: "npm:^4.1.0" + checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + +"lodash.memoize@npm:^4.1.2": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 10c0/c8713e51eccc650422716a14cece1809cfe34bc5ab5e242b7f8b4e2241c2483697b971a604252807689b9dd69bfe3a98852e19a5b89d506b000b4187a1285df8 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 + languageName: node + linkType: hard + +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: 10c0/4e870d54e8a6c86c8687e057cec4069d2e941446ccab7f40b4d9555fa5872d917d0b6aa73bece7765500a3123f1723bcdba9ae881b679ef120bba9e1a0b0ed70 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: "npm:^3.0.2" + checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 + languageName: node + linkType: hard + +"lunr@npm:^2.3.9": + version: 2.3.9 + resolution: "lunr@npm:2.3.9" + checksum: 10c0/77d7dbb4fbd602aac161e2b50887d8eda28c0fa3b799159cee380fbb311f1e614219126ecbbd2c3a9c685f1720a8109b3c1ca85cc893c39b6c9cc6a62a1d8a8b + languageName: node + linkType: hard + +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" + dependencies: + semver: "npm:^7.5.3" + checksum: 10c0/69b98a6c0b8e5c4fe9acb61608a9fbcfca1756d910f51e5dbe7a9e5cfb74fca9b8a0c8a0ffdf1294a740826c1ab4871d5bf3f62f72a3049e5eac6541ddffed68 + languageName: node + linkType: hard + +"make-error@npm:^1.1.1, make-error@npm:^1.3.6": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" + dependencies: + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^4.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^12.0.0" + checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 + languageName: node + linkType: hard + +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" + dependencies: + tmpl: "npm:1.0.5" + checksum: 10c0/b0e6e599780ce6bab49cc413eba822f7d1f0dfebd1c103eaa3785c59e43e22c59018323cf9e1708f0ef5329e94a745d163fcbb6bff8e4c6742f9be9e86f3500c + languageName: node + linkType: hard + +"markdown-it@npm:^14.1.0": + version: 14.1.0 + resolution: "markdown-it@npm:14.1.0" + dependencies: + argparse: "npm:^2.0.1" + entities: "npm:^4.4.0" + linkify-it: "npm:^5.0.0" + mdurl: "npm:^2.0.0" + punycode.js: "npm:^2.3.1" + uc.micro: "npm:^2.1.0" + bin: + markdown-it: bin/markdown-it.mjs + checksum: 10c0/9a6bb444181d2db7016a4173ae56a95a62c84d4cbfb6916a399b11d3e6581bf1cc2e4e1d07a2f022ae72c25f56db90fbe1e529fca16fbf9541659dc53480d4b4 + languageName: node + linkType: hard + +"mdurl@npm:^2.0.0": + version: 2.0.0 + resolution: "mdurl@npm:2.0.0" + checksum: 10c0/633db522272f75ce4788440669137c77540d74a83e9015666a9557a152c02e245b192edc20bc90ae953bbab727503994a53b236b4d9c99bdaee594d0e7dd2ce0 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.35": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/3defdfd230914f22a8da203747c42ee3c405c39d4d37ffda284dac5e45b7e1f6c49aa8be606509002898e73091ff2a3bbfc59c2c6c71d4660609f63aa92f98e3 + languageName: node + linkType: hard + +"minimatch@npm:^8.0.2": + version: 8.0.4 + resolution: "minimatch@npm:8.0.4" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/a0a394c356dd5b4cb7f821720841a82fa6f07c9c562c5b716909d1b6ec5e56a7e4c4b5029da26dd256b7d2b3a3f38cbf9ddd8680e887b9b5282b09c05501c1ca + languageName: node + linkType: hard + +"minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^4.0.0": + version: 4.0.0 + resolution: "minipass-fetch@npm:4.0.0" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^3.0.1" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/7fa30ce7c373fb6f94c086b374fff1589fd7e78451855d2d06c2e2d9df936d131e73e952163063016592ed3081444bd8d1ea608533313b0149156ce23311da4b + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^4.2.4": + version: 4.2.8 + resolution: "minipass@npm:4.2.8" + checksum: 10c0/4ea76b030d97079f4429d6e8a8affd90baf1b6a1898977c8ccce4701c5a2ba2792e033abc6709373f25c2c4d4d95440d9d5e9464b46b7b76ca44d2ce26d939ce + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 + languageName: node + linkType: hard + +"minizlib@npm:^3.0.1": + version: 3.0.1 + resolution: "minizlib@npm:3.0.1" + dependencies: + minipass: "npm:^7.0.4" + rimraf: "npm:^5.0.5" + checksum: 10c0/82f8bf70da8af656909a8ee299d7ed3b3372636749d29e105f97f20e88971be31f5ed7642f2e898f00283b68b701cc01307401cdc209b0efc5dd3818220e5093 + languageName: node + linkType: hard + +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d + languageName: node + linkType: hard + +"ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 11.1.0 + resolution: "node-gyp@npm:11.1.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.4.3" + which: "npm:^5.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/c38977ce502f1ea41ba2b8721bd5b49bc3d5b3f813eabfac8414082faf0620ccb5211e15c4daecc23ed9f5e3e9cc4da00e575a0bcfc2a95a069294f2afa1e0cd + languageName: node + linkType: hard + +"node-int64@npm:^0.4.0": + version: 0.4.0 + resolution: "node-int64@npm:0.4.0" + checksum: 10c0/a6a4d8369e2f2720e9c645255ffde909c0fbd41c92ea92a5607fc17055955daac99c1ff589d421eee12a0d24e99f7bfc2aabfeb1a4c14742f6c099a51863f31a + languageName: node + linkType: hard + +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa + languageName: node + linkType: hard + +"nopt@npm:^8.0.0": + version: 8.1.0 + resolution: "nopt@npm:8.1.0" + dependencies: + abbrev: "npm:^3.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: "npm:^3.0.0" + checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac + languageName: node + linkType: hard + +"onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: "npm:^2.1.0" + checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" + dependencies: + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: "npm:^2.0.0" + checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: "npm:^2.2.0" + checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + +"p-map@npm:^7.0.2": + version: 7.0.3 + resolution: "p-map@npm:7.0.3" + checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^1.6.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"pirates@npm:^4.0.4": + version: 4.0.6 + resolution: "pirates@npm:4.0.6" + checksum: 10c0/00d5fa51f8dded94d7429700fb91a0c1ead00ae2c7fd27089f0c5b63e6eca36197fe46384631872690a66f390c5e27198e99006ab77ae472692ab9c2ca903f36 + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: "npm:^4.0.0" + checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd + languageName: node + linkType: hard + +"prettier-linter-helpers@npm:^1.0.0": + version: 1.0.0 + resolution: "prettier-linter-helpers@npm:1.0.0" + dependencies: + fast-diff: "npm:^1.1.2" + checksum: 10c0/81e0027d731b7b3697ccd2129470ed9913ecb111e4ec175a12f0fcfab0096516373bf0af2fef132af50cafb0a905b74ff57996d615f59512bb9ac7378fcc64ab + languageName: node + linkType: hard + +"prettier@npm:^3.4.2": + version: 3.5.1 + resolution: "prettier@npm:3.5.1" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/9f6f810eae455d6e4213845151a484a2338f2e0d6a8b84ee8e13a83af8a2421ef6c1e31e61e4b135671fb57b9541f6624648880cc2061ac803e243ac898c0123 + languageName: node + linkType: hard + +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": + version: 29.7.0 + resolution: "pretty-format@npm:29.7.0" + dependencies: + "@jest/schemas": "npm:^29.6.3" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^18.0.0" + checksum: 10c0/edc5ff89f51916f036c62ed433506b55446ff739358de77207e63e88a28ca2894caac6e73dcb68166a606e51c8087d32d400473e6a9fdd2dbe743f46c9c0276f + languageName: node + linkType: hard + +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"prompts@npm:^2.0.1": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: "npm:^3.0.3" + sisteransi: "npm:^1.0.5" + checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 + languageName: node + linkType: hard + +"punycode.js@npm:^2.3.1": + version: 2.3.1 + resolution: "punycode.js@npm:2.3.1" + checksum: 10c0/1d12c1c0e06127fa5db56bd7fdf698daf9a78104456a6b67326877afc21feaa821257b171539caedd2f0524027fa38e67b13dd094159c8d70b6d26d2bea4dfdb + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.3.1": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + +"pure-rand@npm:^6.0.0": + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 10c0/1abe217897bf74dcb3a0c9aba3555fe975023147b48db540aa2faf507aee91c03bf54f6aef0eb2bf59cc259a16d06b28eca37f0dc426d94f4692aeff02fb0e65 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"react-is@npm:^18.0.0": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 + languageName: node + linkType: hard + +"resolve.exports@npm:^2.0.0": + version: 2.0.3 + resolution: "resolve.exports@npm:2.0.3" + checksum: 10c0/1ade1493f4642a6267d0a5e68faeac20b3d220f18c28b140343feb83694d8fed7a286852aef43689d16042c61e2ddb270be6578ad4a13990769e12065191200d + languageName: node + linkType: hard + +"resolve@npm:^1.20.0, resolve@npm:~1.22.2": + version: 1.22.10 + resolution: "resolve@npm:1.22.10" + dependencies: + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/8967e1f4e2cc40f79b7e080b4582b9a8c5ee36ffb46041dccb20e6461161adf69f843b43067b4a375de926a2cd669157e29a29578191def399dd5ef89a1b5203 + languageName: node + linkType: hard + +"resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A~1.22.2#optional!builtin": + version: 1.22.10 + resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" + dependencies: + is-core-module: "npm:^2.16.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10c0/52a4e505bbfc7925ac8f4cd91fd8c4e096b6a89728b9f46861d3b405ac9a1ccf4dcbf8befb4e89a2e11370dacd0160918163885cbc669369590f2f31f4c58939 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + languageName: node + linkType: hard + +"rimraf@npm:^5.0.5": + version: 5.0.10 + resolution: "rimraf@npm:5.0.10" + dependencies: + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10c0/7da4fd0e15118ee05b918359462cfa1e7fe4b1228c7765195a45b55576e8c15b95db513b8466ec89129666f4af45ad978a3057a02139afba1a63512a2d9644cc + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"semver@npm:^6.3.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" + bin: + semver: bin/semver.js + checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3, semver@npm:^7.7.1": + version: 7.7.1 + resolution: "semver@npm:7.7.1" + bin: + semver: bin/semver.js + checksum: 10c0/fd603a6fb9c399c6054015433051bdbe7b99a940a8fb44b85c2b524c4004b023d7928d47cb22154f8d054ea7ee8597f586605e05b52047f048278e4ac56ae958 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 10c0/6c25678db1270d4793e0327620f1e0f9f5bea4630123f51e9e399191bc52c87d6e6de53ed33538609e5eacbd1fab769fae00f3705d08d029f02102a540648918 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: "npm:^7.1.2" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.4 + resolution: "socks@npm:2.8.4" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/00c3271e233ccf1fb83a3dd2060b94cc37817e0f797a93c560b9a7a86c4a0ec2961fb31263bdd24a3c28945e24868b5f063cd98744171d9e942c513454b50ae5 + languageName: node + linkType: hard + +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10c0/137539f8c453fa0f496ea42049ab5da4569f96781f6ac8e5bfda26937be9494f4e8891f523c5f98f0e85f71b35d74127a00c46f83f6a4f54672b58d53202565e + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a + languageName: node + linkType: hard + +"string-length@npm:^4.0.1": + version: 4.0.2 + resolution: "string-length@npm:4.0.2" + dependencies: + char-regex: "npm:^1.0.2" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/1cd77409c3d7db7bc59406f6bcc9ef0783671dcbabb23597a1177c166906ef2ee7c8290f78cae73a8aec858768f189d2cb417797df5e15ec4eb5e16b3346340c + languageName: node + linkType: hard + +"string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 10c0/26abad1172d6bc48985ab9a5f96c21e440f6e7e476686de49be813b5a59b3566dccb5c525b831ec54fe348283b47f3ffb8e080bc3f965fde12e84df23f6bb7ef + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 + languageName: node + linkType: hard + +"synckit@npm:^0.9.1": + version: 0.9.2 + resolution: "synckit@npm:0.9.2" + dependencies: + "@pkgr/core": "npm:^0.1.0" + tslib: "npm:^2.6.2" + checksum: 10c0/e0c262817444e5b872708adb6f5ad37951ba33f6b2d1d4477d45db1f57573a784618ceed5e6614e0225db330632b1f6b95bb74d21e4d013e45ad4bde03d0cb59 + languageName: node + linkType: hard + +"table@npm:^6.8.2": + version: 6.9.0 + resolution: "table@npm:6.9.0" + dependencies: + ajv: "npm:^8.0.1" + lodash.truncate: "npm:^4.4.2" + slice-ansi: "npm:^4.0.0" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/35646185712bb65985fbae5975dda46696325844b78735f95faefae83e86df0a265277819a3e67d189de6e858c509b54e66ca3958ffd51bde56ef1118d455bf4 + languageName: node + linkType: hard + +"tar@npm:^7.4.3": + version: 7.4.3 + resolution: "tar@npm:7.4.3" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d + languageName: node + linkType: hard + +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^7.1.4" + minimatch: "npm:^3.0.4" + checksum: 10c0/019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57 + languageName: node + linkType: hard + +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: 10c0/f935537799c2d1922cb5d6d3805f594388f75338fe7a4a9dac41504dd539704ca4db45b883b52e7b0aa5b2fd5ddadb1452bf95cd23a69da2f793a843f9451cc9 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"ts-api-utils@npm:^2.0.1": + version: 2.0.1 + resolution: "ts-api-utils@npm:2.0.1" + peerDependencies: + typescript: ">=4.8.4" + checksum: 10c0/23fd56a958b332cac00150a652e4c84730df30571bd2faa1ba6d7b511356d1a61656621492bb6c7f15dd6e18847a1408357a0e406671d358115369a17f5bfedd + languageName: node + linkType: hard + +"ts-jest@npm:^29.2.5": + version: 29.2.5 + resolution: "ts-jest@npm:29.2.5" + dependencies: + bs-logger: "npm:^0.2.6" + ejs: "npm:^3.1.10" + fast-json-stable-stringify: "npm:^2.1.0" + jest-util: "npm:^29.0.0" + json5: "npm:^2.2.3" + lodash.memoize: "npm:^4.1.2" + make-error: "npm:^1.3.6" + semver: "npm:^7.6.3" + yargs-parser: "npm:^21.1.1" + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/transform": ^29.0.0 + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + jest: ^29.0.0 + typescript: ">=4.3 <6" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/transform": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: 10c0/acb62d168faec073e64b20873b583974ba8acecdb94681164eb346cef82ade8fb481c5b979363e01a97ce4dd1e793baf64d9efd90720bc941ad7fc1c3d6f3f68 + languageName: node + linkType: hard + +"ts-node@npm:^10.9.2": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 + languageName: node + linkType: hard + +"tslib@npm:^2.6.2": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 + languageName: node + linkType: hard + +"type-detect@npm:4.0.8": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 10c0/8fb9a51d3f365a7de84ab7f73b653534b61b622aa6800aecdb0f1095a4a646d3f5eb295322127b6573db7982afcd40ab492d038cf825a42093a58b1e1353e0bd + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 + languageName: node + linkType: hard + +"typedoc@npm:^0.27.4": + version: 0.27.7 + resolution: "typedoc@npm:0.27.7" + dependencies: + "@gerrit0/mini-shiki": "npm:^1.24.0" + lunr: "npm:^2.3.9" + markdown-it: "npm:^14.1.0" + minimatch: "npm:^9.0.5" + yaml: "npm:^2.6.1" + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x + bin: + typedoc: bin/typedoc + checksum: 10c0/727f7da5255f66d949a524582b5ec9ecfa43caade1ea48efe9305117bd18d5a26c423c788767ee992662eff7bec7ac993673cafe14d6fd206881c604cad2f6ba + languageName: node + linkType: hard + +"typescript-eslint@npm:^8.18.0": + version: 8.24.1 + resolution: "typescript-eslint@npm:8.24.1" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.24.1" + "@typescript-eslint/parser": "npm:8.24.1" + "@typescript-eslint/utils": "npm:8.24.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + checksum: 10c0/5bcb6af12d04777ca04ca9300552e1c7410d640950945d854be41c264fdfe965ce40c0203336e073eb0697567d59043b3096dfed825e76fd7347081e9abf3b16 + languageName: node + linkType: hard + +"typescript@npm:~5.7.2": + version: 5.7.3 + resolution: "typescript@npm:5.7.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/b7580d716cf1824736cc6e628ab4cd8b51877408ba2be0869d2866da35ef8366dd6ae9eb9d0851470a39be17cbd61df1126f9e211d8799d764ea7431d5435afa + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A~5.7.2#optional!builtin": + version: 5.7.3 + resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin::version=5.7.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/6fd7e0ed3bf23a81246878c613423730c40e8bdbfec4c6e4d7bf1b847cbb39076e56ad5f50aa9d7ebd89877999abaee216002d3f2818885e41c907caaa192cc4 + languageName: node + linkType: hard + +"uc.micro@npm:^2.0.0, uc.micro@npm:^2.1.0": + version: 2.1.0 + resolution: "uc.micro@npm:2.1.0" + checksum: 10c0/8862eddb412dda76f15db8ad1c640ccc2f47cdf8252a4a30be908d535602c8d33f9855dfcccb8b8837855c1ce1eaa563f7fa7ebe3c98fd0794351aab9b9c55fa + languageName: node + linkType: hard + +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 + languageName: node + linkType: hard + +"undici-types@npm:~6.20.0": + version: 6.20.0 + resolution: "undici-types@npm:6.20.0" + checksum: 10c0/68e659a98898d6a836a9a59e6adf14a5d799707f5ea629433e025ac90d239f75e408e2e5ff086afc3cace26f8b26ee52155293564593fbb4a2f666af57fc59bf + languageName: node + linkType: hard + +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" + dependencies: + unique-slug: "npm:^5.0.0" + checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc + languageName: node + linkType: hard + +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.1.1": + version: 1.1.2 + resolution: "update-browserslist-db@npm:1.1.2" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10c0/9cb353998d6d7d6ba1e46b8fa3db888822dd972212da4eda609d185eb5c3557a93fd59780ceb757afd4d84240518df08542736969e6a5d6d6ce2d58e9363aac6 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 10c0/bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 + languageName: node + linkType: hard + +"v8-to-istanbul@npm:^9.0.1": + version: 9.3.0 + resolution: "v8-to-istanbul@npm:9.3.0" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.12" + "@types/istanbul-lib-coverage": "npm:^2.0.1" + convert-source-map: "npm:^2.0.0" + checksum: 10c0/968bcf1c7c88c04df1ffb463c179558a2ec17aa49e49376120504958239d9e9dad5281aa05f2a78542b8557f2be0b0b4c325710262f3b838b40d703d5ed30c23 + languageName: node + linkType: hard + +"walker@npm:^1.0.8": + version: 1.0.8 + resolution: "walker@npm:1.0.8" + dependencies: + makeerror: "npm:1.0.12" + checksum: 10c0/a17e037bccd3ca8a25a80cb850903facdfed0de4864bd8728f1782370715d679fa72e0a0f5da7c1c1379365159901e5935f35be531229da53bbfc0efdabdb48e + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 + languageName: node + linkType: hard + +"wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"write-file-atomic@npm:^4.0.2": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^3.0.7" + checksum: 10c0/a2c282c95ef5d8e1c27b335ae897b5eca00e85590d92a3fd69a437919b7b93ff36a69ea04145da55829d2164e724bc62202cdb5f4b208b425aba0807889375c7 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 + languageName: node + linkType: hard + +"yaml@npm:1.10.2": + version: 1.10.2 + resolution: "yaml@npm:1.10.2" + checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f + languageName: node + linkType: hard + +"yaml@npm:^2.6.1": + version: 2.7.0 + resolution: "yaml@npm:2.7.0" + bin: + yaml: bin.mjs + checksum: 10c0/886a7d2abbd70704b79f1d2d05fe9fb0aa63aefb86e1cb9991837dced65193d300f5554747a872b4b10ae9a12bc5d5327e4d04205f70336e863e35e89d8f4ea9 + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:^17.3.1": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard