From 2053af608d89f89159e294e798fbcea6fb2c6249 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 16:35:29 +0100 Subject: [PATCH 001/112] adding new folders to exclude --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 0c7cc51..bd4522b 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,6 @@ cdk.context.json # Ignore Mac DS_Store files **/.DS_Store + +assets +source-zip \ No newline at end of file From 3ca8bb745dbce71c85472c7bb577647da2417174 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 16:36:08 +0100 Subject: [PATCH 002/112] updating the architecture diagrams --- images/{architecture.svg => architecture-v0.1.x.svg} | 0 images/architecture-v0.2.x.svg | 4 ++++ 2 files changed, 4 insertions(+) rename images/{architecture.svg => architecture-v0.1.x.svg} (100%) create mode 100644 images/architecture-v0.2.x.svg 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 From 7346bea4d9d11ce801cf020ded9d5724e4ddda78 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 16:37:14 +0100 Subject: [PATCH 003/112] adding / moving helper scripts --- scripts/build-assets.sh | 34 +++++++++++++++++++++++++++ {assets => scripts}/create-ec2-ami.sh | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 scripts/build-assets.sh rename {assets => scripts}/create-ec2-ami.sh (100%) mode change 100755 => 100644 diff --git a/scripts/build-assets.sh b/scripts/build-assets.sh new file mode 100644 index 0000000..fe57347 --- /dev/null +++ b/scripts/build-assets.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" + +WD="$SCRIPTPATH/.." + +# create a source-zip where all the source-repo folders will be stored as zip +mkdir -p $WD/source-zip + +# loop trough the source-repo folders +declare -a source_repos=(base-image kas meta-aws-demo nxp-imx poky poky-ami renesas) +for pipeline in "${source_repos[@]}" +do + if [ -f $WD/source-zip/$pipeline/source-$pipeline.zip ]; then + rm -rf $WD/source-zip/$pipeline + fi + mkdir -p $WD/source-zip/$pipeline + cd $WD/source-repo/$pipeline + # create a zip with the source repo content for the specific immage + zip -q -o $WD/source-zip/$pipeline/source-$pipeline.zip -r * +done + +# copy the folders into th dist folder +if [ -d $WD/dist/scripts ]; then rm -rf $WD/dist/scripts; fi +if [ -d $WD/dist/source-repo ]; then rm -rf $WD/dist/source-repo; fi +if [ -d $WD/dist/source-zip ]; then rm -rf $WD/dist/source-zip; fi + +mkdir -p $WD/dist/scripts +mkdir -p $WD/dist/source-repo +mkdir -p $WD/dist/source-zip + +cp -r $WD/scripts $WD/dist +cp -r $WD/source-repo $WD/dist +cp -r $WD/source-zip $WD/dist diff --git a/assets/create-ec2-ami.sh b/scripts/create-ec2-ami.sh old mode 100755 new mode 100644 similarity index 100% rename from assets/create-ec2-ami.sh rename to scripts/create-ec2-ami.sh index 4aa1192..0f47fd5 --- a/assets/create-ec2-ami.sh +++ b/scripts/create-ec2-ami.sh @@ -1,6 +1,7 @@ #!/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 @@ -32,7 +33,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" From 088e8f899552a19da2246f6ed3de7cb0ff1447f7 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 16:39:09 +0100 Subject: [PATCH 004/112] moving the base image assests to source-repo --- .../base-image}/Dockerfile | 25 +++++++++---------- .../base-image}/buildspec.yml | 13 +++++++--- 2 files changed, 21 insertions(+), 17 deletions(-) rename {assets/build-image/ubuntu_22_04 => source-repo/base-image}/Dockerfile (66%) rename {assets/build-image/ubuntu_22_04 => source-repo/base-image}/buildspec.yml (50%) 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..530c01b 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')]" From e97d74c6f23b530d9794c3835fb7d20b668b9ae0 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 16:41:16 +0100 Subject: [PATCH 005/112] adjusting buildspec file with new nfs mount location & adding debug logs --- source-repo/kas/build.buildspec.yml | 30 ++++++++------ source-repo/meta-aws-demo/build.buildspec.yml | 30 ++++++++------ source-repo/nxp-imx/build.buildspec.yml | 34 ++++++++++------ source-repo/poky-ami/build.buildspec.yml | 39 ++++++++++++------- source-repo/poky/build.buildspec.yml | 36 ++++++++++------- source-repo/renesas/build.buildspec.yml | 32 +++++++++------ 6 files changed, 127 insertions(+), 74 deletions(-) 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/meta-aws-demo/build.buildspec.yml b/source-repo/meta-aws-demo/build.buildspec.yml index c169330..cf19e15 100644 --- a/source-repo/meta-aws-demo/build.buildspec.yml +++ b/source-repo/meta-aws-demo/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/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..11e1bd0 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,28 @@ 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 - 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 # 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/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/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 From db25f0bee760159b9cdd9f81df8f1ee954858530 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 16:42:50 +0100 Subject: [PATCH 006/112] refactoring poky/poky-ami project & esling formatting --- source-repo/poky-ami/manifest.xml | 20 ++++++++++++-------- source-repo/poky/manifest.xml | 15 ++++++++++++--- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/source-repo/poky-ami/manifest.xml b/source-repo/poky-ami/manifest.xml index 8d68d44..ea62b95 100644 --- a/source-repo/poky-ami/manifest.xml +++ b/source-repo/poky-ami/manifest.xml @@ -1,11 +1,15 @@ - - - + + + - - - - - + + + + + \ No newline at end of file diff --git a/source-repo/poky/manifest.xml b/source-repo/poky/manifest.xml index 2c541aa..ea62b95 100644 --- a/source-repo/poky/manifest.xml +++ b/source-repo/poky/manifest.xml @@ -1,6 +1,15 @@ - + + + - - + + + + + \ No newline at end of file From 2d81ba46365321fdab1deafac397bc0975bf2f17 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 16:43:45 +0100 Subject: [PATCH 007/112] eslint & jest config refactoring / updates --- eslint.config.mjs | 101 +++++++++++++++++++++++++--------------------- jest.config.js | 22 ++++++---- 2 files changed, 70 insertions(+), 53 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 61853b1..b3c89db 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -4,7 +4,8 @@ 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 eslint from "@eslint/js"; +import tseslint from "typescript-eslint"; import { FlatCompat } from "@eslint/eslintrc"; const __filename = fileURLToPath(import.meta.url); @@ -14,66 +15,74 @@ 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 + baseDirectory: __dirname, + recommendedConfig: eslint.configs.recommended, + allConfig: eslint.configs.all, }); -export default [...compat.extends( - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended", -), { +export default [ + { plugins: { - "@typescript-eslint": typescriptEslintEslintPlugin, - tsdoc, + "@typescript-eslint": typescriptEslintEslintPlugin, + tsdoc, }, languageOptions: { - globals: { - ...globals.browser, - ...globals.node, - ...globals.jest, - }, + globals: { + ...globals.node, + ...globals.jest, + }, - parser: tsParser, - ecmaVersion: "latest", - sourceType: "module", + parser: tsParser, + ecmaVersion: "latest", + sourceType: "module", - parserOptions: { - sourceType: 'module', - project: './tsconfig.json', - }, + parserOptions: { + sourceType: "module", + project: "./tsconfig.json", + }, }, rules: { - "tsdoc/syntax": "warn", + "tsdoc/syntax": "warn", - "max-len": ["error", { - code: 150, - ignoreUrls: true, - ignoreStrings: true, - ignoreTemplateLiterals: true, - ignoreComments: true, - ignoreRegExpLiterals: true, - }], + "max-len": [ + "error", + { + code: 150, + ignoreUrls: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + ignoreComments: true, + ignoreRegExpLiterals: true, + }, + ], - "prettier/prettier": ["error", { - singleQuote: true, - trailingComma: "es5", - }], + "prettier/prettier": [ + "error", + { + singleQuote: true, + trailingComma: "es5", + }, + ], }, - ignores: [ - "jest.config.js", - "package.json", - "package-lock.json", - "tsconfig.json", - "typedoc.json", + "jest.config.js", + "package.json", + "package-lock.json", + "tsconfig.json", + "typedoc.json", ], -}, -includeIgnoreFile(gitignorePath), -{ + ...eslint.configs.recommended, + }, + includeIgnoreFile(gitignorePath), + { // your overrides -}, + }, + ...compat.extends( + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended" + ), + ...tseslint.configs.recommended, ]; 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", }; From a353e78c4e180c0b9e98ea2d5712b2266643adb7 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 16:44:39 +0100 Subject: [PATCH 008/112] library version updates & scripts commands ajdustments --- package-lock.json | 396 ++++++++++++++++++++-------------------------- package.json | 21 ++- 2 files changed, 183 insertions(+), 234 deletions(-) diff --git a/package-lock.json b/package-lock.json index b1286d7..7e59a76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@types/node": "20.14.8", "@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/parser": "^8.18.0", - "aws-cdk-lib": "^2.173.0", + "aws-cdk-lib": "^2.173.1", "cdk-nag": "^2.34.23", "constructs": "^10.4.2", "eslint": "^9.16.0", @@ -32,7 +32,7 @@ "typescript-eslint": "^8.18.0" }, "peerDependencies": { - "aws-cdk-lib": "^2.173.0", + "aws-cdk-lib": "^2.173.1", "constructs": "^10.4.2" } }, @@ -51,9 +51,9 @@ } }, "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==", + "version": "2.2.215", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.215.tgz", + "integrity": "sha512-D+Jzwpl+zlBGjJf7nuRcz6JFNwqDQ+IzwIq0VSC4LMRRvrkhGE/ZE+zab3EnjmVkipcQqtQe+PVKefgmxETbvA==", "dev": true, "license": "Apache-2.0" }, @@ -709,30 +709,6 @@ "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", @@ -770,17 +746,6 @@ "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", @@ -794,23 +759,10 @@ "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.17.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", + "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", "dev": true, "license": "MIT", "engines": { @@ -841,15 +793,15 @@ } }, "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.24.4", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.24.4.tgz", + "integrity": "sha512-YEHW1QeAg6UmxEmswiQbOVEg1CW22b1XUD/lNTliOsu0LD0wqoyleFMnmbTp697QE0pcadQiR5cVtbbAPncvpw==", "dev": true, "license": "MIT", "dependencies": { "@shikijs/engine-oniguruma": "^1.24.2", "@shikijs/types": "^1.24.2", - "@shikijs/vscode-textmate": "^9.3.0" + "@shikijs/vscode-textmate": "^9.3.1" } }, "node_modules/@humanfs/core": { @@ -1718,17 +1670,17 @@ "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.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz", + "integrity": "sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==", "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.18.1", + "@typescript-eslint/type-utils": "8.18.1", + "@typescript-eslint/utils": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -1748,16 +1700,16 @@ } }, "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.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz", + "integrity": "sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==", "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.18.1", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/typescript-estree": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", "debug": "^4.3.4" }, "engines": { @@ -1773,14 +1725,14 @@ } }, "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.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz", + "integrity": "sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0" + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1791,14 +1743,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.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz", + "integrity": "sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.18.0", - "@typescript-eslint/utils": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.1", + "@typescript-eslint/utils": "8.18.1", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -1815,9 +1767,9 @@ } }, "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.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz", + "integrity": "sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==", "dev": true, "license": "MIT", "engines": { @@ -1829,14 +1781,14 @@ } }, "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.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz", + "integrity": "sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1855,17 +1807,43 @@ "typescript": ">=4.8.4 <5.8.0" } }, + "node_modules/@typescript-eslint/typescript-estree/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/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, + "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.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz", + "integrity": "sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==", "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.18.1", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/typescript-estree": "8.18.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1880,13 +1858,13 @@ } }, "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.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz", + "integrity": "sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/types": "8.18.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2041,9 +2019,9 @@ "license": "MIT" }, "node_modules/aws-cdk-lib": { - "version": "2.173.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.173.0.tgz", - "integrity": "sha512-Da1JUwG8eL+chRSB+c2I4dRf54DWe/wmWKj9CBthNdsE9XCB8odyEcMpmgBC+R160o7ioYY2DBsAaKIIRa9XQw==", + "version": "2.173.2", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.173.2.tgz", + "integrity": "sha512-cL9+z8Pl3VZGoO7BwdsrFAOeud/vSl3at7OvmhihbNprMN15XuFUx/rViAU5OI1m92NbV4NBzYSLbSeCwYLNyw==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -2550,13 +2528,14 @@ "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==", + "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" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -2573,9 +2552,9 @@ } }, "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.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "funding": [ { @@ -2593,9 +2572,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": { @@ -2656,9 +2635,9 @@ } }, "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.30001689", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz", + "integrity": "sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==", "dev": true, "funding": [ { @@ -2952,9 +2931,9 @@ } }, "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.74", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.74.tgz", + "integrity": "sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==", "dev": true, "license": "ISC" }, @@ -3025,9 +3004,9 @@ } }, "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.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", + "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", "dev": true, "license": "MIT", "dependencies": { @@ -3036,7 +3015,7 @@ "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.9.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.16.0", + "@eslint/js": "9.17.0", "@eslint/plugin-kit": "^0.2.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -3045,7 +3024,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", @@ -3169,17 +3148,6 @@ "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "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", @@ -3193,19 +3161,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/espree": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", @@ -3448,6 +3403,16 @@ "minimatch": "^5.0.1" } }, + "node_modules/filelist/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": { + "balanced-match": "^1.0.0" + } + }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -3619,6 +3584,16 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/glob/node_modules/minimatch": { "version": "8.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", @@ -3767,9 +3742,9 @@ "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.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", + "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", "dev": true, "license": "MIT", "dependencies": { @@ -3945,30 +3920,6 @@ "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", @@ -4841,19 +4792,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "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": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" } }, "node_modules/minipass": { @@ -5352,13 +5300,13 @@ } }, "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.9", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.9.tgz", + "integrity": "sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==", "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" }, @@ -5691,30 +5639,6 @@ "node": ">=8" } }, - "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, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "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==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -5885,9 +5809,9 @@ } }, "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.5", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.5.tgz", + "integrity": "sha512-x+fhKJtTg4ozXwKayh/ek4wxZQI/+2hmZUdO2i2NGDBRUflDble70z+ewHod3d4gRpXSO6fnlnjbDTnJk7HlkQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5907,6 +5831,32 @@ "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/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": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/typescript": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", @@ -5922,15 +5872,15 @@ } }, "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.18.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.18.1.tgz", + "integrity": "sha512-Mlaw6yxuaDEPQvb/2Qwu3/TfgeBHy9iTJ3mTwe7OvpPmF6KPQjVOfGyEJpPv6Ez2C34OODChhXrzYw/9phI0MQ==", "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.18.1", + "@typescript-eslint/parser": "8.18.1", + "@typescript-eslint/utils": "8.18.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index b744e5c..f9bf936 100644 --- a/package.json +++ b/package.json @@ -1,23 +1,22 @@ { "name": "aws4embeddedlinux-cdk-lib", - "version": "0.1.4", + "version": "0.2.0", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts", - "type": "module", "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", + "clean": "tsc --build --clean && rm -rf dist && rm -rf source-zip && rm -rf cdk.out", "doc": "typedoc --sort source-order --readme README.md", "format": "eslint '**/*.{js,ts,json}' --quiet --fix", "check": "eslint '**/*.{js,ts,json}'", - "prepare": "npm run build" + "build-assets": "./scripts/build-assets.sh", + "prebuild": "npm run build-assets", + "test": "npm run prebuild && jest", + "update-snapshot": "npm run prebuild && jest -u", + "prepare": "npm run build", + "prepare-commit": "npm run clean && npm run format && npm run build && npm run check && npm run test" }, "devDependencies": { "@eslint/compat": "^1.2.4", @@ -27,7 +26,7 @@ "@types/node": "20.14.8", "@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/parser": "^8.18.0", - "aws-cdk-lib": "^2.173.0", + "aws-cdk-lib": "^2.173.1", "cdk-nag": "^2.34.23", "constructs": "^10.4.2", "eslint": "^9.16.0", @@ -44,7 +43,7 @@ "typescript-eslint": "^8.18.0" }, "peerDependencies": { - "aws-cdk-lib": "^2.173.0", + "aws-cdk-lib": "^2.173.1", "constructs": "^10.4.2" }, "resolutions": { From 8e20ecf22756756f6e3ea2a26051e1a04d0a8fb5 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 16:45:28 +0100 Subject: [PATCH 009/112] github workflow adjustment to conform with new script location --- .github/workflows/shellcheck.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml index d0b5a17..7c1181d 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: shellcheck scripts/*.sh From fb049683ba225e6b8e41467d4dba035270077122 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 16:49:08 +0100 Subject: [PATCH 010/112] deprecating existing/former cdk libraries and test --- lib/{ => deprecated}/build-image-data.ts | 57 +- lib/{ => deprecated}/build-image-pipeline.ts | 84 +- lib/{ => deprecated}/build-image-repo.ts | 12 +- .../constructs/source-repo.ts | 35 +- .../embedded-linux-codebuild-project.ts | 163 +- .../embedded-linux-pipeline.ts | 244 ++- lib/{ => deprecated}/network.ts | 25 +- test/build-image-data-nag.test.ts | 78 - test/build-image-data.test.ts | 34 - test/build-image-pipeline-nag.test.ts | 96 - test/build-image-pipeline.test.ts | 55 - test/build-image-repo-nag.test.ts | 36 - test/build-image-repo.test.ts | 16 - .../build-image-data.test.ts.snap | 2 +- .../build-image-pipeline.test.ts.snap | 12 +- .../build-image-repo.test.ts.snap | 0 .../embedded-linux-pipeline.test.ts.snap | 1848 +++++------------ .../__snapshots__/network.test.ts.snap | 6 +- .../__snapshots__/source-repo.test.ts.snap | 2 +- test/deprecated/build-image-data-nag.test.ts | 78 + test/deprecated/build-image-data.test.ts | 34 + .../build-image-pipeline-nag.test.ts | 96 + test/deprecated/build-image-pipeline.test.ts | 55 + test/deprecated/build-image-repo-nag.test.ts | 36 + test/deprecated/build-image-repo.test.ts | 16 + .../embedded-linux-pipeline-nag.test.ts | 168 ++ .../embedded-linux-pipeline.test.ts | 97 + test/deprecated/network.test-nag.test.ts | 39 + test/deprecated/network.test.ts | 26 + test/deprecated/source-repo-nag.test.ts | 46 + test/deprecated/source-repo.test.ts | 22 + test/deprecated/util.ts | 17 + test/embedded-linux-pipeline-nag.test.ts | 168 -- test/embedded-linux-pipeline.test.ts | 97 - test/network.test-nag.test.ts | 39 - test/network.test.ts | 26 - test/source-repo-nag.test.ts | 43 - test/source-repo.test.ts | 19 - 38 files changed, 1630 insertions(+), 2297 deletions(-) rename lib/{ => deprecated}/build-image-data.ts (62%) rename lib/{ => deprecated}/build-image-pipeline.ts (65%) rename lib/{ => deprecated}/build-image-repo.ts (64%) rename lib/{ => deprecated}/constructs/source-repo.ts (65%) rename lib/{ => deprecated}/embedded-linux-codebuild-project.ts (57%) rename lib/{ => deprecated}/embedded-linux-pipeline.ts (65%) rename lib/{ => deprecated}/network.ts (57%) delete mode 100644 test/build-image-data-nag.test.ts delete mode 100644 test/build-image-data.test.ts delete mode 100644 test/build-image-pipeline-nag.test.ts delete mode 100644 test/build-image-pipeline.test.ts delete mode 100644 test/build-image-repo-nag.test.ts delete mode 100644 test/build-image-repo.test.ts rename test/{ => deprecated}/__snapshots__/build-image-data.test.ts.snap (99%) rename test/{ => deprecated}/__snapshots__/build-image-pipeline.test.ts.snap (99%) rename test/{ => deprecated}/__snapshots__/build-image-repo.test.ts.snap (100%) rename test/{ => deprecated}/__snapshots__/embedded-linux-pipeline.test.ts.snap (86%) rename test/{ => deprecated}/__snapshots__/network.test.ts.snap (99%) rename test/{ => deprecated}/__snapshots__/source-repo.test.ts.snap (93%) create mode 100644 test/deprecated/build-image-data-nag.test.ts create mode 100644 test/deprecated/build-image-data.test.ts create mode 100644 test/deprecated/build-image-pipeline-nag.test.ts create mode 100644 test/deprecated/build-image-pipeline.test.ts create mode 100644 test/deprecated/build-image-repo-nag.test.ts create mode 100644 test/deprecated/build-image-repo.test.ts create mode 100644 test/deprecated/embedded-linux-pipeline-nag.test.ts create mode 100644 test/deprecated/embedded-linux-pipeline.test.ts create mode 100644 test/deprecated/network.test-nag.test.ts create mode 100644 test/deprecated/network.test.ts create mode 100644 test/deprecated/source-repo-nag.test.ts create mode 100644 test/deprecated/source-repo.test.ts create mode 100644 test/deprecated/util.ts delete mode 100644 test/embedded-linux-pipeline-nag.test.ts delete mode 100644 test/embedded-linux-pipeline.test.ts delete mode 100644 test/network.test-nag.test.ts delete mode 100644 test/network.test.ts delete mode 100644 test/source-repo-nag.test.ts delete mode 100644 test/source-repo.test.ts diff --git a/lib/build-image-data.ts b/lib/deprecated/build-image-data.ts similarity index 62% rename from lib/build-image-data.ts rename to lib/deprecated/build-image-data.ts index f81da3b..7ef6c2f 100644 --- a/lib/build-image-data.ts +++ b/lib/deprecated/build-image-data.ts @@ -1,15 +1,19 @@ -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 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'; +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}. + * + * @deprecated Use the new {@link PipelineResourcesProps} class instead. + * */ export interface BuildImageDataProps extends cdk.StackProps { /** The bucket name for image build sources. This must be globally unique. */ @@ -17,7 +21,11 @@ export interface BuildImageDataProps extends cdk.StackProps { } /** + * * Input (Source) data for our {@link BuildImagePipelineStack}. + * + * @deprecated Use the new {@link PipelineResourcesStack} class instead. + * */ export class BuildImageDataStack extends cdk.Stack { /** The bucket which will be consumed by the {@link BuildImagePipelineStack}. */ @@ -36,20 +44,23 @@ export class BuildImageDataStack extends cdk.Stack { * @param env - Environment passed to the stack. */ private createDeploymentBucket(bucketName: string): s3.IBucket { - const accessLoggingBucket = new s3.Bucket(this, 'LoggingBucket', { + const sourceBase: string = "base-image"; + const sourceLocalPath: string = `source-zip/${sourceBase}`; + + const accessLoggingBucket = new s3.Bucket(this, "LoggingBucket", { versioned: true, enforceSSL: true, autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY, }); - const encryptionKey = new kms.Key(this, 'PipelineArtifactKey', { + 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', { + const dataBucket = new s3.Bucket(this, "BuildImageDataBucket", { bucketName, versioned: true, encryptionKey: encryptionKey, @@ -63,12 +74,12 @@ export class BuildImageDataStack extends cdk.Stack { statements: [ new iam.PolicyStatement({ actions: [ - 'logs:CreateLogGroup', - 'logs:CreateLogStream', - 'logs:PutLogEvents', + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents", ], resources: [ - `arn:aws:logs:${this.region}:${this.account}:log-group:/aws/lambda/BuildImageData-CustomCDKBucketDeployment*"`, + `arn:aws:logs:${this.region}:${this.account}:log-group:/aws/lambda/BuildImageData-CustomCDKBucketDeployment*`, ], }), ], @@ -76,23 +87,25 @@ export class BuildImageDataStack extends cdk.Stack { const dataBucketDeploymentRole = new iam.Role( this, - 'BuildImageBucketRole', + "BuildImageBucketRole", { - assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), + assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"), inlinePolicies: { cwPolicy }, - } + }, ); dataBucketDeploymentRole.addToPolicy( new iam.PolicyStatement({ - actions: ['kms:Decrypt'], + actions: ["kms:Decrypt"], resources: [encryptionKey.keyArn], - }) + }), ); - new BucketDeployment(this, 'BuildImageBucketDeployment', { + new BucketDeployment(this, "BuildImageBucketDeployment", { // Note: Run `npm run zip-data` before deploying this stack! - sources: [Source.asset(path.join(__dirname, '..', 'assets/build-image'))], + sources: [ + Source.asset(path.join(__dirname, "..", "..", sourceLocalPath)), + ], destinationBucket: dataBucket, role: dataBucketDeploymentRole, extract: true, diff --git a/lib/build-image-pipeline.ts b/lib/deprecated/build-image-pipeline.ts similarity index 65% rename from lib/build-image-pipeline.ts rename to lib/deprecated/build-image-pipeline.ts index fa349b0..b8fb63c 100644 --- a/lib/build-image-pipeline.ts +++ b/lib/deprecated/build-image-pipeline.ts @@ -1,26 +1,34 @@ -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'; +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. + * + * @deprecated Use the new {@link PipelineResourcesStack} class instead. + * */ export enum ImageKind { /** Ubuntu 22.04 (LTS) */ - Ubuntu22_04 = 'ubuntu_22_04', + Ubuntu22_04 = "ubuntu_22_04", } /** + * * Select options for the {@link BuildImagePipelineStack}. + * + * @deprecated Use the new {@link BuildBaseImageCodePipelineProps} class instead. + * */ export interface BuildImagePipelineProps extends cdk.StackProps { /** The Image type to create. */ @@ -38,32 +46,37 @@ export interface BuildImagePipelineProps extends cdk.StackProps { } /** + * * 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}. + * + * @deprecated Use the new {@link BuildBaseImageCodePipelineStack} class instead. + * */ export class BuildImagePipelineStack extends cdk.Stack { constructor(scope: Construct, id: string, props: BuildImagePipelineProps) { super(scope, id, props); + const sourceBase: string = "base-image"; + const sourceFileName: string = `source-${sourceBase}.zip`; + const sourceBucketKey: string = `${sourceFileName}`; // Create a source action. - const sourceOutput = new codepipeline.Artifact('BuildImageSource'); + const sourceOutput = new codepipeline.Artifact("BuildImageSource"); const sourceAction = new codepipeline_actions.S3SourceAction({ - actionName: 'Build-Image-Source', + actionName: "Build-Image-Source", bucket: props.dataBucket, - bucketKey: 'data.zip', + bucketKey: sourceBucketKey, output: sourceOutput, }); // Create a build action. const buildImageProject = new codebuild.PipelineProject( this, - 'BuildImageProject', + "BuildImageProject", { - buildSpec: codebuild.BuildSpec.fromSourceFilename( - `${props.imageKind}/buildspec.yml` - ), + buildSpec: codebuild.BuildSpec.fromSourceFilename(`buildspec.yml`), environment: { computeType: codebuild.ComputeType.LARGE, buildImage: codebuild.LinuxBuildImage.STANDARD_7_0, @@ -89,17 +102,18 @@ export class BuildImagePipelineStack extends cdk.Stack { }, logging: { cloudWatch: { - logGroup: new LogGroup(this, 'BuildImageBuildLogs', { - retention: RetentionDays.TEN_YEARS, + logGroup: new LogGroup(this, "BuildImageBuildLogs", { + retention: RetentionDays.ONE_YEAR, + removalPolicy: cdk.RemovalPolicy.DESTROY, }), }, }, - } + }, ); props.repository.grantPullPush(buildImageProject); const buildAction = new codepipeline_actions.CodeBuildAction({ - actionName: 'Build', + actionName: "Build", project: buildImageProject, input: sourceOutput, }); @@ -109,7 +123,7 @@ export class BuildImagePipelineStack extends cdk.Stack { if (props.accessLoggingBucket) { accessLoggingBucket = props.accessLoggingBucket; } else { - accessLoggingBucket = new s3.Bucket(this, 'ArtifactAccessLogging', { + accessLoggingBucket = new s3.Bucket(this, "ArtifactAccessLogging", { versioned: true, enforceSSL: true, autoDeleteObjects: true, @@ -122,11 +136,11 @@ export class BuildImagePipelineStack extends cdk.Stack { if (props.artifactBucket) { artifactBucket = props.artifactBucket; } else { - const encryptionKey = new kms.Key(this, 'PipelineArtifactKey', { + const encryptionKey = new kms.Key(this, "PipelineArtifactKey", { removalPolicy: RemovalPolicy.DESTROY, enableKeyRotation: true, }); - artifactBucket = new s3.Bucket(this, 'PipelineArtifacts', { + artifactBucket = new s3.Bucket(this, "PipelineArtifacts", { versioned: true, enforceSSL: true, serverAccessLogsBucket: accessLoggingBucket, @@ -134,24 +148,24 @@ export class BuildImagePipelineStack extends cdk.Stack { encryptionKey, encryption: s3.BucketEncryption.KMS, blockPublicAccess: new s3.BlockPublicAccess( - s3.BlockPublicAccess.BLOCK_ALL + s3.BlockPublicAccess.BLOCK_ALL, ), autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY, }); } - const pipeline = new codepipeline.Pipeline(this, 'BuildImagePipeline', { + const pipeline = new codepipeline.Pipeline(this, "BuildImagePipeline", { artifactBucket, pipelineName: `${props.imageKind}BuildImagePipeline`, pipelineType: codepipeline.PipelineType.V1, stages: [ { - stageName: 'Source', + stageName: "Source", actions: [sourceAction], }, { - stageName: 'Build', + stageName: "Build", actions: [buildAction], }, ], @@ -160,11 +174,11 @@ export class BuildImagePipelineStack extends cdk.Stack { // Run this pipeline weekly to update the image OS. const pipelineTarget = new CodePipeline(pipeline); - new events.Rule(this, 'WeeklySchedule', { + new events.Rule(this, "WeeklySchedule", { schedule: events.Schedule.cron({ - weekDay: 'Monday', - minute: '0', - hour: '6', + weekDay: "Monday", + minute: "0", + hour: "6", }), targets: [pipelineTarget], }); diff --git a/lib/build-image-repo.ts b/lib/deprecated/build-image-repo.ts similarity index 64% rename from lib/build-image-repo.ts rename to lib/deprecated/build-image-repo.ts index 5b87e01..5c984fb 100644 --- a/lib/build-image-repo.ts +++ b/lib/deprecated/build-image-repo.ts @@ -1,11 +1,15 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import * as ecr from 'aws-cdk-lib/aws-ecr'; +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} + * + * @deprecated Use the new {@link PipelineResourcesStack} class instead. + * */ export class BuildImageRepoStack extends cdk.Stack { /** The respository to put the build host container in. */ @@ -14,7 +18,7 @@ export class BuildImageRepoStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); - this.repository = new ecr.Repository(this, 'BuildImageRepo', { + this.repository = new ecr.Repository(this, "BuildImageRepo", { removalPolicy: cdk.RemovalPolicy.DESTROY, emptyOnDelete: true, }); diff --git a/lib/constructs/source-repo.ts b/lib/deprecated/constructs/source-repo.ts similarity index 65% rename from lib/constructs/source-repo.ts rename to lib/deprecated/constructs/source-repo.ts index ccc0724..ff45cb3 100644 --- a/lib/constructs/source-repo.ts +++ b/lib/deprecated/constructs/source-repo.ts @@ -1,29 +1,32 @@ -import * as cdk from 'aws-cdk-lib'; -import { Construct } from 'constructs'; -import { Code, Repository } from 'aws-cdk-lib/aws-codecommit'; +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'; +import * as path from "path"; /** - * The kind of project built. + * @deprecated - The kind of project built. */ export enum ProjectKind { /** Build core-image-minimal from poky. */ - Poky = 'poky', + Poky = "poky", /** Build the Qemu meta-aws Demonstration Distribution. */ - MetaAwsDemo = 'meta-aws-demo', + MetaAwsDemo = "meta-aws-demo", /** Build an EC2 AMI */ - PokyAmi = 'poky-ami', + PokyAmi = "poky-ami", /** Build an kas based image */ - Kas = 'kas', + Kas = "kas", /** Build an Renesas image */ - Renesas = 'renesas', + Renesas = "renesas", /** Build an IMX image using NXP layers. */ - NxpImx = 'nxp-imx', + NxpImx = "nxp-imx", /** Build no pipeline, just CodeBuild project to connect with GitHub actions. */ - CodeBuild = 'codebuild', + CodeBuild = "codebuild", } +/** + * @deprecated - The SourceRepoProps. + */ export interface SourceRepoProps extends cdk.StackProps { /** The name of the CodeCommit Repository created. */ readonly repoName: string; @@ -32,6 +35,8 @@ export interface SourceRepoProps extends cdk.StackProps { } /** + * @deprecated + * * The repository for the Source Stage of the pipeline. * * The initial contents of this repository are seeded by the assets contained @@ -44,11 +49,11 @@ export class SourceRepo extends Construct { constructor(scope: Construct, id: string, props: SourceRepoProps) { super(scope, id); - this.repo = new Repository(this, 'SourceRepository', { + this.repo = new Repository(this, "SourceRepository", { repositoryName: props.repoName, code: Code.fromDirectory( - path.join(__dirname, '..', '..', 'source-repo', props.kind), - 'main' + path.join(__dirname, "..", "..", "..", "source-repo", props.kind), + "main", ), }); } diff --git a/lib/embedded-linux-codebuild-project.ts b/lib/deprecated/embedded-linux-codebuild-project.ts similarity index 57% rename from lib/embedded-linux-codebuild-project.ts rename to lib/deprecated/embedded-linux-codebuild-project.ts index 544a67c..7b7064b 100644 --- a/lib/embedded-linux-codebuild-project.ts +++ b/lib/deprecated/embedded-linux-codebuild-project.ts @@ -1,11 +1,11 @@ -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 * 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, @@ -13,8 +13,8 @@ import { FileSystemLocation, LinuxBuildImage, Project, -} from 'aws-cdk-lib/aws-codebuild'; -import { IRepository } from 'aws-cdk-lib/aws-ecr'; +} from "aws-cdk-lib/aws-codebuild"; +import { IRepository } from "aws-cdk-lib/aws-ecr"; import { ISecurityGroup, @@ -22,14 +22,17 @@ import { 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'; +} 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. + * + * @deprecated Use the new {@link EmbeddedLinuxCodeBuildProjectProps} class instead. + * */ export interface EmbeddedLinuxCodebuildProjectProps extends cdk.StackProps { /** ECR Repository where the Build Host Image resides. */ @@ -57,41 +60,55 @@ export interface EmbeddedLinuxCodebuildProjectProps extends cdk.StackProps { } /** + * @deprecated + * * The stack for creating a build pipeline. * * See {@link EmbeddedLinuxCodebuildProjectProps} for configration options. + * + * @deprecated Use the new {@link EmbeddedLinuxCodeBuildProjectStack} class instead. + * */ export class EmbeddedLinuxCodebuildProjectStack extends cdk.Stack { constructor( scope: Construct, id: string, - props: EmbeddedLinuxCodebuildProjectProps + props: EmbeddedLinuxCodebuildProjectProps, ) { super(scope, id, props); /** Set up networking access and EFS FileSystems. */ - const projectSg = new SecurityGroup(this, 'BuildProjectSecurityGroup', { + const projectSg = new SecurityGroup(this, "BuildProjectSecurityGroup", { vpc: props.vpc, - description: 'Security Group to allow attaching EFS', + description: "Security Group to allow attaching EFS", }); projectSg.addIngressRule( Peer.ipv4(props.vpc.vpcCidrBlock), Port.tcp(2049), - 'NFS Mount Port' + "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); - + // const sstateFS = this.addFileSystem("SState", props.vpc, projectSg); + // const dlFS = this.addFileSystem("Downloads", props.vpc, projectSg); + // const tmpFS = this.addFileSystem("Temp", props.vpc, projectSg); + const efsFileSystem: efs.FileSystem = new efs.FileSystem( + this, + `EFSFileSystem`, + { + vpc: props.vpc, + allowAnonymousAccess: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + }, + ); + efsFileSystem.connections.allowFrom(projectSg, Port.tcp(2049)); // let accessLoggingBucket: s3.IBucket; if (props.accessLoggingBucket) { // accessLoggingBucket = props.accessLoggingBucket; } else { /* accessLoggingBucket = */ - new s3.Bucket(this, 'ArtifactAccessLogging', { + new s3.Bucket(this, "ArtifactAccessLogging", { versioned: true, enforceSSL: true, autoDeleteObjects: true, @@ -100,51 +117,59 @@ export class EmbeddedLinuxCodebuildProjectStack extends cdk.Stack { } /** Create our CodeBuild Project. */ - const project = new Project(this, 'EmbeddedLinuxCodebuildProject', { + const project = new Project(this, "EmbeddedLinuxCodebuildProject", { buildSpec: BuildSpec.fromObject({ - version: '0.2', + version: "0.2", phases: { build: { commands: ['echo "DUMMY BUILDSPEC - can not be empty"'], }, }, artifacts: { - files: ['**/*'], - 'base-directory': '.', + files: ["**/*"], + "base-directory": ".", }, }), environment: { computeType: ComputeType.X2_LARGE, buildImage: LinuxBuildImage.fromEcrRepository( props.imageRepo, - props.imageTag + 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", + // }), + // ], 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', + identifier: "nfs", + location: `${efsFileSystem.fileSystemId}.efs.${efsFileSystem.env.region}.amazonaws.com:/`, + mountPoint: "/nfs", }), ], logging: { cloudWatch: { - logGroup: new LogGroup(this, 'PipelineBuildLogs', { - retention: RetentionDays.TEN_YEARS, + logGroup: new LogGroup(this, "PipelineBuildLogs", { + retention: RetentionDays.ONE_YEAR, + removalPolicy: cdk.RemovalPolicy.DESTROY, }), }, }, @@ -157,17 +182,17 @@ export class EmbeddedLinuxCodebuildProjectStack extends cdk.Stack { project.addToRolePolicy(this.addProjectPolicies()); project.role?.addManagedPolicy( - iam.ManagedPolicy.fromAwsManagedPolicyName('AWSCodeBuildAdminAccess') + 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', + "OSImageCheckOnStart", { runtime: lambda.Runtime.PYTHON_3_10, - handler: 'index.handler', + handler: "index.handler", code: lambda.Code.fromInline(` import boto3 import json @@ -189,24 +214,24 @@ def handler(event, context): abandon=True, reason='OS image not found in ECR repository. Stopping pipeline until image is present.') `), - logRetention: RetentionDays.TEN_YEARS, - } + logRetention: RetentionDays.ONE_YEAR, + }, ); - const pipelineCreateRule = new events.Rule(this, 'OnPipelineStartRule', { + const pipelineCreateRule = new events.Rule(this, "OnPipelineStartRule", { eventPattern: { - detailType: ['CodePipeline Pipeline Execution State Change'], - source: ['aws.codepipeline'], + detailType: ["CodePipeline Pipeline Execution State Change"], + source: ["aws.codepipeline"], detail: { - state: ['STARTED'], - 'execution-trigger': { - 'trigger-type': ['CreatePipeline'], + state: ["STARTED"], + "execution-trigger": { + "trigger-type": ["CreatePipeline"], }, }, }, }); pipelineCreateRule.addTarget( - new targets.LambdaFunction(fnOnPipelineCreate) + new targets.LambdaFunction(fnOnPipelineCreate), ); } @@ -222,7 +247,7 @@ def handler(event, context): private addFileSystem( name: string, vpc: IVpc, - securityGroup: ISecurityGroup + securityGroup: ISecurityGroup, ): string { const fs = new efs.FileSystem( this, @@ -230,7 +255,7 @@ def handler(event, context): { vpc, removalPolicy: cdk.RemovalPolicy.DESTROY, - } + }, ); fs.connections.allowFrom(securityGroup, Port.tcp(2049)); @@ -244,18 +269,18 @@ def handler(event, context): 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', + "ec2:DescribeSecurityGroups", + "codestar-connections:GetConnection", + "codestar-connections:GetConnectionToken", + "codeconnections:GetConnectionToken", + "codeconnections:GetConnection", + "codeconnections:UseConnection", + "codebuild:ListConnectedOAuthAccounts", + "codebuild:ListRepositories", + "codebuild:PersistOAuthToken", + "codebuild:ImportSourceCredentials", ], - resources: ['*'], + resources: ["*"], }); } } diff --git a/lib/embedded-linux-pipeline.ts b/lib/deprecated/embedded-linux-pipeline.ts similarity index 65% rename from lib/embedded-linux-pipeline.ts rename to lib/deprecated/embedded-linux-pipeline.ts index 7e8af5e..b6442fe 100644 --- a/lib/embedded-linux-pipeline.ts +++ b/lib/deprecated/embedded-linux-pipeline.ts @@ -1,15 +1,15 @@ -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 * 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, @@ -18,8 +18,8 @@ import { FileSystemLocation, LinuxBuildImage, PipelineProject, -} from 'aws-cdk-lib/aws-codebuild'; -import { IRepository } from 'aws-cdk-lib/aws-ecr'; +} from "aws-cdk-lib/aws-codebuild"; +import { IRepository } from "aws-cdk-lib/aws-ecr"; import { ISecurityGroup, @@ -27,15 +27,18 @@ import { 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'; +} 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. + * + * @deprecated Use the new {@link EmbeddedLinuxCodePipelineProps} class instead. + * */ export interface EmbeddedLinuxPipelineProps extends cdk.StackProps { /** ECR Repository where the Build Host Image resides. */ @@ -63,9 +66,13 @@ export interface EmbeddedLinuxPipelineProps extends cdk.StackProps { } /** + * * The stack for creating a build pipeline. * * See {@link EmbeddedLinuxPipelineProps} for configration options. + * + * @deprecated Use the new {@link EmbeddedLinuxCodePipelineStack} class instead. + * */ export class EmbeddedLinuxPipelineStack extends cdk.Stack { constructor(scope: Construct, id: string, props: EmbeddedLinuxPipelineProps) { @@ -73,19 +80,29 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { /** Set up networking access and EFS FileSystems. */ - const projectSg = new SecurityGroup(this, 'BuildProjectSecurityGroup', { + const projectSg = new SecurityGroup(this, "BuildProjectSecurityGroup", { vpc: props.vpc, - description: 'Security Group to allow attaching EFS', + description: "Security Group to allow attaching EFS", }); projectSg.addIngressRule( Peer.ipv4(props.vpc.vpcCidrBlock), Port.tcp(2049), - 'NFS Mount Port' + "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); + // const sstateFS = this.addFileSystem("SState", props.vpc, projectSg); + // const dlFS = this.addFileSystem("Downloads", props.vpc, projectSg); + // const tmpFS = this.addFileSystem("Temp", props.vpc, projectSg); + const efsFileSystem: efs.FileSystem = new efs.FileSystem( + this, + `EFSFileSystem`, + { + vpc: props.vpc, + allowAnonymousAccess: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + }, + ); + efsFileSystem.connections.allowFrom(projectSg, Port.tcp(2049)); let outputBucket: s3.IBucket | VMImportBucket; let environmentVariables = {}; @@ -95,7 +112,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { if (props.accessLoggingBucket) { accessLoggingBucket = props.accessLoggingBucket; } else { - accessLoggingBucket = new s3.Bucket(this, 'ArtifactAccessLogging', { + accessLoggingBucket = new s3.Bucket(this, "ArtifactAccessLogging", { versioned: true, enforceSSL: true, autoDeleteObjects: true, @@ -104,27 +121,26 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { } if (props.projectKind && props.projectKind == ProjectKind.PokyAmi) { - scriptAsset = new Asset(this, 'CreateAMIScript', { - path: path.join(__dirname, '../assets/create-ec2-ami.sh'), + scriptAsset = new Asset(this, "CreateAMIScript", { + path: path.join(__dirname, "../../scripts/create-ec2-ami.sh"), }); const outputBucketEncryptionKey = new kms.Key( this, - 'OutputBucketEncryptionKey', + "OutputBucketEncryptionKey", { removalPolicy: RemovalPolicy.DESTROY, enableKeyRotation: true, - } + }, ); if (props.outputBucket) { outputBucket = props.outputBucket; } else { - outputBucket = new VMImportBucket(this, 'PipelineOutput', { + outputBucket = new VMImportBucket(this, "PipelineOutput", { versioned: true, enforceSSL: true, encryptionKey: outputBucketEncryptionKey, - encryptionKeyArn: outputBucketEncryptionKey.keyArn, serverAccessLogsBucket: accessLoggingBucket, serverAccessLogsPrefix: props.serverAccessLogsPrefix, autoDeleteObjects: true, @@ -149,7 +165,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { if (props.outputBucket) { outputBucket = props.outputBucket; } else { - outputBucket = new s3.Bucket(this, 'PipelineOutput', { + outputBucket = new s3.Bucket(this, "PipelineOutput", { versioned: true, enforceSSL: true, serverAccessLogsBucket: accessLoggingBucket, @@ -164,18 +180,18 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { if (props.artifactBucket) { artifactBucket = props.artifactBucket; } else { - const encryptionKey = new kms.Key(this, 'PipelineArtifactKey', { + const encryptionKey = new kms.Key(this, "PipelineArtifactKey", { removalPolicy: RemovalPolicy.DESTROY, enableKeyRotation: true, }); - artifactBucket = new s3.Bucket(this, 'PipelineArtifacts', { + 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 + s3.BlockPublicAccess.BLOCK_ALL, ), autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY, @@ -183,7 +199,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { } /** Create our CodePipeline Actions. */ - const sourceRepo = new SourceRepo(this, 'SourceRepo', { + const sourceRepo = new SourceRepo(this, "SourceRepo", { ...props, repoName: props.layerRepoName ?? `layer-repo-${this.stackName}`, kind: props.projectKind ?? ProjectKind.Poky, @@ -193,19 +209,19 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { const sourceAction = new codepipeline_actions.CodeCommitSourceAction({ // trigger: CodeCommitTrigger.NONE, output: sourceOutput, - actionName: 'Source', + actionName: "Source", repository: sourceRepo.repo, - branch: 'main', + branch: "main", codeBuildCloneOutput: true, }); - const project = new PipelineProject(this, 'EmbeddedLinuxBuildProject', { - buildSpec: BuildSpec.fromSourceFilename('build.buildspec.yml'), + const project = new PipelineProject(this, "EmbeddedLinuxBuildProject", { + buildSpec: BuildSpec.fromSourceFilename("build.buildspec.yml"), environment: { computeType: ComputeType.X2_LARGE, buildImage: LinuxBuildImage.fromEcrRepository( props.imageRepo, - props.imageTag + props.imageTag, ), privileged: true, environmentVariables, @@ -213,27 +229,35 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { timeout: cdk.Duration.hours(4), vpc: props.vpc, securityGroups: [projectSg], + // fileSystemLocations: [ + // FileSystemLocation.efs({ + // identifier: "tmp_dir", + // location: tmpFS, + // mountPoint: "/nfs/build-output", + // }), + // FileSystemLocation.efs({ + // identifier: "sstate_cache", + // location: sstateFS, + // mountPoint: "/nfs/sstate-cache", + // }), + // FileSystemLocation.efs({ + // identifier: "dl_dir", + // location: dlFS, + // mountPoint: "/nfs/downloads", + // }), + // ], 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', + identifier: "nfs", + location: `${efsFileSystem.fileSystemId}.efs.${efsFileSystem.env.region}.amazonaws.com:/`, + mountPoint: "/nfs", }), ], logging: { cloudWatch: { - logGroup: new LogGroup(this, 'PipelineBuildLogs', { - retention: RetentionDays.TEN_YEARS, + logGroup: new LogGroup(this, "PipelineBuildLogs", { + retention: RetentionDays.ONE_YEAR, + removalPolicy: cdk.RemovalPolicy.DESTROY, }), }, }, @@ -249,16 +273,16 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { project.addToRolePolicy( new iam.PolicyStatement({ - actions: ['ec2:ImportSnapshot'], + 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) + this.addAMIS3BackupPolicy(outputBucket.bucketArn), ); project.addToRolePolicy(this.addAMIEC2EBSBackupPolicy(this.region)); project.addToRolePolicy(this.addAMIEBSBackupPolicy(this.region)); @@ -269,7 +293,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { const buildOutput = new codepipeline.Artifact(); const buildAction = new codepipeline_actions.CodeBuildAction({ input: sourceOutput, - actionName: 'Build', + actionName: "Build", outputs: [buildOutput], project, }); @@ -278,14 +302,14 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { if (props.subDirectoryName) { artifactAction = new codepipeline_actions.S3DeployAction({ - actionName: 'Artifact', + actionName: "Artifact", input: buildOutput, bucket: outputBucket, objectKey: props.subDirectoryName, }); } else { artifactAction = new codepipeline_actions.S3DeployAction({ - actionName: 'Artifact', + actionName: "Artifact", input: buildOutput, bucket: outputBucket, }); @@ -295,10 +319,10 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { * and stop the execution if the image does not exist. */ const fnOnPipelineCreate = new lambda.Function( this, - 'OSImageCheckOnStart', + "OSImageCheckOnStart", { runtime: lambda.Runtime.PYTHON_3_10, - handler: 'index.handler', + handler: "index.handler", code: lambda.Code.fromInline(` import boto3 import json @@ -320,65 +344,65 @@ def handler(event, context): abandon=True, reason='OS image not found in ECR repository. Stopping pipeline until image is present.') `), - logRetention: RetentionDays.TEN_YEARS, - } + logRetention: RetentionDays.ONE_YEAR, + }, ); - const pipelineCreateRule = new events.Rule(this, 'OnPipelineStartRule', { + const pipelineCreateRule = new events.Rule(this, "OnPipelineStartRule", { eventPattern: { - detailType: ['CodePipeline Pipeline Execution State Change'], - source: ['aws.codepipeline'], + detailType: ["CodePipeline Pipeline Execution State Change"], + source: ["aws.codepipeline"], detail: { - state: ['STARTED'], - 'execution-trigger': { - 'trigger-type': ['CreatePipeline'], + state: ["STARTED"], + "execution-trigger": { + "trigger-type": ["CreatePipeline"], }, }, }, }); pipelineCreateRule.addTarget( - new targets.LambdaFunction(fnOnPipelineCreate) + new targets.LambdaFunction(fnOnPipelineCreate), ); /** Now create the actual Pipeline */ - const pipeline = new codepipeline.Pipeline(this, 'EmbeddedLinuxPipeline', { + const pipeline = new codepipeline.Pipeline(this, "EmbeddedLinuxPipeline", { artifactBucket, restartExecutionOnUpdate: true, pipelineType: codepipeline.PipelineType.V1, stages: [ { - stageName: 'Source', + stageName: "Source", actions: [sourceAction], }, { - stageName: 'Build', + stageName: "Build", actions: [buildAction], }, { - stageName: 'Artifact', + stageName: "Artifact", actions: [artifactAction], }, ], }); const stopPipelinePolicy = new iam.PolicyStatement({ - actions: ['codepipeline:StopPipelineExecution'], + actions: ["codepipeline:StopPipelineExecution"], resources: [pipeline.pipelineArn], }); const ecrPolicy = new iam.PolicyStatement({ - actions: ['ecr:DescribeImages'], + actions: ["ecr:DescribeImages"], resources: [props.imageRepo.repositoryArn], }); fnOnPipelineCreate.role?.attachInlinePolicy( - new iam.Policy(this, 'CheckOSAndStop', { + new iam.Policy(this, "CheckOSAndStop", { statements: [stopPipelinePolicy, ecrPolicy], - }) + }), ); - new cdk.CfnOutput(this, 'BuildOutput', { + new cdk.CfnOutput(this, "BuildOutput", { value: outputBucket.bucketArn, - description: 'The output bucket of this pipeline.', + description: "The output bucket of this pipeline.", }); } @@ -394,7 +418,7 @@ def handler(event, context): private addFileSystem( name: string, vpc: IVpc, - securityGroup: ISecurityGroup + securityGroup: ISecurityGroup, ): string { const fs = new efs.FileSystem( this, @@ -402,7 +426,7 @@ def handler(event, context): { vpc, removalPolicy: cdk.RemovalPolicy.DESTROY, - } + }, ); fs.connections.allowFrom(securityGroup, Port.tcp(2049)); @@ -415,26 +439,26 @@ def handler(event, context): private addVMExportPolicy(): iam.PolicyStatement { return new iam.PolicyStatement({ actions: [ - 'ec2:CreateImage', - 'ec2:CreateTags', - 'ec2:DescribeImages', - 'ec2:DescribeSnapshots', - 'ec2:DescribeImportSnapshotTasks', - 'ec2:DescribeTags', - 'ec2:CancelImportTask', + "ec2:CreateImage", + "ec2:CreateTags", + "ec2:DescribeImages", + "ec2:DescribeSnapshots", + "ec2:DescribeImportSnapshotTasks", + "ec2:DescribeTags", + "ec2:CancelImportTask", ], - resources: ['*'], + resources: ["*"], }); } private addAMIS3BackupPolicy(artifactBucketArn: string): iam.PolicyStatement { return new iam.PolicyStatement({ actions: [ - 's3:GetObject', - 's3:ListBucket', - 's3:PutObject', - 's3:PutObjectTagging', - 's3:AbortMultipartUpload', + "s3:GetObject", + "s3:ListBucket", + "s3:PutObject", + "s3:PutObjectTagging", + "s3:AbortMultipartUpload", ], resources: [artifactBucketArn, `${artifactBucketArn}/*`], }); @@ -442,11 +466,11 @@ def handler(event, context): private addAMIEBSBackupPolicy(region: string): iam.PolicyStatement { return new iam.PolicyStatement({ actions: [ - 'ebs:CompleteSnapshot', - 'ebs:GetSnapshotBlock', - 'ebs:ListChangedBlocks', - 'ebs:ListSnapshotBlocks', - 'ebs:PutSnapshotBlock', + "ebs:CompleteSnapshot", + "ebs:GetSnapshotBlock", + "ebs:ListChangedBlocks", + "ebs:ListSnapshotBlocks", + "ebs:PutSnapshotBlock", ], resources: [`arn:aws:ec2:${region}::snapshot/*`], }); @@ -454,17 +478,17 @@ def handler(event, context): private addAMIBackupPolicy(): iam.PolicyStatement { return new iam.PolicyStatement({ - actions: ['ec2:DescribeStoreImageTasks', 'ec2:GetEbsEncryptionByDefault'], - resources: ['*'], + actions: ["ec2:DescribeStoreImageTasks", "ec2:GetEbsEncryptionByDefault"], + resources: ["*"], }); } private addAMIEC2EBSBackupPolicy(region: string): iam.PolicyStatement { return new iam.PolicyStatement({ actions: [ - 'ec2:RegisterImage', - 'ec2:DeregisterImage', - 'ec2:CreateStoreImageTask', + "ec2:RegisterImage", + "ec2:DeregisterImage", + "ec2:CreateStoreImageTask", ], resources: [ `arn:aws:ec2:${region}::image/*`, diff --git a/lib/network.ts b/lib/deprecated/network.ts similarity index 57% rename from lib/network.ts rename to lib/deprecated/network.ts index 75b8c4f..314656c 100644 --- a/lib/network.ts +++ b/lib/deprecated/network.ts @@ -1,13 +1,17 @@ -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'; +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. + * + * @deprecated Use the new {@link PipelineResourcesStack} class instead. + * */ export class PipelineNetworkStack extends cdk.Stack { /** The VPC for the pipeline to reside in. */ @@ -18,16 +22,17 @@ export class PipelineNetworkStack extends cdk.Stack { // 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'), + this.vpc = new ec2.Vpc(this, "PipelineVpc", { + ipAddresses: ec2.IpAddresses.cidr("10.0.0.0/16"), }); - new ec2.FlowLog(this, 'VPCFlowLogs', { + new ec2.FlowLog(this, "VPCFlowLogs", { resourceType: ec2.FlowLogResourceType.fromVpc(this.vpc), destination: ec2.FlowLogDestination.toCloudWatchLogs( - new LogGroup(this, 'LogGroup', { - retention: RetentionDays.TEN_YEARS, - }) + new LogGroup(this, "LogGroup", { + retention: RetentionDays.ONE_YEAR, + removalPolicy: cdk.RemovalPolicy.DESTROY, + }), ), }); } 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/__snapshots__/build-image-data.test.ts.snap b/test/deprecated/__snapshots__/build-image-data.test.ts.snap similarity index 99% rename from test/__snapshots__/build-image-data.test.ts.snap rename to test/deprecated/__snapshots__/build-image-data.test.ts.snap index 3137bf0..920a3b9 100644 --- a/test/__snapshots__/build-image-data.test.ts.snap +++ b/test/deprecated/__snapshots__/build-image-data.test.ts.snap @@ -70,7 +70,7 @@ exports[`Build Image Data Snapshot 1`] = ` "logs:PutLogEvents", ], "Effect": "Allow", - "Resource": "arn:aws:logs:eu-central-1:111111111111:log-group:/aws/lambda/BuildImageData-CustomCDKBucketDeployment*"", + "Resource": "arn:aws:logs:eu-central-1:111111111111:log-group:/aws/lambda/BuildImageData-CustomCDKBucketDeployment*", }, ], "Version": "2012-10-17", diff --git a/test/__snapshots__/build-image-pipeline.test.ts.snap b/test/deprecated/__snapshots__/build-image-pipeline.test.ts.snap similarity index 99% rename from test/__snapshots__/build-image-pipeline.test.ts.snap rename to test/deprecated/__snapshots__/build-image-pipeline.test.ts.snap index 61ea95d..66a4c3b 100644 --- a/test/__snapshots__/build-image-pipeline.test.ts.snap +++ b/test/deprecated/__snapshots__/build-image-pipeline.test.ts.snap @@ -140,12 +140,12 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Type": "AWS::S3::BucketPolicy", }, "BuildImageBuildLogs65D4471D": { - "DeletionPolicy": "Retain", + "DeletionPolicy": "Delete", "Properties": { - "RetentionInDays": 3653, + "RetentionInDays": 365, }, "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", + "UpdateReplacePolicy": "Delete", }, "BuildImagePipeline01DF392E": { "DependsOn": [ @@ -191,7 +191,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "S3Bucket": { "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", }, - "S3ObjectKey": "data.zip", + "S3ObjectKey": "source-base-image.zip", }, "Name": "Build-Image-Source", "OutputArtifacts": [ @@ -511,7 +511,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` { "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttBucket83908E77Arn063C8555", }, - "/data.zip", + "/source-base-image.zip", ], ], }, @@ -677,7 +677,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` ], }, "Source": { - "BuildSpec": "ubuntu_22_04/buildspec.yml", + "BuildSpec": "buildspec.yml", "Type": "CODEPIPELINE", }, }, diff --git a/test/__snapshots__/build-image-repo.test.ts.snap b/test/deprecated/__snapshots__/build-image-repo.test.ts.snap similarity index 100% rename from test/__snapshots__/build-image-repo.test.ts.snap rename to test/deprecated/__snapshots__/build-image-repo.test.ts.snap diff --git a/test/__snapshots__/embedded-linux-pipeline.test.ts.snap b/test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap similarity index 86% rename from test/__snapshots__/embedded-linux-pipeline.test.ts.snap rename to test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap index f1f29b4..c1a9042 100644 --- a/test/__snapshots__/embedded-linux-pipeline.test.ts.snap +++ b/test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap @@ -275,6 +275,120 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` }, "Type": "AWS::IAM::Role", }, + "EFSFileSystem3D4FCE7F": { + "DeletionPolicy": "Delete", + "Properties": { + "Encrypted": true, + "FileSystemTags": [ + { + "Key": "Name", + "Value": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EFSFileSystem", + }, + ], + }, + "Type": "AWS::EFS::FileSystem", + "UpdateReplacePolicy": "Delete", + }, + "EFSFileSystemEfsMountTarget178C2E276": { + "Properties": { + "FileSystemId": { + "Ref": "EFSFileSystem3D4FCE7F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EFSFileSystemEfsSecurityGroup5486A2B1", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EFSFileSystemEfsMountTarget2F4D1BB6B": { + "Properties": { + "FileSystemId": { + "Ref": "EFSFileSystem3D4FCE7F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EFSFileSystemEfsSecurityGroup5486A2B1", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EFSFileSystemEfsMountTarget3FFC5E69F": { + "Properties": { + "FileSystemId": { + "Ref": "EFSFileSystem3D4FCE7F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EFSFileSystemEfsSecurityGroup5486A2B1", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EFSFileSystemEfsSecurityGroup5486A2B1": { + "Properties": { + "GroupDescription": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EFSFileSystem/EfsSecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1", + }, + ], + "Tags": [ + { + "Key": "Name", + "Value": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EFSFileSystem", + }, + ], + "VpcId": { + "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", + }, + }, + "Type": "AWS::EC2::SecurityGroup", + }, + "EFSFileSystemEfsSecurityGroupfromPokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992BuildProjectSecurityGroup1FC90CF52049C427FFB2": { + "Properties": { + "Description": "from PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992BuildProjectSecurityGroup1FC90CF5:2049", + "FromPort": 2049, + "GroupId": { + "Fn::GetAtt": [ + "EFSFileSystemEfsSecurityGroup5486A2B1", + "GroupId", + ], + }, + "IpProtocol": "tcp", + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "BuildProjectSecurityGroup28D27668", + "GroupId", + ], + }, + "ToPort": 2049, + }, + "Type": "AWS::EC2::SecurityGroupIngress", + }, "EmbeddedLinuxBuildProject45760157": { "DependsOn": [ "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", @@ -364,51 +478,19 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` }, "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", + "Identifier": "nfs", "Location": { "Fn::Join": [ "", [ { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", + "Ref": "EFSFileSystem3D4FCE7F", }, ".efs.eu-central-1.amazonaws.com:/", ], ], }, - "MountPoint": "/downloads", + "MountPoint": "/nfs", "Type": "EFS", }, ], @@ -1298,120 +1380,6 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` }, "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": { @@ -1580,121 +1548,7 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` }, "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": { + "EmbeddedLinuxPipelineSourceCodePipelineActionRoleDefaultPolicyE4783D85": { "Properties": { "PolicyDocument": { "Statement": [ @@ -1808,120 +1662,6 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` }, "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", @@ -2062,7 +1802,7 @@ def handler(event, context): ], ], }, - "RetentionInDays": 3653, + "RetentionInDays": 365, "ServiceToken": { "Fn::GetAtt": [ "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", @@ -2369,12 +2109,12 @@ def handler(event, context): "Type": "AWS::S3::BucketPolicy", }, "PipelineBuildLogs0533272F": { - "DeletionPolicy": "Retain", + "DeletionPolicy": "Delete", "Properties": { - "RetentionInDays": 3653, + "RetentionInDays": 365, }, "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", + "UpdateReplacePolicy": "Delete", }, "PipelineOutput78594CB5": { "DeletionPolicy": "Delete", @@ -2995,73 +2735,187 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` }, "Type": "AWS::IAM::Role", }, - "EmbeddedLinuxBuildProject45760157": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - ], + "EFSFileSystem3D4FCE7F": { + "DeletionPolicy": "Delete", "Properties": { - "Artifacts": { - "Type": "CODEPIPELINE", + "Encrypted": true, + "FileSystemTags": [ + { + "Key": "Name", + "Value": "MyTestStack/EFSFileSystem", + }, + ], + }, + "Type": "AWS::EFS::FileSystem", + "UpdateReplacePolicy": "Delete", + }, + "EFSFileSystemEfsMountTarget178C2E276": { + "Properties": { + "FileSystemId": { + "Ref": "EFSFileSystem3D4FCE7F", }, - "Cache": { - "Type": "NO_CACHE", + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EFSFileSystemEfsSecurityGroup5486A2B1", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", }, - "EncryptionKey": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], + }, + "Type": "AWS::EFS::MountTarget", + }, + "EFSFileSystemEfsMountTarget2F4D1BB6B": { + "Properties": { + "FileSystemId": { + "Ref": "EFSFileSystem3D4FCE7F", }, - "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", - }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EFSFileSystemEfsSecurityGroup5486A2B1", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EFSFileSystemEfsMountTarget3FFC5E69F": { + "Properties": { + "FileSystemId": { + "Ref": "EFSFileSystem3D4FCE7F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EFSFileSystemEfsSecurityGroup5486A2B1", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EFSFileSystemEfsSecurityGroup5486A2B1": { + "Properties": { + "GroupDescription": "MyTestStack/EFSFileSystem/EfsSecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1", + }, + ], + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/EFSFileSystem", + }, + ], + "VpcId": { + "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", + }, + }, + "Type": "AWS::EC2::SecurityGroup", + }, + "EFSFileSystemEfsSecurityGroupfromMyTestStackBuildProjectSecurityGroupA374A3A92049B46A9A5C": { + "Properties": { + "Description": "from MyTestStackBuildProjectSecurityGroupA374A3A9:2049", + "FromPort": 2049, + "GroupId": { + "Fn::GetAtt": [ + "EFSFileSystemEfsSecurityGroup5486A2B1", + "GroupId", + ], + }, + "IpProtocol": "tcp", + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "BuildProjectSecurityGroup28D27668", + "GroupId", + ], + }, + "ToPort": 2049, + }, + "Type": "AWS::EC2::SecurityGroupIngress", + }, + "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", + }, ], }, ], @@ -3084,51 +2938,19 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` }, "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", + "Identifier": "nfs", "Location": { "Fn::Join": [ "", [ { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", + "Ref": "EFSFileSystem3D4FCE7F", }, ".efs.eu-central-1.amazonaws.com:/", ], ], }, - "MountPoint": "/downloads", + "MountPoint": "/nfs", "Type": "EFS", }, ], @@ -4018,190 +3840,76 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` }, "Type": "AWS::IAM::Policy", }, - "EmbeddedLinuxPipelineDownloadsFilesystem1772812C": { - "DeletionPolicy": "Delete", + "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B": { "Properties": { - "Encrypted": true, - "FileSystemTags": [ + "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": [ { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineDownloadsFilesystem", + "Ref": "EmbeddedLinuxPipelineEventsRoleF9DA96F1", }, ], }, - "Type": "AWS::EFS::FileSystem", - "UpdateReplacePolicy": "Delete", + "Type": "AWS::IAM::Policy", }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsMountTarget1CA5C8C01": { + "EmbeddedLinuxPipelineEventsRoleF9DA96F1": { "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "events.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", }, }, - "Type": "AWS::EFS::MountTarget", + "Type": "AWS::IAM::Role", }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsMountTarget2BC3B1054": { + "EmbeddedLinuxPipelineRole1094A815": { "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codepipeline.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", }, }, - "Type": "AWS::EFS::MountTarget", + "Type": "AWS::IAM::Role", }, - "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": { + "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9": { "Properties": { "PolicyDocument": { "Statement": [ @@ -4300,120 +4008,6 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` }, "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": { @@ -4496,151 +4090,37 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` { "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", + "Type": "AWS::IAM::Policy", }, - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupfromMyTestStackBuildProjectSecurityGroupA374A3A9204979E58A91": { + "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6": { "Properties": { - "Description": "from MyTestStackBuildProjectSecurityGroupA374A3A9:2049", - "FromPort": 2049, - "GroupId": { - "Fn::GetAtt": [ - "EmbeddedLinuxPipelineTempFilesystemEfsSecurityGroupE46E3213", - "GroupId", - ], - }, - "IpProtocol": "tcp", - "SourceSecurityGroupId": { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::12341234:root", + ], + ], + }, + }, + }, ], + "Version": "2012-10-17", }, - "ToPort": 2049, }, - "Type": "AWS::EC2::SecurityGroupIngress", + "Type": "AWS::IAM::Role", }, "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A": { "DependsOn": [ @@ -4782,7 +4262,7 @@ def handler(event, context): ], ], }, - "RetentionInDays": 3653, + "RetentionInDays": 365, "ServiceToken": { "Fn::GetAtt": [ "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", @@ -5089,12 +4569,12 @@ def handler(event, context): "Type": "AWS::S3::BucketPolicy", }, "PipelineBuildLogs0533272F": { - "DeletionPolicy": "Retain", + "DeletionPolicy": "Delete", "Properties": { - "RetentionInDays": 3653, + "RetentionInDays": 365, }, "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", + "UpdateReplacePolicy": "Delete", }, "PipelineOutput78594CB5": { "DeletionPolicy": "Delete", @@ -5715,6 +5195,120 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` }, "Type": "AWS::IAM::Role", }, + "EFSFileSystem3D4FCE7F": { + "DeletionPolicy": "Delete", + "Properties": { + "Encrypted": true, + "FileSystemTags": [ + { + "Key": "Name", + "Value": "MyTestStack/EFSFileSystem", + }, + ], + }, + "Type": "AWS::EFS::FileSystem", + "UpdateReplacePolicy": "Delete", + }, + "EFSFileSystemEfsMountTarget178C2E276": { + "Properties": { + "FileSystemId": { + "Ref": "EFSFileSystem3D4FCE7F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EFSFileSystemEfsSecurityGroup5486A2B1", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EFSFileSystemEfsMountTarget2F4D1BB6B": { + "Properties": { + "FileSystemId": { + "Ref": "EFSFileSystem3D4FCE7F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EFSFileSystemEfsSecurityGroup5486A2B1", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EFSFileSystemEfsMountTarget3FFC5E69F": { + "Properties": { + "FileSystemId": { + "Ref": "EFSFileSystem3D4FCE7F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EFSFileSystemEfsSecurityGroup5486A2B1", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EFSFileSystemEfsSecurityGroup5486A2B1": { + "Properties": { + "GroupDescription": "MyTestStack/EFSFileSystem/EfsSecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1", + }, + ], + "Tags": [ + { + "Key": "Name", + "Value": "MyTestStack/EFSFileSystem", + }, + ], + "VpcId": { + "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", + }, + }, + "Type": "AWS::EC2::SecurityGroup", + }, + "EFSFileSystemEfsSecurityGroupfromMyTestStackBuildProjectSecurityGroupA374A3A92049B46A9A5C": { + "Properties": { + "Description": "from MyTestStackBuildProjectSecurityGroupA374A3A9:2049", + "FromPort": 2049, + "GroupId": { + "Fn::GetAtt": [ + "EFSFileSystemEfsSecurityGroup5486A2B1", + "GroupId", + ], + }, + "IpProtocol": "tcp", + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "BuildProjectSecurityGroup28D27668", + "GroupId", + ], + }, + "ToPort": 2049, + }, + "Type": "AWS::EC2::SecurityGroupIngress", + }, "EmbeddedLinuxBuildProject45760157": { "DependsOn": [ "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", @@ -5783,51 +5377,19 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` }, "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", + "Identifier": "nfs", "Location": { "Fn::Join": [ "", [ { - "Ref": "EmbeddedLinuxPipelineDownloadsFilesystem1772812C", + "Ref": "EFSFileSystem3D4FCE7F", }, ".efs.eu-central-1.amazonaws.com:/", ], ], }, - "MountPoint": "/downloads", + "MountPoint": "/nfs", "Type": "EFS", }, ], @@ -6499,151 +6061,37 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` "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", + "Type": "AWS::IAM::Role", }, - "EmbeddedLinuxPipelineDownloadsFilesystemEfsSecurityGroup844F0D38": { + "EmbeddedLinuxPipelineBuildCodePipelineActionRoleDefaultPolicy176F5E4B": { "Properties": { - "GroupDescription": "MyTestStack/EmbeddedLinuxPipelineDownloadsFilesystem/EfsSecurityGroup", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "Tags": [ + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "codebuild:BatchGetBuilds", + "codebuild:StartBuild", + "codebuild:StopBuild", + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "EmbeddedLinuxBuildProject45760157", + "Arn", + ], + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxPipelineBuildCodePipelineActionRoleDefaultPolicy176F5E4B", + "Roles": [ { - "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxPipelineDownloadsFilesystem", + "Ref": "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4", }, ], - "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", + "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B": { "Properties": { @@ -6813,120 +6261,6 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` }, "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": { @@ -7041,120 +6375,6 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` }, "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", @@ -7295,7 +6515,7 @@ def handler(event, context): ], ], }, - "RetentionInDays": 3653, + "RetentionInDays": 365, "ServiceToken": { "Fn::GetAtt": [ "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", @@ -7570,12 +6790,12 @@ def handler(event, context): "Type": "AWS::S3::BucketPolicy", }, "PipelineBuildLogs0533272F": { - "DeletionPolicy": "Retain", + "DeletionPolicy": "Delete", "Properties": { - "RetentionInDays": 3653, + "RetentionInDays": 365, }, "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", + "UpdateReplacePolicy": "Delete", }, "PipelineOutput78594CB5": { "DeletionPolicy": "Delete", @@ -7709,7 +6929,7 @@ def handler(event, context): "BranchName": "main", "S3": { "Bucket": "cdk-hnb659fds-assets-12341234-eu-central-1", - "Key": "03d16bf861cb657df931bd33404567ac7f02ff927d18a45f5cc7f7cc981bb7ce.zip", + "Key": "2c3284e71ba6f2c28421a26a63b3f77e74abad491196ba63ec03dfb5b8674f59.zip", }, }, "RepositoryName": "layer-repo-MyTestStack", diff --git a/test/__snapshots__/network.test.ts.snap b/test/deprecated/__snapshots__/network.test.ts.snap similarity index 99% rename from test/__snapshots__/network.test.ts.snap rename to test/deprecated/__snapshots__/network.test.ts.snap index 30c6a66..b0b119c 100644 --- a/test/__snapshots__/network.test.ts.snap +++ b/test/deprecated/__snapshots__/network.test.ts.snap @@ -11,12 +11,12 @@ exports[`Pipeline Networking Snapshot 1`] = ` }, "Resources": { "LogGroupF5B46931": { - "DeletionPolicy": "Retain", + "DeletionPolicy": "Delete", "Properties": { - "RetentionInDays": 3653, + "RetentionInDays": 365, }, "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Retain", + "UpdateReplacePolicy": "Delete", }, "PipelineVpc0543904A": { "Properties": { diff --git a/test/__snapshots__/source-repo.test.ts.snap b/test/deprecated/__snapshots__/source-repo.test.ts.snap similarity index 93% rename from test/__snapshots__/source-repo.test.ts.snap rename to test/deprecated/__snapshots__/source-repo.test.ts.snap index d9190e0..220ae8e 100644 --- a/test/__snapshots__/source-repo.test.ts.snap +++ b/test/deprecated/__snapshots__/source-repo.test.ts.snap @@ -16,7 +16,7 @@ exports[`Pipeline Source Repository Snapshot 1`] = ` "BranchName": "main", "S3": { "Bucket": "cdk-hnb659fds-assets-12341234-eu-central-1", - "Key": "03d16bf861cb657df931bd33404567ac7f02ff927d18a45f5cc7f7cc981bb7ce.zip", + "Key": "2c3284e71ba6f2c28421a26a63b3f77e74abad491196ba63ec03dfb5b8674f59.zip", }, }, "RepositoryName": "charlie", diff --git a/test/deprecated/build-image-data-nag.test.ts b/test/deprecated/build-image-data-nag.test.ts new file mode 100644 index 0000000..6a39f1f --- /dev/null +++ b/test/deprecated/build-image-data-nag.test.ts @@ -0,0 +1,78 @@ +import * as cdk from "aws-cdk-lib"; +import { BuildImageDataStack } from "../../lib/deprecated/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/deprecated/build-image-data.test.ts b/test/deprecated/build-image-data.test.ts new file mode 100644 index 0000000..63ef5eb --- /dev/null +++ b/test/deprecated/build-image-data.test.ts @@ -0,0 +1,34 @@ +import * as cdk from "aws-cdk-lib"; +import { Template } from "aws-cdk-lib/assertions"; +import { BuildImageDataStack } from "../../lib/deprecated/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/deprecated/build-image-pipeline-nag.test.ts b/test/deprecated/build-image-pipeline-nag.test.ts new file mode 100644 index 0000000..cad5adc --- /dev/null +++ b/test/deprecated/build-image-pipeline-nag.test.ts @@ -0,0 +1,96 @@ +import * as cdk from "aws-cdk-lib"; +import { + BuildImagePipelineStack, + ImageKind, +} from "../../lib/deprecated/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/deprecated/build-image-pipeline.test.ts b/test/deprecated/build-image-pipeline.test.ts new file mode 100644 index 0000000..c7ada37 --- /dev/null +++ b/test/deprecated/build-image-pipeline.test.ts @@ -0,0 +1,55 @@ +import * as cdk from "aws-cdk-lib"; +import { Template } from "aws-cdk-lib/assertions"; +import { + BuildImagePipelineStack, + ImageKind, +} from "../../lib/deprecated/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: 365, + }); + 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/deprecated/build-image-repo-nag.test.ts b/test/deprecated/build-image-repo-nag.test.ts new file mode 100644 index 0000000..3645cbf --- /dev/null +++ b/test/deprecated/build-image-repo-nag.test.ts @@ -0,0 +1,36 @@ +import { BuildImageRepoStack } from "../../lib/deprecated/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/deprecated/build-image-repo.test.ts b/test/deprecated/build-image-repo.test.ts new file mode 100644 index 0000000..99030c9 --- /dev/null +++ b/test/deprecated/build-image-repo.test.ts @@ -0,0 +1,16 @@ +import * as cdk from "aws-cdk-lib"; +import { Template } from "aws-cdk-lib/assertions"; +import { BuildImageRepoStack } from "../../lib/deprecated/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/deprecated/embedded-linux-pipeline-nag.test.ts b/test/deprecated/embedded-linux-pipeline-nag.test.ts new file mode 100644 index 0000000..aaa733b --- /dev/null +++ b/test/deprecated/embedded-linux-pipeline-nag.test.ts @@ -0,0 +1,168 @@ +import { EmbeddedLinuxPipelineStack } from "../../lib/deprecated/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/deprecated/embedded-linux-pipeline.test.ts b/test/deprecated/embedded-linux-pipeline.test.ts new file mode 100644 index 0000000..9400335 --- /dev/null +++ b/test/deprecated/embedded-linux-pipeline.test.ts @@ -0,0 +1,97 @@ +import * as cdk from "aws-cdk-lib"; +import { Template } from "aws-cdk-lib/assertions"; +import { EmbeddedLinuxPipelineStack } from "../../lib/deprecated/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: 365, + }); + }); + + 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/deprecated/network.test-nag.test.ts b/test/deprecated/network.test-nag.test.ts new file mode 100644 index 0000000..7f11fc3 --- /dev/null +++ b/test/deprecated/network.test-nag.test.ts @@ -0,0 +1,39 @@ +import { PipelineNetworkStack } from "../../lib/deprecated/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/deprecated/network.test.ts b/test/deprecated/network.test.ts new file mode 100644 index 0000000..0da68dd --- /dev/null +++ b/test/deprecated/network.test.ts @@ -0,0 +1,26 @@ +import * as cdk from "aws-cdk-lib"; +import { Template } from "aws-cdk-lib/assertions"; +import { PipelineNetworkStack } from "../../lib/deprecated/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: 365, + }); + }); + + 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/deprecated/source-repo-nag.test.ts b/test/deprecated/source-repo-nag.test.ts new file mode 100644 index 0000000..723c20d --- /dev/null +++ b/test/deprecated/source-repo-nag.test.ts @@ -0,0 +1,46 @@ +import { + SourceRepo, + ProjectKind, +} from "../../lib/deprecated/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/deprecated/source-repo.test.ts b/test/deprecated/source-repo.test.ts new file mode 100644 index 0000000..992a249 --- /dev/null +++ b/test/deprecated/source-repo.test.ts @@ -0,0 +1,22 @@ +import * as cdk from "aws-cdk-lib"; +import { Template } from "aws-cdk-lib/assertions"; +import { + SourceRepo, + ProjectKind, +} from "../../lib/deprecated/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/deprecated/util.ts b/test/deprecated/util.ts new file mode 100644 index 0000000..97fc9e8 --- /dev/null +++ b/test/deprecated/util.ts @@ -0,0 +1,17 @@ +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. + */ +export function normalizedTemplateFromStack(stack: cdk.Stack): Template { + const templateWithRandomKeys = Template.fromStack(stack); + const templateWithConstKeys = JSON.parse( + JSON.stringify(templateWithRandomKeys.toJSON()).replace( + /[a-z0-9]{64}\.(zip|sh)/g, + "arbitrary-file.ext", + ), + ); + + return templateWithConstKeys; +} 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(); - }); -}); From 047860dcd32838b1260492ed9585c6d476f7be87 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 16:54:16 +0100 Subject: [PATCH 011/112] updating package-lock.json --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7e59a76..027e72f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "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", "devDependencies": { "@eslint/compat": "^1.2.4", "@eslint/eslintrc": "^3.2.0", From 00c73eb53660925151e582ed5e59c2090bcee3e9 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 16:56:59 +0100 Subject: [PATCH 012/112] adding new refactored version of the CDK construct with less dependecies between each other: - improve the overall deployment time - reduce the number of EFS instance requried (1 from 3 per pipeline) - provide reuable resourcess across pipelines (s3 buckets, kms keys, ecr reigistry, etc) - remove oprhan code --- lib/codebuild-embedded-linux.ts | 205 ++ lib/codepipeline-embedded-linux-base-image.ts | 210 ++ lib/codepipeline-embedded-linux.ts | 459 ++++ lib/codepipeline-resources.ts | 190 ++ lib/index.ts | 54 +- lib/vm-import-bucket.ts | 41 +- ...ine-embedded-linux-base-image.test.ts.snap | 1144 ++++++++++ .../codepipeline-embedded-linux.test.ts.snap | 1905 +++++++++++++++++ .../codepipeline-resources.test.ts.snap | 1642 ++++++++++++++ ...line-embedded-linux-base-image-nag.test.ts | 137 ++ ...pipeline-embedded-linux-base-image.test.ts | 65 + test/codepipeline-embedded-linux-nag.test.ts | 204 ++ test/codepipeline-embedded-linux.test.ts | 99 + test/codepipeline-resources-nag.test.ts | 71 + test/codepipeline-resources.test.ts | 65 + test/util.ts | 13 +- 16 files changed, 6473 insertions(+), 31 deletions(-) create mode 100644 lib/codebuild-embedded-linux.ts create mode 100644 lib/codepipeline-embedded-linux-base-image.ts create mode 100644 lib/codepipeline-embedded-linux.ts create mode 100644 lib/codepipeline-resources.ts create mode 100644 test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap create mode 100644 test/__snapshots__/codepipeline-embedded-linux.test.ts.snap create mode 100644 test/__snapshots__/codepipeline-resources.test.ts.snap create mode 100644 test/codepipeline-embedded-linux-base-image-nag.test.ts create mode 100644 test/codepipeline-embedded-linux-base-image.test.ts create mode 100644 test/codepipeline-embedded-linux-nag.test.ts create mode 100644 test/codepipeline-embedded-linux.test.ts create mode 100644 test/codepipeline-resources-nag.test.ts create mode 100644 test/codepipeline-resources.test.ts diff --git a/lib/codebuild-embedded-linux.ts b/lib/codebuild-embedded-linux.ts new file mode 100644 index 0000000..4049867 --- /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.X2_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..279ec27 --- /dev/null +++ b/lib/codepipeline-embedded-linux-base-image.ts @@ -0,0 +1,210 @@ +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 * 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 source bucket */ + readonly sourceBucket: s3.IBucket; + /** The ECR Repository to push to. */ + readonly ecrRepository: ecr.IRepository; + /** Artifact bucket to use */ + readonly artifactBucket: s3.Bucket; + /** 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 sourceBase: string = "base-image"; + const sourceFileName: string = `source-${sourceBase}.zip`; + const sourceLocalPath: string = `source-zip/${sourceBase}`; + const sourceDestinationKeyPrefix: string = `source/${sourceBase}`; + + // create the policy & role for the source bucket deployment + const sourceBucketDeploymentPolicy = 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 sourceBucketDeploymentRole = new iam.Role( + this, + "CodePipelineBuildBaseImageBucketDeploymentRole", + { + assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"), + inlinePolicies: { sourceBucketDeploymentPolicy }, + }, + ); + + // deploy the source to the bucket + const bucketDeployment = new BucketDeployment( + this, + "CodePipelineBuildBaseImageBucketDeployment", + { + // Note: Run `npm run zip-data` before deploying this stack! + sources: [Source.asset(path.join(__dirname, "..", sourceLocalPath))], + destinationBucket: props.sourceBucket, + role: sourceBucketDeploymentRole, + extract: true, + destinationKeyPrefix: sourceDestinationKeyPrefix, + }, + ); + + // Create a source action. + const sourceOutput = new codepipeline.Artifact("Source"); + const sourceAction = new codepipeline_actions.S3SourceAction({ + actionName: "Source", + trigger: codepipeline_actions.S3Trigger.EVENTS, + output: sourceOutput, + bucket: props.sourceBucket, + bucketKey: `${sourceDestinationKeyPrefix}/${sourceFileName}`, + }); + + // Create a build action. + const project = new codebuild.PipelineProject( + this, + "CodePipelineBuildBaseImageProject", + { + projectName: `${this.ecrRepositoryImageTag}`, + buildSpec: codebuild.BuildSpec.fromSourceFilename(`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.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: sourceOutput, + }); + + const pipeline = new codepipeline.Pipeline( + this, + "CodePipelineBuildBaseImageCodePipeline", + { + artifactBucket: props.artifactBucket, + 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 a 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", + }); + } +} diff --git a/lib/codepipeline-embedded-linux.ts b/lib/codepipeline-embedded-linux.ts new file mode 100644 index 0000000..0d451e1 --- /dev/null +++ b/lib/codepipeline-embedded-linux.ts @@ -0,0 +1,459 @@ +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 path from "path"; +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 { VMImportBucket } from "./vm-import-bucket"; +import { ProjectKind } from "."; + +/** + * Properties to allow customizing the build. + */ +export interface EmbeddedLinuxCodePipelineProps extends cdk.StackProps { + /** The source bucket */ + readonly sourceBucket: s3.IBucket; + /** ECR Repository where the Build Host Image resides. */ + readonly ecrRepository: ecr.IRepository; + /** Tag for the Build Host Image */ + readonly ecrRepositoryImageTag: string; + /** Artifact bucket to use */ + readonly artifactBucket: s3.Bucket; + /** Output bucket to use */ + readonly outputBucket: s3.Bucket | VMImportBucket; + /** The type of project being built. */ + readonly projectKind: ProjectKind; + /** VPC where the networking setup resides. */ + readonly vpc: ec2.IVpc; + /** Prefix for S3 object within bucket */ + readonly artifactOutputObjectKey?: string; + /** 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 EmbeddedLinuxCodePipelineProps} for configration options. + */ +export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { + constructor( + scope: Construct, + id: string, + props: EmbeddedLinuxCodePipelineProps, + ) { + super(scope, id, props); + + if (props.projectKind && props.projectKind == ProjectKind.PokyAmi) { + if (!(props.outputBucket instanceof VMImportBucket)) { + throw "The 'outputBucket' property provided in [EmbeddedLinuxCodePipelineProps] is not of type [VMImportBucket] when using prokect kind [PokyAmi]"; + } + } + + const sourceBase: string = `${props.projectKind}`; + const sourceFileName: string = `source-${sourceBase}.zip`; + const sourceLocalPath: string = `source-zip/${sourceBase}`; + const sourceDestinationKeyPrefix: string = `source/${sourceBase}`; + + /** 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 sourceBucketDeploymentPolicy = 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/EmbeddedLinuxCodePipeline-CustomCDKBucketDeployment-${props.projectKind}*`, + ], + }), + ], + }); + const sourceBucketDeploymentRole = new iam.Role( + this, + "EmbeddedLinuxCodePipelineBucketDeploymentRole", + { + assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"), + inlinePolicies: { sourceBucketDeploymentPolicy }, + }, + ); + + // deploy the source to the bucket + const bucketDeployment = new BucketDeployment( + this, + "EmbeddedLinuxCodePipelineBucketDeployment", + { + // Note: Run `npm run zip-data` before deploying this stack! + sources: [Source.asset(path.join(__dirname, "..", sourceLocalPath))], + destinationBucket: props.sourceBucket, + role: sourceBucketDeploymentRole, + extract: true, + destinationKeyPrefix: sourceDestinationKeyPrefix, + }, + ); + + let environmentVariables = {}; + let scriptAsset!: Asset; + + if (props.projectKind && props.projectKind == ProjectKind.PokyAmi) { + scriptAsset = new Asset(this, "CreateAMIScript", { + path: path.join(__dirname, "../scripts/create-ec2-ami.sh"), + }); + + environmentVariables = { + IMPORT_BUCKET: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: props.outputBucket.bucketName, + }, + ROLE_NAME: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: (props.outputBucket as VMImportBucket).roleName, + }, + SCRIPT_URL: { + type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, + value: scriptAsset.s3ObjectUrl, + }, + }; + } + + /** Create our CodeCodePipeline Actions. */ + const sourceOutput = new codepipeline.Artifact("Source"); + const sourceAction = new codepipeline_actions.S3SourceAction({ + actionName: "Source", + trigger: codepipeline_actions.S3Trigger.EVENTS, + output: sourceOutput, + bucket: props.sourceBucket, + bucketKey: `${sourceDestinationKeyPrefix}/${sourceFileName}`, + }); + + const project = new codebuild.PipelineProject( + this, + "EmbeddedLinuxCodePipelineProject", + { + projectName: `${id}`, + buildSpec: codebuild.BuildSpec.fromSourceFilename( + "build.buildspec.yml", + ), + environment: { + computeType: codebuild.ComputeType.X2_LARGE, + buildImage: codebuild.LinuxBuildImage.fromEcrRepository( + props.ecrRepository, + props.ecrRepositoryImageTag, + ), + privileged: true, + environmentVariables: { + ...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, + }, + }, + }, + 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)); + } + + if (props.projectKind && props.projectKind == ProjectKind.PokyAmi) { + props.outputBucket.grantReadWrite(project); + project.addToRolePolicy(this.addVMExportPolicy()); + + 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( + this.addAMIS3BackupPolicy(props.outputBucket.bucketArn), + ); + project.addToRolePolicy( + this.addAMIEC2EBSBackupPolicy(cdk.Stack.of(this).region), + ); + project.addToRolePolicy( + this.addAMIEBSBackupPolicy(cdk.Stack.of(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.artifactOutputObjectKey) { + artifactAction = new codepipeline_actions.S3DeployAction({ + actionName: "Artifact", + input: buildOutput, + bucket: props.outputBucket, + objectKey: props.artifactOutputObjectKey, + }); + } else { + artifactAction = new codepipeline_actions.S3DeployAction({ + actionName: "Artifact", + input: buildOutput, + bucket: props.outputBucket, + }); + } + + /** 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.artifactBucket, + 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], + }); + + new cdk.CfnOutput(this, "BuildSource", { + value: `s3://${props.sourceBucket.bucketName}/${sourceDestinationKeyPrefix}/${sourceFileName}`, + description: "The source bucket key of this pipeline.", + }); + + new cdk.CfnOutput(this, "BuildOutput", { + value: props.outputBucket.bucketName, + description: "The output bucket of this pipeline.", + }); + } + + 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/codepipeline-resources.ts b/lib/codepipeline-resources.ts new file mode 100644 index 0000000..9069e7e --- /dev/null +++ b/lib/codepipeline-resources.ts @@ -0,0 +1,190 @@ +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"; + +import { VMImportBucket } from "./vm-import-bucket"; +/** + * 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 artifactBucketName?: string; + /** The source bucket name - if not provided then the name will be '{prefix}-{account}-{region}-source'*/ + readonly sourceBucketName?: string; + /** The source bucket name - if not provided then the name will be '{prefix}-{account}-{region}-output'*/ + readonly outputBucketName?: string; + /** The source bucket name - if not provided then the name will be '{prefix}-{account}-{region}-output-vm-import'*/ + readonly outputVMImportBucketName?: string; + /** Access logging bucket name - if not provided then the name will be '{prefix}-{account}-{region}-logs'*/ + readonly accessLoggingBucketName?: 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 source bucket*/ + public readonly sourceBucket: s3.IBucket; + /** the artifact bucket*/ + public readonly artifactBucket: s3.Bucket; + /** The access logging bucket to use*/ + public readonly accessLoggingBucket?: s3.Bucket; + /** The output bucket*/ + public readonly outputBucket: s3.Bucket; + /** The output vm import bucket*/ + public readonly outputVMImportBucket: VMImportBucket; + /** 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 artifactBucketName = props.artifactBucketName + ? props.artifactBucketName + : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-artifact`.toLowerCase(); + const sourceBucketName = props.sourceBucketName + ? props.sourceBucketName + : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-source`.toLowerCase(); + const outputBucketName = props.outputBucketName + ? props.outputBucketName + : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-output`.toLowerCase(); + const outputVMImportBucketName = props.outputVMImportBucketName + ? props.outputVMImportBucketName + : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-output-vm`.toLowerCase(); + const accessLoggingBucketName = props.sourceBucketName + ? props.sourceBucketName + : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-access-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.accessLoggingBucket = new s3.Bucket(this, "PipelineResourcesAccessLoggingBucket", { + bucketName: accessLoggingBucketName, + versioned: true, + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + encryptionKey: this.encryptionKey, + }); + + this.sourceBucket = new s3.Bucket(this, "PipelineResourcesSourceBucket", { + bucketName: sourceBucketName, + versioned: true, + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + encryptionKey: this.encryptionKey, + serverAccessLogsBucket: this.accessLoggingBucket, + serverAccessLogsPrefix: "source-bucket", + }); + + this.artifactBucket = new s3.Bucket(this, "PipelineResourcesArtifactBucket", { + bucketName: artifactBucketName, + versioned: true, + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + encryptionKey: this.encryptionKey, + serverAccessLogsBucket: this.accessLoggingBucket, + serverAccessLogsPrefix: "artifact-bucket", + }); + + this.outputBucket = new s3.Bucket(this, "PipelineResourcesOutputBucket", { + bucketName: outputBucketName, + versioned: true, + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + encryptionKey: this.encryptionKey, + serverAccessLogsBucket: this.accessLoggingBucket, + serverAccessLogsPrefix: "output-bucket", + }); + + this.outputVMImportBucket = new VMImportBucket(this, "PipelineResourcesOutputVMImportBucket", { + bucketName: outputVMImportBucketName, + versioned: true, + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + encryptionKey: this.encryptionKey, + serverAccessLogsBucket: this.accessLoggingBucket, + serverAccessLogsPrefix: "output-vm-import-bucket", + }); + + new cdk.CfnOutput(this, "OutputPipelineResourcesAccessLoggingBucket", { + exportName: "accessLoggingBucket", + value: this.accessLoggingBucket.bucketName, + description: "The access logging bucket.", + }); + + new cdk.CfnOutput(this, "OutputPipelineResourcesSourceBucket", { + exportName: "sourceBucket", + value: this.sourceBucket.bucketName, + description: "The source bucket.", + }); + + new cdk.CfnOutput(this, "OutputPipelineResourcesArtifactBucket", { + exportName: "artifactBucket", + value: this.artifactBucket.bucketName, + description: "The artifact bucket.", + }); + + new cdk.CfnOutput(this, "OutputPipelineResourcesOutputBucket", { + exportName: "outputBucket", + value: this.outputBucket.bucketName, + description: "The output bucket.", + }); + + new cdk.CfnOutput(this, "OutputPipelineResourcesOutputVMImportBuckett", { + exportName: "outputVMImportBucket", + value: this.outputVMImportBucket.bucketName, + description: "The output VM import bucket.", + }); + } +} diff --git a/lib/index.ts b/lib/index.ts index 55721df..bd23a5f 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,7 +1,47 @@ -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 * from "./deprecated/network"; +export * from "./deprecated/build-image-data"; +export * from "./deprecated/build-image-repo"; +export * from "./deprecated/build-image-pipeline"; +export * from "./deprecated/embedded-linux-pipeline"; +export * from "./deprecated/embedded-linux-codebuild-project"; +export * from "./deprecated/constructs/source-repo"; + +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 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", +} diff --git a/lib/vm-import-bucket.ts b/lib/vm-import-bucket.ts index d20ab34..f62640c 100644 --- a/lib/vm-import-bucket.ts +++ b/lib/vm-import-bucket.ts @@ -1,13 +1,14 @@ -import { Construct } from 'constructs'; -import * as s3 from 'aws-cdk-lib/aws-s3'; -import * as iam from 'aws-cdk-lib/aws-iam'; +import { Construct } from "constructs"; +import * as s3 from "aws-cdk-lib/aws-s3"; +import * as iam from "aws-cdk-lib/aws-iam"; +import * as kms from "aws-cdk-lib/aws-kms"; -const TAG = 'aws4embeddedlinux-ci'; +const TAG = "aws4embeddedlinux-ci"; export interface VMImportBucketProps extends s3.BucketProps { /** The sanitized role name */ readonly sanitizedRoleName?: string; - readonly encryptionKeyArn: string; + readonly encryptionKey: kms.Key; } /** @@ -25,42 +26,42 @@ export class VMImportBucket extends s3.Bucket { const importPolicy = new iam.PolicyDocument({ statements: [ new iam.PolicyStatement({ - actions: ['s3:GetBucketLocation', 's3:GetObject', 's3:ListBucket'], + actions: ["s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket"], resources: [this.bucketArn, `${this.bucketArn}/*`], }), new iam.PolicyStatement({ - actions: ['ec2:CreateTags', 'ec2:DescribeTags'], - resources: ['*'], + actions: ["ec2:CreateTags", "ec2:DescribeTags"], + resources: ["*"], conditions: { StringEquals: { - 'ec2:ResourceTag/CreatedBy': [TAG], + "ec2:ResourceTag/CreatedBy": [TAG], }, }, }), new iam.PolicyStatement({ - actions: ['ec2:CopySnapshot'], + actions: ["ec2:CopySnapshot"], resources: [`arn:aws:ec2:${this.stack.region}::snapshot/*`], }), new iam.PolicyStatement({ - actions: ['ec2:DescribeSnapshots'], - resources: ['*'], + actions: ["ec2:DescribeSnapshots"], + resources: ["*"], }), new iam.PolicyStatement({ actions: [ - 'kms:CreateGrant', - 'kms:Decrypt', - 'kms:DescribeKey', - 'kms:GenerateDataKeyWithoutPlaintext', + "kms:CreateGrant", + "kms:Decrypt", + "kms:DescribeKey", + "kms:GenerateDataKeyWithoutPlaintext", ], - resources: [props.encryptionKeyArn], + resources: [props.encryptionKey.keyArn], }), ], }); - const importRole = new iam.Role(scope, 'VMImportRole', { + const importRole = new iam.Role(scope, "VMImportRole", { roleName: props.sanitizedRoleName, - assumedBy: new iam.ServicePrincipal('vmie.amazonaws.com'), - externalIds: ['vmimport'], + assumedBy: new iam.ServicePrincipal("vmie.amazonaws.com"), + externalIds: ["vmimport"], inlinePolicies: { importPolicy }, }); diff --git a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap new file mode 100644 index 0000000..8290304 --- /dev/null +++ b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap @@ -0,0 +1,1144 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +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", + }, + }, + }, + "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": { + "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", + "Properties": { + "DestinationBucketKeyPrefix": "source/base-image", + "DestinationBucketName": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + }, + "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", + }, + "CodePipelineBuildBaseImageBucketDeploymentRoleDFF88C19": { + "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": "sourceBucketDeploymentPolicy", + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "CodePipelineBuildBaseImageBucketDeploymentRoleDefaultPolicy969D32AA": { + "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": "CodePipelineBuildBaseImageBucketDeploymentRoleDefaultPolicy969D32AA", + "Roles": [ + { + "Ref": "CodePipelineBuildBaseImageBucketDeploymentRoleDFF88C19", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "CodePipelineBuildBaseImageBuildLogs48BFE4D7": { + "DeletionPolicy": "Delete", + "Properties": { + "LogGroupName": "MyTestStack-CodePipelineBuildBaseImageBuildLogs", + "RetentionInDays": 365, + }, + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + }, + "CodePipelineBuildBaseImageCodePipeline7907AE86": { + "DependsOn": [ + "CodePipelineBuildBaseImageCodePipelineRoleDefaultPolicy677B7353", + "CodePipelineBuildBaseImageCodePipelineRole73E36B25", + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], + "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": [ + "CodePipelineBuildBaseImageCodePipelineRole73E36B25", + "Arn", + ], + }, + "Stages": [ + { + "Actions": [ + { + "ActionTypeId": { + "Category": "Source", + "Owner": "AWS", + "Provider": "S3", + "Version": "1", + }, + "Configuration": { + "PollForSourceChanges": false, + "S3Bucket": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + }, + "S3ObjectKey": "source/base-image/source-base-image.zip", + }, + "Name": "Source", + "OutputArtifacts": [ + { + "Name": "Source", + }, + ], + "RoleArn": { + "Fn::GetAtt": [ + "CodePipelineBuildBaseImageCodePipelineSourceCodePipelineActionRole0F967AB4", + "Arn", + ], + }, + "RunOrder": 1, + }, + ], + "Name": "Source", + }, + { + "Actions": [ + { + "ActionTypeId": { + "Category": "Build", + "Owner": "AWS", + "Provider": "CodeBuild", + "Version": "1", + }, + "Configuration": { + "ProjectName": { + "Ref": "CodePipelineBuildBaseImageProject69590E59", + }, + }, + "InputArtifacts": [ + { + "Name": "Source", + }, + ], + "Name": "Build", + "RoleArn": { + "Fn::GetAtt": [ + "CodePipelineBuildBaseImageCodePipelineBuildCodePipelineActionRoleA6CA6F27", + "Arn", + ], + }, + "RunOrder": 1, + }, + ], + "Name": "Build", + }, + ], + }, + "Type": "AWS::CodePipeline::Pipeline", + }, + "CodePipelineBuildBaseImageCodePipelineBuildCodePipelineActionRoleA6CA6F27": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], + "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", + }, + "CodePipelineBuildBaseImageCodePipelineBuildCodePipelineActionRoleDefaultPolicyDDAF06D1": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "codebuild:BatchGetBuilds", + "codebuild:StartBuild", + "codebuild:StopBuild", + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "CodePipelineBuildBaseImageProject69590E59", + "Arn", + ], + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "CodePipelineBuildBaseImageCodePipelineBuildCodePipelineActionRoleDefaultPolicyDDAF06D1", + "Roles": [ + { + "Ref": "CodePipelineBuildBaseImageCodePipelineBuildCodePipelineActionRoleA6CA6F27", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "CodePipelineBuildBaseImageCodePipelineEventsRoleD9A83D03": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "events.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::IAM::Role", + }, + "CodePipelineBuildBaseImageCodePipelineEventsRoleDefaultPolicyFCB5C7C5": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": "codepipeline:StartPipelineExecution", + "Effect": "Allow", + "Resource": { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":codepipeline:eu-central-1:111111111111:", + { + "Ref": "CodePipelineBuildBaseImageCodePipeline7907AE86", + }, + ], + ], + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "CodePipelineBuildBaseImageCodePipelineEventsRoleDefaultPolicyFCB5C7C5", + "Roles": [ + { + "Ref": "CodePipelineBuildBaseImageCodePipelineEventsRoleD9A83D03", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "CodePipelineBuildBaseImageCodePipelineMyTestStackCodePipelineBuildBaseImageCodePipelineFF25ACC6SourceEventRulesourcebaseimagesourcebaseimagezip4051FAE5": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], + "Properties": { + "EventPattern": { + "detail": { + "eventName": [ + "CompleteMultipartUpload", + "CopyObject", + "PutObject", + ], + "requestParameters": { + "bucketName": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + }, + ], + "key": [ + "source/base-image/source-base-image.zip", + ], + }, + "resources": { + "ARN": [ + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + }, + "/source/base-image/source-base-image.zip", + ], + ], + }, + ], + }, + }, + "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": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codepipeline.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::IAM::Role", + }, + "CodePipelineBuildBaseImageCodePipelineRoleDefaultPolicy677B7353": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], + "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": [ + "CodePipelineBuildBaseImageCodePipelineSourceCodePipelineActionRole0F967AB4", + "Arn", + ], + }, + }, + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "CodePipelineBuildBaseImageCodePipelineBuildCodePipelineActionRoleA6CA6F27", + "Arn", + ], + }, + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "CodePipelineBuildBaseImageCodePipelineRoleDefaultPolicy677B7353", + "Roles": [ + { + "Ref": "CodePipelineBuildBaseImageCodePipelineRole73E36B25", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "CodePipelineBuildBaseImageCodePipelineSourceCodePipelineActionRole0F967AB4": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], + "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", + }, + "CodePipelineBuildBaseImageCodePipelineSourceCodePipelineActionRoleDefaultPolicyC48B6A73": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + }, + "/source/base-image/source-base-image.zip", + ], + ], + }, + ], + }, + { + "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": "CodePipelineBuildBaseImageCodePipelineSourceCodePipelineActionRoleDefaultPolicyC48B6A73", + "Roles": [ + { + "Ref": "CodePipelineBuildBaseImageCodePipelineSourceCodePipelineActionRole0F967AB4", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "CodePipelineBuildBaseImageProject69590E59": { + "DependsOn": [ + "CodePipelineBuildBaseImageBucketDeploymentAwsCliLayerF8B77510", + "CodePipelineBuildBaseImageBucketDeploymentCustomResource9FCDB7FE", + ], + "Properties": { + "Artifacts": { + "Type": "CODEPIPELINE", + }, + "Cache": { + "Type": "NO_CACHE", + }, + "EncryptionKey": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + "Environment": { + "ComputeType": "BUILD_GENERAL1_LARGE", + "EnvironmentVariables": [ + { + "Name": "ECR_REPOSITORY_URI", + "Type": "PLAINTEXT", + "Value": { + "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", + }, + ], + ], + }, + }, + { + "Name": "AWS_ACCOUNT_ID", + "Type": "PLAINTEXT", + "Value": "111111111111", + }, + { + "Name": "AWS_DEFAULT_REGION", + "Type": "PLAINTEXT", + "Value": "eu-central-1", + }, + { + "Name": "IMAGE_TAG", + "Type": "PLAINTEXT", + "Value": "MyTestStack", + }, + ], + "Image": "aws/codebuild/standard:7.0", + "ImagePullCredentialsType": "CODEBUILD", + "PrivilegedMode": true, + "Type": "LINUX_CONTAINER", + }, + "LogsConfig": { + "CloudWatchLogs": { + "GroupName": { + "Ref": "CodePipelineBuildBaseImageBuildLogs48BFE4D7", + }, + "Status": "ENABLED", + }, + }, + "Name": "MyTestStack", + "ServiceRole": { + "Fn::GetAtt": [ + "CodePipelineBuildBaseImageProjectRole12B97AA7", + "Arn", + ], + }, + "Source": { + "BuildSpec": "buildspec.yml", + "Type": "CODEPIPELINE", + }, + }, + "Type": "AWS::CodeBuild::Project", + }, + "CodePipelineBuildBaseImageProjectRole12B97AA7": { + "DependsOn": [ + "CodePipelineBuildBaseImageBucketDeploymentAwsCliLayerF8B77510", + "CodePipelineBuildBaseImageBucketDeploymentCustomResource9FCDB7FE", + ], + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codebuild.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::IAM::Role", + }, + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC": { + "DependsOn": [ + "CodePipelineBuildBaseImageBucketDeploymentAwsCliLayerF8B77510", + "CodePipelineBuildBaseImageBucketDeploymentCustomResource9FCDB7FE", + ], + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents", + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "CodePipelineBuildBaseImageBuildLogs48BFE4D7", + "Arn", + ], + }, + }, + { + "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": "CodePipelineBuildBaseImageProject69590E59", + }, + ], + ], + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":logs:eu-central-1:111111111111:log-group:/aws/codebuild/", + { + "Ref": "CodePipelineBuildBaseImageProject69590E59", + }, + ":*", + ], + ], + }, + ], + }, + { + "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": "CodePipelineBuildBaseImageProject69590E59", + }, + "-*", + ], + ], + }, + }, + { + "Action": [ + "kms:Decrypt", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, + { + "Action": [ + "ecr:BatchCheckLayerAvailability", + "ecr:GetDownloadUrlForLayer", + "ecr:BatchGetImage", + "ecr:CompleteLayerUpload", + "ecr:UploadLayerPart", + "ecr:InitiateLayerUpload", + "ecr:PutImage", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + }, + }, + { + "Action": "ecr:GetAuthorizationToken", + "Effect": "Allow", + "Resource": "*", + }, + { + "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": "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "Roles": [ + { + "Ref": "CodePipelineBuildBaseImageProjectRole12B97AA7", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "CodePipelineBuildBaseImageWeeklyRefreshSchedule8D68D946": { + "Properties": { + "ScheduleExpression": "cron(0 6 ? * Monday *)", + "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", + }, + "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": { + "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-embedded-linux.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap new file mode 100644 index 0000000..31b19dc --- /dev/null +++ b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap @@ -0,0 +1,1905 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` +{ + "Outputs": { + "BuildOutput": { + "Description": "The output bucket of this pipeline.", + "Value": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesOutputBucketA2144F25070A0F1C", + }, + }, + }, + "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": "source/poky/source-poky.zip", + }, + "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:ExportsOutputRefPipelineResourcesOutputBucketA2144F25070A0F1C", + }, + "Extract": "true", + "ObjectKey": "pipeline-poky", + }, + "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:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + }, + "/*", + ], + ], + }, + ], + }, + { + "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": "source/poky", + "DestinationBucketName": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + }, + "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", + }, + "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/EmbeddedLinuxCodePipeline-CustomCDKBucketDeployment-poky*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "sourceBucketDeploymentPolicy", + }, + ], + }, + "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", + }, + "EmbeddedLinuxCodePipelineMyTestStackEmbeddedLinuxCodePipelineE5C7D172SourceEventRulesourcepokysourcepokyzip2B36EB88": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "EventPattern": { + "detail": { + "eventName": [ + "CompleteMultipartUpload", + "CopyObject", + "PutObject", + ], + "requestParameters": { + "bucketName": [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + }, + ], + "key": [ + "source/poky/source-poky.zip", + ], + }, + "resources": { + "ARN": [ + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + }, + "/source/poky/source-poky.zip", + ], + ], + }, + ], + }, + }, + "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_2XLARGE", + "EnvironmentVariables": [ + { + "Name": "AWS_ACCOUNT_ID", + "Type": "PLAINTEXT", + "Value": "111111111111", + }, + { + "Name": "AWS_DEFAULT_REGION", + "Type": "PLAINTEXT", + "Value": "eu-central-1", + }, + ], + "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: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", + }, + }, + ], + "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", + }, + "/source/poky/source-poky.zip", + ], + ], + }, + ], + }, + { + "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", + }, + "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..3368b35 --- /dev/null +++ b/test/__snapshots__/codepipeline-resources.test.ts.snap @@ -0,0 +1,1642 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`PipelineResourcesStack Snapshot 1`] = ` +{ + "Outputs": { + "OutputPipelineResourcesAccessLoggingBucket": { + "Description": "The access loggin bucket.", + "Export": { + "Name": "accessLoggingBucket", + }, + "Value": { + "Ref": "PipelineResourcesAccessLoggingBucket66A74BE5", + }, + }, + "OutputPipelineResourcesArtifactBucket": { + "Description": "The artifact bucket.", + "Export": { + "Name": "artifactBucket", + }, + "Value": { + "Ref": "PipelineResourcesArtifactBucketFF61EB98", + }, + }, + "OutputPipelineResourcesOutputBucket": { + "Description": "The output bucket.", + "Export": { + "Name": "outputBucket", + }, + "Value": { + "Ref": "PipelineResourcesOutputBucketA2144F25", + }, + }, + "OutputPipelineResourcesOutputVMImportBuckett": { + "Description": "The output VM import bucket.", + "Export": { + "Name": "outputVMImportBucket", + }, + "Value": { + "Ref": "PipelineResourcesOutputVMImportBucket410130C7", + }, + }, + "OutputPipelineResourcesSourceBucket": { + "Description": "The source loggin bucket.", + "Export": { + "Name": "sourceBucket", + }, + "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": "PipelineResourcesAccessLoggingBucket66A74BE5", + }, + " 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", + }, + "PipelineResourcesAccessLoggingBucket66A74BE5": { + "DeletionPolicy": "Delete", + "Properties": { + "AccessControl": "LogDeliveryWrite", + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "KMSMasterKeyID": { + "Fn::GetAtt": [ + "PipelineResourcesArtifactKey368D3018", + "Arn", + ], + }, + "SSEAlgorithm": "aws:kms", + }, + }, + ], + }, + "BucketName": "test-111111111111-eu-central-1-access-logs", + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter", + }, + ], + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true", + }, + ], + "VersioningConfiguration": { + "Status": "Enabled", + }, + }, + "Type": "AWS::S3::Bucket", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesAccessLoggingBucketAutoDeleteObjectsCustomResource32A88A27": { + "DeletionPolicy": "Delete", + "DependsOn": [ + "PipelineResourcesAccessLoggingBucketPolicyF9B77CD5", + ], + "Properties": { + "BucketName": { + "Ref": "PipelineResourcesAccessLoggingBucket66A74BE5", + }, + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn", + ], + }, + }, + "Type": "Custom::S3AutoDeleteObjects", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesAccessLoggingBucketPolicyF9B77CD5": { + "Properties": { + "Bucket": { + "Ref": "PipelineResourcesAccessLoggingBucket66A74BE5", + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false", + }, + }, + "Effect": "Deny", + "Principal": { + "AWS": "*", + }, + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineResourcesAccessLoggingBucket66A74BE5", + "Arn", + ], + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineResourcesAccessLoggingBucket66A74BE5", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn", + ], + }, + }, + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineResourcesAccessLoggingBucket66A74BE5", + "Arn", + ], + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineResourcesAccessLoggingBucket66A74BE5", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + ], + "Version": "2012-10-17", + }, + }, + "Type": "AWS::S3::BucketPolicy", + }, + "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": "PipelineResourcesAccessLoggingBucket66A74BE5", + }, + "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", + }, + "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": "PipelineResourcesAccessLoggingBucket66A74BE5", + }, + "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", + }, + "PipelineResourcesOutputVMImportBucket410130C7": { + "DeletionPolicy": "Delete", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "KMSMasterKeyID": { + "Fn::GetAtt": [ + "PipelineResourcesArtifactKey368D3018", + "Arn", + ], + }, + "SSEAlgorithm": "aws:kms", + }, + }, + ], + }, + "BucketName": "test-111111111111-eu-central-1-output-vm", + "LoggingConfiguration": { + "DestinationBucketName": { + "Ref": "PipelineResourcesAccessLoggingBucket66A74BE5", + }, + "LogFilePrefix": "output-vm-import-bucket", + }, + "Tags": [ + { + "Key": "aws-cdk:auto-delete-objects", + "Value": "true", + }, + ], + "VersioningConfiguration": { + "Status": "Enabled", + }, + }, + "Type": "AWS::S3::Bucket", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesOutputVMImportBucketAutoDeleteObjectsCustomResource630CC98A": { + "DeletionPolicy": "Delete", + "DependsOn": [ + "PipelineResourcesOutputVMImportBucketPolicy8034D299", + ], + "Properties": { + "BucketName": { + "Ref": "PipelineResourcesOutputVMImportBucket410130C7", + }, + "ServiceToken": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", + "Arn", + ], + }, + }, + "Type": "Custom::S3AutoDeleteObjects", + "UpdateReplacePolicy": "Delete", + }, + "PipelineResourcesOutputVMImportBucketPolicy8034D299": { + "Properties": { + "Bucket": { + "Ref": "PipelineResourcesOutputVMImportBucket410130C7", + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Condition": { + "Bool": { + "aws:SecureTransport": "false", + }, + }, + "Effect": "Deny", + "Principal": { + "AWS": "*", + }, + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineResourcesOutputVMImportBucket410130C7", + "Arn", + ], + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineResourcesOutputVMImportBucket410130C7", + "Arn", + ], + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "s3:PutBucketPolicy", + "s3:GetBucket*", + "s3:List*", + "s3:DeleteObject*", + ], + "Effect": "Allow", + "Principal": { + "AWS": { + "Fn::GetAtt": [ + "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", + "Arn", + ], + }, + }, + "Resource": [ + { + "Fn::GetAtt": [ + "PipelineResourcesOutputVMImportBucket410130C7", + "Arn", + ], + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineResourcesOutputVMImportBucket410130C7", + "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": "PipelineResourcesAccessLoggingBucket66A74BE5", + }, + "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", + }, + "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": [ + "PipelineResourcesOutputVMImportBucket410130C7", + "Arn", + ], + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::GetAtt": [ + "PipelineResourcesOutputVMImportBucket410130C7", + "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": [ + "PipelineResourcesArtifactKey368D3018", + "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.", + }, + ], + }, + }, +} +`; 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..f533839 --- /dev/null +++ b/test/codepipeline-embedded-linux-base-image-nag.test.ts @@ -0,0 +1,137 @@ +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 { 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 sourceBucket = new s3.Bucket(baseStack, "SourceBucket", { + versioned: true, + }); + const artifactBucket = new s3.Bucket(baseStack, "ArtifactBucket", {}); + const ecrRepository = new ecr.Repository(baseStack, "EcrRepository", {}); + + const props = { + env: DEFAULT_ENV, + sourceBucket: sourceBucket, + ecrRepository: ecrRepository, + artifactBucket: artifactBucket, + 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..0d896fd --- /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, + sourceBucket: pipelineResourcesStack.sourceBucket, + ecrRepository: pipelineResourcesStack.ecrRepository, + artifactBucket: pipelineResourcesStack.artifactBucket, + 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..392f780 --- /dev/null +++ b/test/codepipeline-embedded-linux-nag.test.ts @@ -0,0 +1,204 @@ +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 { ProjectKind } from "../lib"; +import { DEFAULT_ENV } from "./util"; +import { VMImportBucket } from "../lib/vm-import-bucket"; + +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.", + }, + ], + ); +} + +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 sourceBucket = new s3.Bucket(baseStack, "SourceBucket", { + versioned: true, + }); + const artifactBucket = new s3.Bucket(baseStack, "ArtifactBucket", {}); + // const outputBucket = new s3.Bucket(baseStack, 'OutputtBucket', {}); + const outputBucketVMImportBucket = new VMImportBucket( + baseStack, + "OutputtBucketVMImportBucket", + { + encryptionKey: encryptionKey, + }, + ); + const ecrRepository = new ecr.Repository(baseStack, "EcrRepository", {}); + const vpc = new ec2.Vpc(baseStack, "Vpc", {}); + + stack = new EmbeddedLinuxCodePipelineStack(app, "MyTestStack", { + env: DEFAULT_ENV, + sourceBucket: sourceBucket, + ecrRepository: ecrRepository, + ecrRepositoryImageTag: "ubuntu_22_04", + artifactBucket: artifactBucket, + outputBucket: outputBucketVMImportBucket, + projectKind: ProjectKind.PokyAmi, + vpc: vpc, + artifactOutputObjectKey: `${ProjectKind.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..6020d72 --- /dev/null +++ b/test/codepipeline-embedded-linux.test.ts @@ -0,0 +1,99 @@ +import * as cdk from "aws-cdk-lib"; +import * as assertions from "aws-cdk-lib/assertions"; +import { + PipelineResourcesProps, + PipelineResourcesStack, + ProjectKind, +} 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, + sourceBucket: pipelineResourcesStack.sourceBucket, + ecrRepository: pipelineResourcesStack.ecrRepository, + artifactBucket: pipelineResourcesStack.artifactBucket, + encryptionKey: pipelineResourcesStack.encryptionKey, + }; + embeddedLinuxCodePipelineBaseImageStack = + new EmbeddedLinuxCodePipelineBaseImageStack( + app, + "MyBaseImageStack", + embeddedLinuxCodePipelineBaseImageProps, + ); + + const embeddedLinuxCodePipelineProps: EmbeddedLinuxCodePipelineProps = { + env: DEFAULT_ENV, + ecrRepository: embeddedLinuxCodePipelineBaseImageStack.ecrRepository, + ecrRepositoryImageTag: + embeddedLinuxCodePipelineBaseImageStack.ecrRepositoryImageTag, + sourceBucket: pipelineResourcesStack.sourceBucket, + artifactBucket: pipelineResourcesStack.artifactBucket, + outputBucket: pipelineResourcesStack.outputBucket, + projectKind: ProjectKind.Poky, + vpc: pipelineResourcesStack.vpc, + artifactOutputObjectKey: "pipeline-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..ada2edd --- /dev/null +++ b/test/codepipeline-resources-nag.test.ts @@ -0,0 +1,71 @@ +import * as cdk from "aws-cdk-lib"; + +import { Annotations, Match } from "aws-cdk-lib/assertions"; +import { AwsSolutionsChecks, NagSuppressions } from "cdk-nag"; +import { DEFAULT_ENV } from "./util"; +import { PipelineResourcesStack } from "../lib"; + +function addNagSuppressions(stack: cdk.Stack) { + NagSuppressions.addResourceSuppressionsByPath( + stack, + `/${stack.stackName}/VMImportRole/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: "Read permissions needed on bucket.", + appliesTo: [ + { + regex: + "/Resource::/\\*$/g", + }, + { + regex: `/Resource::arn:aws:ec2:${DEFAULT_ENV.region}::snapshot/\\*$/g`, + }, + { regex: "/Resource::\\*$/g" }, + ], + }, + ], + ); +} + +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); + + 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-resources.test.ts b/test/codepipeline-resources.test.ts new file mode 100644 index 0000000..8ad6c37 --- /dev/null +++ b/test/codepipeline-resources.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 { 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`, + `output-vm`, + `access-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/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", +}; From bbdbb5ac2003e4bb67c36768a3747e3fe975504e Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 16:57:35 +0100 Subject: [PATCH 013/112] updated readme --- README-deprecated.md | 50 +++++++++++ README.md | 208 +++++++++++++++++++++++++++---------------- 2 files changed, 182 insertions(+), 76 deletions(-) create mode 100644 README-deprecated.md diff --git a/README-deprecated.md b/README-deprecated.md new file mode 100644 index 0000000..07adac3 --- /dev/null +++ b/README-deprecated.md @@ -0,0 +1,50 @@ +# aws4embeddedlinux-ci - Deprecated API + +This [AWS CDK](https://github.com/aws/aws-cdk) library helps you deploy an AWS cloud infrastructure supporting the embedded Linux builds for your project using pipelines. + +This README is documenting the deprecated set of APIs. + +## Architecture + +Here is the overall architecture : + +![architecture overview](images/architecture-v0.1.x.svg "Architecture") + +As you can notice, the architecture is using AWS CodeCommit (compared to S3 in the non deprecated version) which is no longer available in newly created AWS accounts. + +## API documentation + +The [API documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci/) generated by `npm run doc` includes both APIs. + +## Setup + +The instructions remains the same as in the [README](./README.md#setup) except for the packages / classes imports: + +```ts +import { + EmbeddedLinuxPipelineStack, + EmbeddedLinuxCodebuildProjectStack, + BuildImageDataStack, + BuildImagePipelineStack, + BuildImageRepoStack, + PipelineNetworkStack, + ImageKind, + ProjectKind, +} from "/aws4embeddedlinux-ci/lib"; +``` + +## Known issues + +Please refer to the [README](./README.md#known-issues) + +## Security + +Please refer to the [README](./README.md#security) + +## Contributing + +Please refer to the [README](./README.md#contributing) + +## License + +Please refer to the [README](./README.md#license) \ No newline at end of file diff --git a/README.md b/README.md index 57bed19..de924cc 100644 --- a/README.md +++ b/README.md @@ -1,117 +1,173 @@ # 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. +This [AWS CDK](https://github.com/aws/aws-cdk) library helps you deploy an AWS cloud infrastructure supporting the embedded Linux builds for your project using pipelines. ## Architecture -![architecture overview](images/architecture.svg "Architecture") + +![architecture overview](images/architecture-v0.2.x.svg "Architecture") ## 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. +[API documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci/) generated by `npm run doc`. + +## Setup + +In order to use this library, you must set up the [AWS 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 [NodeJS](https://nodejs.org/en/) installed. > [!NOTE] -> This library is tested against Node Versions 16, 18, and 20. If these versions are 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 18, 20, and 22. If these versions are 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 use the [sample code](https://github.com/aws4embeddedlinux/aws4embeddedlinux-ci-examples) provided in our examples repo to get started with deploy the stacks. + +### Setting Up A New Project + +In order to create a new project, you will need to initialize a new CDK project. + +More details can be found in the [CDK Getting Started Documentation](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html). + +The following commands will create a new CDK project named `my-project`: + +```bash +mkdir my-project +cd my-project +cdk init app --language typescript +``` + +Then you will need to install the `aws4embeddedlinux-ci` cdk library: + +```bash +npm install aws4embeddedlinux/aws4embeddedlinux-ci +``` + +Once added, you can start creatin your application using the library. -## Setting Up A New Project +Refer to the [API Documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci) and the [sample](github.com/aws4embeddedlinux/aws4embeddedlinux-ci-examples) for more details. -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. +Once you have completed the code of your application, you can deploy the CDK stack using: -## Viewing Changes +```bash +cdk deploy +``` -The `cdk diff` command can be used to preview changes before deployment. This will allow the user to review what is being created. +After the CDK application is successfully deployed, the 'Base Image' pipeline needs to complete successfully. + +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. +> + +Once the 'Base Image' pipeline complete successfully, the rest of your application pipelines can be executed. + +> [!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. ## 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. ### In this library repo: ```bash npm install +npm run build +npm link ``` -### In your-project folder: +### In your project folder: ```bash npm install npm link ../aws4embeddedlinux-ci ``` -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). +This will link through the system `node_modules` install. -## 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. +Then you can import the packages / classes using: -## Security - -See [SECURITY](SECURITY.md) for more information about reporting issues with this project. - -### 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. - -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 -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-??????", - }), - ], -}); - ``` - -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. - -```yaml -env: - secrets-manager: - SECRET_VALUE: "" +```ts +import { + EmbeddedLinuxPipelineStack, + EmbeddedLinuxCodebuildProjectStack, + BuildImageSourceStack, + BuildImagePipelineStack, + BuildImageRepoStack, + PipelineNetworkStack, +} from "/aws4embeddedlinux-ci/lib"; ``` +> _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 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-??????", + }), + ], + }); + ``` +- 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). + +## 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. + +## Security + +See [SECURITY](SECURITY.md) for more information about reporting issues with this project. ## Contributing From 681a9553ee75b5d3599491f8a5560140c9fd125e Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 17:22:43 +0100 Subject: [PATCH 014/112] updated tests snapshot --- .../codepipeline-embedded-linux.test.ts.snap | 15 +++++++++++++++ .../codepipeline-resources.test.ts.snap | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap index 31b19dc..246ad3b 100644 --- a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap @@ -9,6 +9,21 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesOutputBucketA2144F25070A0F1C", }, }, + "BuildSource": { + "Description": "The source bucket key of this pipeline.", + "Value": { + "Fn::Join": [ + "", + [ + "s3://", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + }, + "/source/poky/source-poky.zip", + ], + ], + }, + }, }, "Parameters": { "BootstrapVersion": { diff --git a/test/__snapshots__/codepipeline-resources.test.ts.snap b/test/__snapshots__/codepipeline-resources.test.ts.snap index 3368b35..be77083 100644 --- a/test/__snapshots__/codepipeline-resources.test.ts.snap +++ b/test/__snapshots__/codepipeline-resources.test.ts.snap @@ -4,7 +4,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` { "Outputs": { "OutputPipelineResourcesAccessLoggingBucket": { - "Description": "The access loggin bucket.", + "Description": "The access logging bucket.", "Export": { "Name": "accessLoggingBucket", }, @@ -40,7 +40,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, }, "OutputPipelineResourcesSourceBucket": { - "Description": "The source loggin bucket.", + "Description": "The source bucket.", "Export": { "Name": "sourceBucket", }, From 9931fce4b8c163cba254b5e77532f77df6e8bd3b Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 22 Jan 2025 17:23:09 +0100 Subject: [PATCH 015/112] eslint reformatting --- lib/codepipeline-resources.ts | 68 ++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/lib/codepipeline-resources.ts b/lib/codepipeline-resources.ts index 9069e7e..73e9393 100644 --- a/lib/codepipeline-resources.ts +++ b/lib/codepipeline-resources.ts @@ -104,14 +104,18 @@ export class PipelineResourcesStack extends cdk.Stack { }); // Create a bucket, then allow a deployment Lambda to upload to it. - this.accessLoggingBucket = new s3.Bucket(this, "PipelineResourcesAccessLoggingBucket", { - bucketName: accessLoggingBucketName, - versioned: true, - enforceSSL: true, - autoDeleteObjects: true, - removalPolicy: cdk.RemovalPolicy.DESTROY, - encryptionKey: this.encryptionKey, - }); + this.accessLoggingBucket = new s3.Bucket( + this, + "PipelineResourcesAccessLoggingBucket", + { + bucketName: accessLoggingBucketName, + versioned: true, + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + encryptionKey: this.encryptionKey, + }, + ); this.sourceBucket = new s3.Bucket(this, "PipelineResourcesSourceBucket", { bucketName: sourceBucketName, @@ -124,16 +128,20 @@ export class PipelineResourcesStack extends cdk.Stack { serverAccessLogsPrefix: "source-bucket", }); - this.artifactBucket = new s3.Bucket(this, "PipelineResourcesArtifactBucket", { - bucketName: artifactBucketName, - versioned: true, - enforceSSL: true, - autoDeleteObjects: true, - removalPolicy: cdk.RemovalPolicy.DESTROY, - encryptionKey: this.encryptionKey, - serverAccessLogsBucket: this.accessLoggingBucket, - serverAccessLogsPrefix: "artifact-bucket", - }); + this.artifactBucket = new s3.Bucket( + this, + "PipelineResourcesArtifactBucket", + { + bucketName: artifactBucketName, + versioned: true, + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + encryptionKey: this.encryptionKey, + serverAccessLogsBucket: this.accessLoggingBucket, + serverAccessLogsPrefix: "artifact-bucket", + }, + ); this.outputBucket = new s3.Bucket(this, "PipelineResourcesOutputBucket", { bucketName: outputBucketName, @@ -146,16 +154,20 @@ export class PipelineResourcesStack extends cdk.Stack { serverAccessLogsPrefix: "output-bucket", }); - this.outputVMImportBucket = new VMImportBucket(this, "PipelineResourcesOutputVMImportBucket", { - bucketName: outputVMImportBucketName, - versioned: true, - enforceSSL: true, - autoDeleteObjects: true, - removalPolicy: cdk.RemovalPolicy.DESTROY, - encryptionKey: this.encryptionKey, - serverAccessLogsBucket: this.accessLoggingBucket, - serverAccessLogsPrefix: "output-vm-import-bucket", - }); + this.outputVMImportBucket = new VMImportBucket( + this, + "PipelineResourcesOutputVMImportBucket", + { + bucketName: outputVMImportBucketName, + versioned: true, + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + encryptionKey: this.encryptionKey, + serverAccessLogsBucket: this.accessLoggingBucket, + serverAccessLogsPrefix: "output-vm-import-bucket", + }, + ); new cdk.CfnOutput(this, "OutputPipelineResourcesAccessLoggingBucket", { exportName: "accessLoggingBucket", From b28b0d3495419405c22076578b1d82bd6f2f261a Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 24 Jan 2025 16:55:29 +0100 Subject: [PATCH 016/112] forcing dependency to prevent iam role issue on first run of pipeline --- lib/deprecated/embedded-linux-pipeline.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/deprecated/embedded-linux-pipeline.ts b/lib/deprecated/embedded-linux-pipeline.ts index b6442fe..b7210aa 100644 --- a/lib/deprecated/embedded-linux-pipeline.ts +++ b/lib/deprecated/embedded-linux-pipeline.ts @@ -384,6 +384,7 @@ def handler(event, context): }, ], }); + pipeline.node.addDependency(project); const stopPipelinePolicy = new iam.PolicyStatement({ actions: ["codepipeline:StopPipelineExecution"], From 360ba208261b656556d0b5264e7b432b66193acb Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 24 Jan 2025 16:56:33 +0100 Subject: [PATCH 017/112] managin eof / eol with lf only (as I'm working o windows and this can cause issues if env is not configured properly) --- .editorconfig | 9 +++++++++ .gitattributes | 1 + 2 files changed, 10 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3a6cecc --- /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 \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..94f480d --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf \ No newline at end of file From 4e1281dc480f3778c87b672c89fa2a9d49b019e2 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 24 Jan 2025 18:06:50 +0100 Subject: [PATCH 018/112] updated test due to dependency change --- .../embedded-linux-pipeline.test.ts.snap | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) diff --git a/test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap b/test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap index c1a9042..5c5454f 100644 --- a/test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap +++ b/test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap @@ -1049,6 +1049,10 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` }, "EmbeddedLinuxPipeline1DDFB4FE": { "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9", "EmbeddedLinuxPipelineRole1094A815", ], @@ -1187,6 +1191,12 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` "Type": "AWS::CodePipeline::Pipeline", }, "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -1215,6 +1225,12 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` "Type": "AWS::IAM::Role", }, "EmbeddedLinuxPipelineArtifactCodePipelineActionRoleDefaultPolicyD75CCCBC": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -1323,6 +1339,12 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -1351,6 +1373,12 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` "Type": "AWS::IAM::Role", }, "EmbeddedLinuxPipelineBuildCodePipelineActionRoleDefaultPolicy176F5E4B": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -1381,6 +1409,12 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -1416,6 +1450,12 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineEventsRoleF9DA96F1": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -1433,6 +1473,12 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` "Type": "AWS::IAM::Role", }, "EmbeddedLinuxPipelineRole1094A815": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -1450,6 +1496,12 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` "Type": "AWS::IAM::Role", }, "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -1549,6 +1601,12 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineSourceCodePipelineActionRoleDefaultPolicyE4783D85": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -1635,6 +1693,12 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -3509,6 +3573,10 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` }, "EmbeddedLinuxPipeline1DDFB4FE": { "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9", "EmbeddedLinuxPipelineRole1094A815", ], @@ -3647,6 +3715,12 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` "Type": "AWS::CodePipeline::Pipeline", }, "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -3675,6 +3749,12 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` "Type": "AWS::IAM::Role", }, "EmbeddedLinuxPipelineArtifactCodePipelineActionRoleDefaultPolicyD75CCCBC": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -3783,6 +3863,12 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -3811,6 +3897,12 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` "Type": "AWS::IAM::Role", }, "EmbeddedLinuxPipelineBuildCodePipelineActionRoleDefaultPolicy176F5E4B": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -3841,6 +3933,12 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -3876,6 +3974,12 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineEventsRoleF9DA96F1": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -3893,6 +3997,12 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` "Type": "AWS::IAM::Role", }, "EmbeddedLinuxPipelineRole1094A815": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -3910,6 +4020,12 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` "Type": "AWS::IAM::Role", }, "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -4009,6 +4125,12 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineSourceCodePipelineActionRoleDefaultPolicyE4783D85": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -4095,6 +4217,12 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -5777,6 +5905,10 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` }, "EmbeddedLinuxPipeline1DDFB4FE": { "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9", "EmbeddedLinuxPipelineRole1094A815", ], @@ -5915,6 +6047,12 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` "Type": "AWS::CodePipeline::Pipeline", }, "EmbeddedLinuxPipelineArtifactCodePipelineActionRole02805750": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -5943,6 +6081,12 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` "Type": "AWS::IAM::Role", }, "EmbeddedLinuxPipelineArtifactCodePipelineActionRoleDefaultPolicyD75CCCBC": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -6036,6 +6180,12 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineBuildCodePipelineActionRoleC4160EB4": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -6064,6 +6214,12 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` "Type": "AWS::IAM::Role", }, "EmbeddedLinuxPipelineBuildCodePipelineActionRoleDefaultPolicy176F5E4B": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -6094,6 +6250,12 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -6129,6 +6291,12 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineEventsRoleF9DA96F1": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -6146,6 +6314,12 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` "Type": "AWS::IAM::Role", }, "EmbeddedLinuxPipelineRole1094A815": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ @@ -6163,6 +6337,12 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` "Type": "AWS::IAM::Role", }, "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -6262,6 +6442,12 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineSourceCodePipelineActionRoleDefaultPolicyE4783D85": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "PolicyDocument": { "Statement": [ @@ -6348,6 +6534,12 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` "Type": "AWS::IAM::Policy", }, "EmbeddedLinuxPipelineSourceCodePipelineActionRoleF0FC21D6": { + "DependsOn": [ + "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", + "EmbeddedLinuxBuildProject45760157", + "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", + "EmbeddedLinuxBuildProjectRole4EBABAB2", + ], "Properties": { "AssumeRolePolicyDocument": { "Statement": [ From 58edcccc2cd76ce92bd838fae97446b6f7cdd8fc Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Sat, 25 Jan 2025 08:48:05 +0100 Subject: [PATCH 019/112] moving build assets script out to avoid deployment in dist --- {scripts => utils}/build-assets.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {scripts => utils}/build-assets.sh (100%) diff --git a/scripts/build-assets.sh b/utils/build-assets.sh similarity index 100% rename from scripts/build-assets.sh rename to utils/build-assets.sh From fbc926aeeb5070c971df71e8969bca8202f64f64 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Sat, 25 Jan 2025 08:48:46 +0100 Subject: [PATCH 020/112] updating reference to build assets script --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f9bf936..e637c3e 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "doc": "typedoc --sort source-order --readme README.md", "format": "eslint '**/*.{js,ts,json}' --quiet --fix", "check": "eslint '**/*.{js,ts,json}'", - "build-assets": "./scripts/build-assets.sh", + "build-assets": "./utils/build-assets.sh", "prebuild": "npm run build-assets", "test": "npm run prebuild && jest", "update-snapshot": "npm run prebuild && jest -u", From 297a3a766bd86c8860dec93d79eaa994b90aeeae Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Sat, 25 Jan 2025 09:07:31 +0100 Subject: [PATCH 021/112] adding execute permission --- scripts/create-ec2-ami.sh | 0 utils/build-assets.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 scripts/create-ec2-ami.sh mode change 100644 => 100755 utils/build-assets.sh diff --git a/scripts/create-ec2-ami.sh b/scripts/create-ec2-ami.sh old mode 100644 new mode 100755 diff --git a/utils/build-assets.sh b/utils/build-assets.sh old mode 100644 new mode 100755 From db38393e984c4347a7ba7b7e6bcd77df66fb3cd4 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Sat, 25 Jan 2025 12:06:34 +0100 Subject: [PATCH 022/112] package.json: - updated dependencies/devDependencies/peerDependencies - added license attribute - switching to yarn README.md: - doc adjustement due toyarn switch - confirmed steps for linking Yarn switch for the following reasons: - provides better linking / dependencies management - faster than npm (somehow) - enable easier linking when developping --- README.md | 51 +- package-lock.json | 6125 --------------------------------------------- package.json | 24 +- yarn.lock | 3208 ++++++++++++++++++++++++ 4 files changed, 3257 insertions(+), 6151 deletions(-) delete mode 100644 package-lock.json create mode 100644 yarn.lock diff --git a/README.md b/README.md index de924cc..06ad417 100644 --- a/README.md +++ b/README.md @@ -40,14 +40,27 @@ cd my-project cdk init app --language typescript ``` -Then you will need to install the `aws4embeddedlinux-ci` cdk library: +Then you will need to install the CDK library including the `aws4embeddedlinux-ci` library: ```bash -npm install aws4embeddedlinux/aws4embeddedlinux-ci +yarn install +yarn add github:aws4embeddedlinux/aws4embeddedlinux-ci ``` Once added, you can start creatin your application using the library. +For example, you can start by importing classes using: + +```ts +import { + EmbeddedLinuxCodePipelineBaseImageStack, + EmbeddedLinuxCodePipelineStack, + EmbeddedLinuxCodeBuildProjectStack, + PipelineResourcesStack, + ProjectKind, +} from "aws4embeddedlinux-cdk-lib"; +``` + 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: @@ -83,33 +96,43 @@ You can use [`npm link`](https://docs.npmjs.com/cli/v10/commands/npm-link) to de ### In this library repo: ```bash -npm install -npm run build -npm link +yarn install +yarn run build +yarn link ``` ### In your project folder: ```bash -npm install -npm link ../aws4embeddedlinux-ci +yarn install +yarn link "aws4embeddedlinux-cdk-lib" ``` 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. +> + Then you can import the packages / classes using: ```ts import { - EmbeddedLinuxPipelineStack, - EmbeddedLinuxCodebuildProjectStack, - BuildImageSourceStack, - BuildImagePipelineStack, - BuildImageRepoStack, - PipelineNetworkStack, -} from "/aws4embeddedlinux-ci/lib"; + EmbeddedLinuxCodePipelineBaseImageStack, + EmbeddedLinuxCodePipelineStack, + EmbeddedLinuxCodeBuildProjectStack, + PipelineResourcesStack, + ProjectKind, +} from "aws4embeddedlinux-cdk-lib"; ``` +> _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. diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 027e72f..0000000 --- a/package-lock.json +++ /dev/null @@ -1,6125 +0,0 @@ -{ - "name": "aws4embeddedlinux-cdk-lib", - "version": "0.2.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "aws4embeddedlinux-cdk-lib", - "version": "0.2.0", - "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.173.1", - "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.173.1", - "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": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.215", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.215.tgz", - "integrity": "sha512-D+Jzwpl+zlBGjJf7nuRcz6JFNwqDQ+IzwIq0VSC4LMRRvrkhGE/ZE+zab3EnjmVkipcQqtQe+PVKefgmxETbvA==", - "dev": true, - "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, - "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": "38.0.1", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-38.0.1.tgz", - "integrity": "sha512-KvPe+NMWAulfNVwY7jenFhzhuLhLqJ/OPy5jx7wUstbjnYnjRVLpUHPU3yCjXFE0J8cuJVdx95BJ4rOs66Pi9w==", - "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" - } - }, - "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": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "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/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", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "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": { - "semver": "bin/semver.js" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "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": { - "semver": "bin/semver.js" - } - }, - "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": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "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": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "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": { - "node": ">=6.9.0" - } - }, - "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": { - "node": ">=6.9.0" - } - }, - "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": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.3" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.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": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.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==", - "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", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "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": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.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": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "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": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "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": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "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==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": "^9.10.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "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==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.5", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "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==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "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": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "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": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.17.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", - "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "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==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "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==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@gerrit0/mini-shiki": { - "version": "1.24.4", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.24.4.tgz", - "integrity": "sha512-YEHW1QeAg6UmxEmswiQbOVEg1CW22b1XUD/lNTliOsu0LD0wqoyleFMnmbTp697QE0pcadQiR5cVtbbAPncvpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/engine-oniguruma": "^1.24.2", - "@shikijs/types": "^1.24.2", - "@shikijs/vscode-textmate": "^9.3.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": { - "node": ">=18.18.0" - } - }, - "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": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "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": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "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==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "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": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "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": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "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": { - "node": ">=8" - } - }, - "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": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.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": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "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": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.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": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.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": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "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": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.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": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/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": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "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": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "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": { - "@microsoft/tsdoc": "0.15.1", - "ajv": "~8.12.0", - "jju": "~1.4.0", - "resolve": "~1.22.2" - } - }, - "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": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "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": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "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": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "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": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "1.24.2", - "@shikijs/vscode-textmate": "^9.3.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^9.3.0", - "@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==", - "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": { - "type-detect": "4.0.8" - } - }, - "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": { - "@sinonjs/commons": "^3.0.0" - } - }, - "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": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "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": { - "@babel/types": "^7.0.0" - } - }, - "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": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "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": { - "@babel/types": "^7.20.7" - } - }, - "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/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": { - "@types/unist": "*" - } - }, - "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": { - "@types/istanbul-lib-coverage": "*" - } - }, - "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": { - "@types/istanbul-lib-report": "*" - } - }, - "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": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "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==", - "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": { - "@types/yargs-parser": "*" - } - }, - "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.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz", - "integrity": "sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/type-utils": "8.18.1", - "@typescript-eslint/utils": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "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" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz", - "integrity": "sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/typescript-estree": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz", - "integrity": "sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz", - "integrity": "sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.18.1", - "@typescript-eslint/utils": "8.18.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz", - "integrity": "sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz", - "integrity": "sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.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" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/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": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/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, - "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.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz", - "integrity": "sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/typescript-estree": "8.18.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz", - "integrity": "sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.18.1", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "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": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "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": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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" - } - }, - "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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "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/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-lib": { - "version": "2.173.2", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.173.2.tgz", - "integrity": "sha512-cL9+z8Pl3VZGoO7BwdsrFAOeud/vSl3at7OvmhihbNprMN15XuFUx/rViAU5OI1m92NbV4NBzYSLbSeCwYLNyw==", - "bundleDependencies": [ - "@balena/dockerignore", - "case", - "fs-extra", - "ignore", - "jsonschema", - "minimatch", - "punycode", - "semver", - "table", - "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": "^38.0.1", - "@balena/dockerignore": "^1.0.2", - "case": "1.6.3", - "fs-extra": "^11.2.0", - "ignore": "^5.3.2", - "jsonschema": "^1.4.1", - "mime-types": "^2.1.35", - "minimatch": "^3.1.2", - "punycode": "^2.3.1", - "semver": "^7.6.3", - "table": "^6.8.2", - "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" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "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_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": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "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": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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": "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/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": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "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": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 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": { - "node-int64": "^0.4.0" - } - }, - "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": { - "node": ">=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": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001689", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz", - "integrity": "sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.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==", - "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "aws-cdk-lib": "^2.156.0", - "constructs": "^10.0.5" - } - }, - "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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "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": { - "node": ">=10" - } - }, - "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": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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==", - "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": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "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" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "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": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "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": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "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": { - "node": ">=0.10.0" - } - }, - "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": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/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": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.74", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.74.tgz", - "integrity": "sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==", - "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": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "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": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/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": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.17.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", - "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", - "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/eslintrc": "^3.2.0", - "@eslint/js": "9.17.0", - "@eslint/plugin-kit": "^0.2.3", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "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 - } - } - }, - "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": { - "@microsoft/tsdoc": "0.15.1", - "@microsoft/tsdoc-config": "0.17.1" - } - }, - "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": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "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==", - "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/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": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "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": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "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" - } - }, - "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": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "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/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "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": { - "bser": "2.1.1" - } - }, - "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": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "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": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/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": { - "balanced-match": "^1.0.0" - } - }, - "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": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "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": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "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==", - "dev": true, - "license": "ISC" - }, - "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": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": { - "node": ">=6.9.0" - } - }, - "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": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "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": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "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": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "node": ">=8" - } - }, - "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": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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": { - "node": ">=10.17.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/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.16.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", - "integrity": "sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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": { - "node": ">=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": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "node": ">=8" - } - }, - "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==", - "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/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": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "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": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "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": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "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": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "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": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.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": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "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": { - "@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-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": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.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": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "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": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.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": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "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": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.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": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.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": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.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": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.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": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "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": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "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": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "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, - "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": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=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": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/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": { - "yallist": "^3.0.2" - } - }, - "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": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "tmpl": "1.0.5" - } - }, - "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": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "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": { - "node": ">= 8" - } - }, - "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": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.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": { - "node": ">=6" - } - }, - "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/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": { - "node": ">=8" - } - }, - "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": { - "node": ">=0.10.0" - } - }, - "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": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "node": ">=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": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=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": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-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": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "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": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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": { - "node": ">=16 || 14 >=14.17" - } - }, - "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": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "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": { - "node": ">= 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": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "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": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "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": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 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" - } - }, - "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": { - "node": ">=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": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "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": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "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": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.9", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.9.tgz", - "integrity": "sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "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": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/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": { - "node": ">=10" - } - }, - "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": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "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": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "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, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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": { - "node": ">=8" - } - }, - "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/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": { - "node": ">=0.10.0" - } - }, - "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": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "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": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "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": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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": { - "node": ">=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": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "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", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "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": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "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": { - "bs-logger": "^0.2.6", - "ejs": "^3.1.10", - "fast-json-stable-stringify": "^2.1.0", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.6.3", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "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 - } - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/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": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/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": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedoc": { - "version": "0.27.5", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.5.tgz", - "integrity": "sha512-x+fhKJtTg4ozXwKayh/ek4wxZQI/+2hmZUdO2i2NGDBRUflDble70z+ewHod3d4gRpXSO6fnlnjbDTnJk7HlkQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@gerrit0/mini-shiki": "^1.24.0", - "lunr": "^2.3.9", - "markdown-it": "^14.1.0", - "minimatch": "^9.0.5", - "yaml": "^2.6.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 18" - }, - "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" - } - }, - "node_modules/typedoc/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": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typedoc/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, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.18.1.tgz", - "integrity": "sha512-Mlaw6yxuaDEPQvb/2Qwu3/TfgeBHy9iTJ3mTwe7OvpPmF6KPQjVOfGyEJpPv6Ez2C34OODChhXrzYw/9phI0MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.18.1", - "@typescript-eslint/parser": "8.18.1", - "@typescript-eslint/utils": "8.18.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/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": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "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": { - "makeerror": "1.0.12" - } - }, - "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": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/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": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "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, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "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": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/package.json b/package.json index e637c3e..c10ea14 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.2.0", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts", + "license": "MIT", "scripts": { "build": "tsc", "watch": "tsc -w", @@ -12,11 +13,15 @@ "format": "eslint '**/*.{js,ts,json}' --quiet --fix", "check": "eslint '**/*.{js,ts,json}'", "build-assets": "./utils/build-assets.sh", - "prebuild": "npm run build-assets", - "test": "npm run prebuild && jest", - "update-snapshot": "npm run prebuild && jest -u", - "prepare": "npm run build", - "prepare-commit": "npm run clean && npm run format && npm run build && npm run check && npm run test" + "prebuild": "yarn run build-assets", + "test": "yarn run prebuild && jest", + "update-snapshot": "yarn run prebuild && jest -u", + "prepare": "yarn run build", + "prepare-commit": "yarn run clean && yarn run format && yarn run build && yarn run check && yarn run test" + }, + "dependencies": { + "aws-cdk-lib": "2.176.0", + "constructs": "^10.4.2" }, "devDependencies": { "@eslint/compat": "^1.2.4", @@ -26,9 +31,8 @@ "@types/node": "20.14.8", "@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/parser": "^8.18.0", - "aws-cdk-lib": "^2.173.1", - "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", @@ -42,10 +46,6 @@ "typescript": "~5.7.2", "typescript-eslint": "^8.18.0" }, - "peerDependencies": { - "aws-cdk-lib": "^2.173.1", - "constructs": "^10.4.2" - }, "resolutions": { "glob": "^9.3.5" }, diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..bc38821 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3208 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@aws-cdk/asset-awscli-v1@^2.2.208": + version "2.2.220" + resolved "https://registry.yarnpkg.com/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.220.tgz#2ab5a4006ed1e6a98adafc4f3379b59d42eedad9" + integrity sha512-2eXZnnIgwWmXc7eRh8mRKPp6yHTKiQrLziRX/oVSfp4M6Jn2no0QFKJoHWqziF5MDQa5TF8qhD4FGsls/1nYPg== + +"@aws-cdk/asset-kubectl-v20@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.3.tgz#80e09004be173995e91614e34d947da11dd9ff4d" + integrity sha512-cDG1w3ieM6eOT9mTefRuTypk95+oyD7P5X/wRltwmYxU7nZc3+076YEVS6vrjDKr3ADYbfn0lDKpfB1FBtO9CQ== + +"@aws-cdk/asset-node-proxy-agent-v6@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.0.tgz#6d3c7860354d4856a7e75375f2f0ecab313b4989" + integrity sha512-7bY3J8GCVxLupn/kNmpPc5VJz8grx+4RKfnnJiO1LG+uxkZfANZG3RMHhE+qQxxwkyQ9/MfPtTpf748UhR425A== + +"@aws-cdk/cloud-assembly-schema@^39.0.1": + version "39.2.5" + resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-39.2.5.tgz#c7c6a9866262e43e4d777934dcc3804191a586db" + integrity sha512-2065lXgoHT7XzrL5bm+jIutUNNBTDFBOSSgQNdHntTkl7Ljhyaithp2Ppayy1aLmShW12S1yJ+6JAGzE4M7EGg== + dependencies: + jsonschema "~1.4.1" + semver "^7.6.3" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/compat-data@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" + integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.7.tgz#0439347a183b97534d52811144d763a17f9d2b24" + integrity sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.5" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.7" + "@babel/parser" "^7.26.7" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.26.7" + "@babel/types" "^7.26.7" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.26.5", "@babel/generator@^7.7.2": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" + integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== + dependencies: + "@babel/parser" "^7.26.5" + "@babel/types" "^7.26.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" + integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== + dependencies: + "@babel/compat-data" "^7.26.5" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helpers@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.7.tgz#fd1d2a7c431b6e39290277aacfd8367857c576a4" + integrity sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.7" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.7.tgz#e114cd099e5f7d17b05368678da0fb9f69b3385c" + integrity sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w== + dependencies: + "@babel/types" "^7.26.7" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/template@^7.25.9", "@babel/template@^7.3.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.7": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.7.tgz#99a0a136f6a75e7fb8b0a1ace421e0b25994b8bb" + integrity sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.5" + "@babel/parser" "^7.26.7" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.7" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.5", "@babel/types@^7.26.7", "@babel/types@^7.3.3": + version "7.26.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.7.tgz#5e2b89c0768e874d4d061961f3a5a153d71dc17a" + integrity sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + +"@balena/dockerignore@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@balena/dockerignore/-/dockerignore-1.0.2.tgz#9ffe4726915251e8eb69f44ef3547e0da2c03e0d" + integrity sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q== + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/compat@^1.2.4": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@eslint/compat/-/compat-1.2.5.tgz#438f8bbe105341853469b2cf2d10b6321cadeb3a" + integrity sha512-5iuG/StT+7OfvhoBHPlmxkPA9om6aDUFgmD4+mWKAGsYt4vCe8rypneG03AuseyRHBmcCLXQtIH5S26tIoggLg== + +"@eslint/config-array@^0.19.0": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.1.tgz#734aaea2c40be22bbb1f2a9dac687c57a6a4c984" + integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== + dependencies: + "@eslint/object-schema" "^2.1.5" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/core@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.10.0.tgz#23727063c21b335f752dbb3a16450f6f9cbc9091" + integrity sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c" + integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.19.0", "@eslint/js@^9.16.0": + version "9.19.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.19.0.tgz#51dbb140ed6b49d05adc0b171c41e1a8713b7789" + integrity sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ== + +"@eslint/object-schema@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.5.tgz#8670a8f6258a2be5b2c620ff314a1d984c23eb2e" + integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== + +"@eslint/plugin-kit@^0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz#ee07372035539e7847ef834e3f5e7b79f09e3a81" + integrity sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A== + dependencies: + "@eslint/core" "^0.10.0" + levn "^0.4.1" + +"@gerrit0/mini-shiki@^1.24.0": + version "1.27.2" + resolved "https://registry.yarnpkg.com/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz#cf2a9fcb08a6581c78fc94821f0c854ec4b9f899" + integrity sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og== + dependencies: + "@shikijs/engine-oniguruma" "^1.27.2" + "@shikijs/types" "^1.27.2" + "@shikijs/vscode-textmate" "^10.0.1" + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b" + integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@microsoft/tsdoc-config@0.17.1": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz#e0f0b50628f4ad7fe121ca616beacfe6a25b9335" + integrity sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw== + dependencies: + "@microsoft/tsdoc" "0.15.1" + ajv "~8.12.0" + jju "~1.4.0" + resolve "~1.22.2" + +"@microsoft/tsdoc@0.15.1": + version "0.15.1" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz#d4f6937353bc4568292654efb0a0e0532adbcba2" + integrity sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgr/core@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== + +"@shikijs/engine-oniguruma@^1.27.2": + version "1.29.1" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.1.tgz#118de735cb4e5a07d8792969342b988d2cfda01c" + integrity sha512-gSt2WhLNgEeLstcweQOSp+C+MhOpTsgdNXRqr3zP6M+BUBZ8Md9OU2BYwUYsALBxHza7hwaIWtFHjQ/aOOychw== + dependencies: + "@shikijs/types" "1.29.1" + "@shikijs/vscode-textmate" "^10.0.1" + +"@shikijs/types@1.29.1", "@shikijs/types@^1.27.2": + version "1.29.1" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.29.1.tgz#41f05dac7203f64ac0ac3c4b7dc75cb6b85f76f5" + integrity sha512-aBqAuhYRp5vSir3Pc9+QPu9WESBOjUo03ao0IHLC4TyTioSsp/SkbAZSrIH4ghYYC1T1KTEpRSBa83bas4RnPA== + dependencies: + "@shikijs/vscode-textmate" "^10.0.1" + "@types/hast" "^3.0.4" + +"@shikijs/vscode-textmate@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz#d06d45b67ac5e9b0088e3f67ebd3f25c6c3d711a" + integrity sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/hast@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.5.14": + version "29.5.14" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" + integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/node@*": + version "22.10.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.10.tgz#85fe89f8bf459dc57dfef1689bd5b52ad1af07e6" + integrity sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww== + dependencies: + undici-types "~6.20.0" + +"@types/node@20.14.8": + version "20.14.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.8.tgz#45c26a2a5de26c3534a9504530ddb3b27ce031ac" + integrity sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA== + dependencies: + undici-types "~5.26.4" + +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/unist@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@8.21.0", "@typescript-eslint/eslint-plugin@^8.18.0": + version "8.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz#395014a75112ecdb81142b866ab6bb62e3be0f2a" + integrity sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.21.0" + "@typescript-eslint/type-utils" "8.21.0" + "@typescript-eslint/utils" "8.21.0" + "@typescript-eslint/visitor-keys" "8.21.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^2.0.0" + +"@typescript-eslint/parser@8.21.0", "@typescript-eslint/parser@^8.18.0": + version "8.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.21.0.tgz#312c638aaba4f640d45bfde7c6795a9d75deb088" + integrity sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA== + dependencies: + "@typescript-eslint/scope-manager" "8.21.0" + "@typescript-eslint/types" "8.21.0" + "@typescript-eslint/typescript-estree" "8.21.0" + "@typescript-eslint/visitor-keys" "8.21.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@8.21.0": + version "8.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz#d08d94e2a34b4ccdcc975543c25bb62917437500" + integrity sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA== + dependencies: + "@typescript-eslint/types" "8.21.0" + "@typescript-eslint/visitor-keys" "8.21.0" + +"@typescript-eslint/type-utils@8.21.0": + version "8.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz#2e69d1a93cdbedc73fe694cd6ae4dfedd00430a0" + integrity sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ== + dependencies: + "@typescript-eslint/typescript-estree" "8.21.0" + "@typescript-eslint/utils" "8.21.0" + debug "^4.3.4" + ts-api-utils "^2.0.0" + +"@typescript-eslint/types@8.21.0": + version "8.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.21.0.tgz#58f30aec8db8212fd886835dc5969cdf47cb29f5" + integrity sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A== + +"@typescript-eslint/typescript-estree@8.21.0": + version "8.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz#5ce71acdbed3b97b959f6168afba5a03c88f69a9" + integrity sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg== + dependencies: + "@typescript-eslint/types" "8.21.0" + "@typescript-eslint/visitor-keys" "8.21.0" + 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 "^2.0.0" + +"@typescript-eslint/utils@8.21.0": + version "8.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.21.0.tgz#bc4874fbc30feb3298b926e3b03d94570b3999c5" + integrity sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.21.0" + "@typescript-eslint/types" "8.21.0" + "@typescript-eslint/typescript-estree" "8.21.0" + +"@typescript-eslint/visitor-keys@8.21.0": + version "8.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz#a89744c4cdc83b5c761eb5878befe6c33d1481b2" + integrity sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w== + dependencies: + "@typescript-eslint/types" "8.21.0" + eslint-visitor-keys "^4.2.0" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.14.0, acorn@^8.4.1: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ajv@~8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@^3.2.3: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + +aws-cdk-lib@2.176.0: + version "2.176.0" + resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.176.0.tgz#1ea69b54aef35ddd8f8e57a2059e5bd2f0ba42a3" + integrity sha512-6Gs2kBaq4elQ4fNAOiCgbD9oOLx/heb/Lp4OVE6Uf7FulYW0DikWJXxR5GWJslTJ4/sCf3UU91q415fc0bruLg== + 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.0.1" + "@balena/dockerignore" "^1.0.2" + case "1.6.3" + fs-extra "^11.2.0" + ignore "^5.3.2" + jsonschema "^1.4.1" + mime-types "^2.1.35" + minimatch "^3.1.2" + punycode "^2.3.1" + semver "^7.6.3" + table "^6.8.2" + yaml "1.10.2" + +aws-cdk@2.176.0: + version "2.176.0" + resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-2.176.0.tgz#46966fb466254470f14c42df75ec99fb76b571b8" + integrity sha512-yRjIXzK2ddznwuSjasWAViYBtBSQbEu6GHlylaC3GHsIUPhrK3KguqIuhdlxjMeiQ1Fvok8REDLCReZJdrSLLg== + optionalDependencies: + fsevents "2.3.2" + +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.24.0: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== + dependencies: + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" + +bs-logger@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001688: + version "1.0.30001695" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz#39dfedd8f94851132795fdf9b79d29659ad9c4d4" + integrity sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw== + +case@1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== + +cdk-nag@^2.35.0: + version "2.35.0" + resolved "https://registry.yarnpkg.com/cdk-nag/-/cdk-nag-2.35.0.tgz#2c267ffa48c8567971752783c20a3fa8aea41283" + integrity sha512-jH2cff8abe6MF28N3qDOP97+vbcYZMjoFZutipD+rRtqm2uk7BoStayInUt+s9L15mKLZq6Z/8YELIzy+rDLIQ== + +chalk@^4.0.0, chalk@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cjs-module-lexer@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +constructs@^10.4.2: + version "10.4.2" + resolved "https://registry.yarnpkg.com/constructs/-/constructs-10.4.2.tgz#e875a78bef932cca12ea63965969873a25c1c132" + integrity sha512-wsNxBlAott2qg8Zv87q3eYZYgheb9lchtBfjHzzLHtXbttwSrHPs1NNQbBrmbb1YZvYg2+Vh0Dor76w4mFxJkA== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.3, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +dedent@^1.0.0: + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +ejs@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.5.73: + version "1.5.88" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz#cdb6e2dda85e6521e8d7d3035ba391c8848e073a" + integrity sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== + +eslint-plugin-prettier@^5.2.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz#c4af01691a6fa9905207f0fbba0d7bea0902cce5" + integrity sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw== + dependencies: + prettier-linter-helpers "^1.0.0" + synckit "^0.9.1" + +eslint-plugin-tsdoc@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.4.0.tgz#b14104e96ceb8add2054bf39e0cfc12b9a9586e6" + integrity sha512-MT/8b4aKLdDClnS8mP3R/JNjg29i0Oyqd/0ym6NnQf+gfKbJJ4ZcSh2Bs1H0YiUMTBwww5JwXGTWot/RwyJ7aQ== + dependencies: + "@microsoft/tsdoc" "0.15.1" + "@microsoft/tsdoc-config" "0.17.1" + +eslint-scope@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442" + integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@^9.16.0: + version "9.19.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.19.0.tgz#ffa1d265fc4205e0f8464330d35f09e1d548b1bf" + integrity sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.19.0" + "@eslint/core" "^0.10.0" + "@eslint/eslintrc" "^3.2.0" + "@eslint/js" "9.19.0" + "@eslint/plugin-kit" "^0.2.5" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.1" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.2.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== + dependencies: + acorn "^8.14.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + +fastq@^1.6.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" + integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== + +fs-extra@^11.2.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" + integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +fsevents@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3, glob@^7.1.4, glob@^9.3.5: + version "9.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^15.13.0: + version "15.14.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.14.0.tgz#b8fd3a8941ff3b4d38f3319d433b61bbb482e73f" + integrity sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig== + +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +ignore@^5.2.0, ignore@^5.3.1, ignore@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + 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" + +istanbul-lib-instrument@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + 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" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jake@^10.8.5: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + 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" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + +jju@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" + integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonschema@^1.4.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.5.0.tgz#f6aceb1ab9123563dd901d05f81f9d4883d3b7d8" + integrity sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw== + +jsonschema@~1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +linkify-it@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== + dependencies: + uc.micro "^2.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@^1.1.1, make-error@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +markdown-it@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" + integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== + dependencies: + argparse "^2.0.1" + entities "^4.4.0" + linkify-it "^5.0.0" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.1.0" + +mdurl@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.35: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.4, minimatch@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.6.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== + +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== + +punycode@^2.1.0, punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-is@^18.0.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" + integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== + +resolve@^1.20.0, resolve@~1.22.2: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +synckit@^0.9.1: + version "0.9.2" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" + integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== + dependencies: + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" + +table@^6.8.2: + version "6.9.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5" + integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== + 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" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-api-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.0.tgz#b9d7d5f7ec9f736f4d0f09758b8607979044a900" + integrity sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ== + +ts-jest@^29.2.5: + version "29.2.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" + integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== + dependencies: + bs-logger "^0.2.6" + ejs "^3.1.10" + fast-json-stable-stringify "^2.1.0" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.6.3" + yargs-parser "^21.1.1" + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@^2.6.2: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typedoc@^0.27.4: + version "0.27.6" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.27.6.tgz#7e8d067bd5386b7908afcb12c9054a83e8bb326b" + integrity sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw== + dependencies: + "@gerrit0/mini-shiki" "^1.24.0" + lunr "^2.3.9" + markdown-it "^14.1.0" + minimatch "^9.0.5" + yaml "^2.6.1" + +typescript-eslint@^8.18.0: + version "8.21.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.21.0.tgz#78bdb83a6d771f0312b128297d84a3111885fd08" + integrity sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw== + dependencies: + "@typescript-eslint/eslint-plugin" "8.21.0" + "@typescript-eslint/parser" "8.21.0" + "@typescript-eslint/utils" "8.21.0" + +typescript@~5.7.2: + version "5.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" + integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== + +uc.micro@^2.0.0, uc.micro@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +update-browserslist-db@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" + integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-to-istanbul@^9.0.1: + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yaml@1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" + integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From e2d062cd918c774d35490cad328029b75856140e Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Sat, 25 Jan 2025 12:09:28 +0100 Subject: [PATCH 023/112] downsizing codebuild ComputeType to save on cost and because resources are not fully used --- lib/codebuild-embedded-linux.ts | 2 +- lib/codepipeline-embedded-linux-base-image.ts | 2 +- lib/codepipeline-embedded-linux.ts | 2 +- lib/deprecated/build-image-pipeline.ts | 2 +- lib/deprecated/embedded-linux-codebuild-project.ts | 2 +- lib/deprecated/embedded-linux-pipeline.ts | 2 +- .../codepipeline-embedded-linux-base-image.test.ts.snap | 2 +- test/__snapshots__/codepipeline-embedded-linux.test.ts.snap | 2 +- .../__snapshots__/build-image-pipeline.test.ts.snap | 2 +- .../__snapshots__/embedded-linux-pipeline.test.ts.snap | 6 +++--- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/codebuild-embedded-linux.ts b/lib/codebuild-embedded-linux.ts index 4049867..eda45b1 100644 --- a/lib/codebuild-embedded-linux.ts +++ b/lib/codebuild-embedded-linux.ts @@ -86,7 +86,7 @@ export class EmbeddedLinuxCodeBuildProjectStack extends cdk.Stack { }, }), environment: { - computeType: codebuild.ComputeType.X2_LARGE, + computeType: codebuild.ComputeType.X_LARGE, buildImage: codebuild.LinuxBuildImage.fromEcrRepository( props.ecrRepository, props.ecrRepositoryImageTag, diff --git a/lib/codepipeline-embedded-linux-base-image.ts b/lib/codepipeline-embedded-linux-base-image.ts index 279ec27..8909db8 100644 --- a/lib/codepipeline-embedded-linux-base-image.ts +++ b/lib/codepipeline-embedded-linux-base-image.ts @@ -112,7 +112,7 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { projectName: `${this.ecrRepositoryImageTag}`, buildSpec: codebuild.BuildSpec.fromSourceFilename(`buildspec.yml`), environment: { - computeType: codebuild.ComputeType.LARGE, + computeType: codebuild.ComputeType.MEDIUM, buildImage: codebuild.LinuxBuildImage.STANDARD_7_0, privileged: true, }, diff --git a/lib/codepipeline-embedded-linux.ts b/lib/codepipeline-embedded-linux.ts index 0d451e1..9f9e9f0 100644 --- a/lib/codepipeline-embedded-linux.ts +++ b/lib/codepipeline-embedded-linux.ts @@ -176,7 +176,7 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { "build.buildspec.yml", ), environment: { - computeType: codebuild.ComputeType.X2_LARGE, + computeType: codebuild.ComputeType.X_LARGE, buildImage: codebuild.LinuxBuildImage.fromEcrRepository( props.ecrRepository, props.ecrRepositoryImageTag, diff --git a/lib/deprecated/build-image-pipeline.ts b/lib/deprecated/build-image-pipeline.ts index b8fb63c..c089dde 100644 --- a/lib/deprecated/build-image-pipeline.ts +++ b/lib/deprecated/build-image-pipeline.ts @@ -78,7 +78,7 @@ export class BuildImagePipelineStack extends cdk.Stack { { buildSpec: codebuild.BuildSpec.fromSourceFilename(`buildspec.yml`), environment: { - computeType: codebuild.ComputeType.LARGE, + computeType: codebuild.ComputeType.MEDIUM, buildImage: codebuild.LinuxBuildImage.STANDARD_7_0, privileged: true, }, diff --git a/lib/deprecated/embedded-linux-codebuild-project.ts b/lib/deprecated/embedded-linux-codebuild-project.ts index 7b7064b..b40cc7c 100644 --- a/lib/deprecated/embedded-linux-codebuild-project.ts +++ b/lib/deprecated/embedded-linux-codebuild-project.ts @@ -131,7 +131,7 @@ export class EmbeddedLinuxCodebuildProjectStack extends cdk.Stack { }, }), environment: { - computeType: ComputeType.X2_LARGE, + computeType: ComputeType.X_LARGE, buildImage: LinuxBuildImage.fromEcrRepository( props.imageRepo, props.imageTag, diff --git a/lib/deprecated/embedded-linux-pipeline.ts b/lib/deprecated/embedded-linux-pipeline.ts index b7210aa..8f7e218 100644 --- a/lib/deprecated/embedded-linux-pipeline.ts +++ b/lib/deprecated/embedded-linux-pipeline.ts @@ -218,7 +218,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { const project = new PipelineProject(this, "EmbeddedLinuxBuildProject", { buildSpec: BuildSpec.fromSourceFilename("build.buildspec.yml"), environment: { - computeType: ComputeType.X2_LARGE, + computeType: ComputeType.X_LARGE, buildImage: LinuxBuildImage.fromEcrRepository( props.imageRepo, props.imageTag, diff --git a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap index 8290304..1f9147f 100644 --- a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap @@ -769,7 +769,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", }, "Environment": { - "ComputeType": "BUILD_GENERAL1_LARGE", + "ComputeType": "BUILD_GENERAL1_MEDIUM", "EnvironmentVariables": [ { "Name": "ECR_REPOSITORY_URI", diff --git a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap index 246ad3b..bb5dbd1 100644 --- a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap @@ -1069,7 +1069,7 @@ def handler(event, context): "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", }, "Environment": { - "ComputeType": "BUILD_GENERAL1_2XLARGE", + "ComputeType": "BUILD_GENERAL1_XLARGE", "EnvironmentVariables": [ { "Name": "AWS_ACCOUNT_ID", diff --git a/test/deprecated/__snapshots__/build-image-pipeline.test.ts.snap b/test/deprecated/__snapshots__/build-image-pipeline.test.ts.snap index 66a4c3b..8045180 100644 --- a/test/deprecated/__snapshots__/build-image-pipeline.test.ts.snap +++ b/test/deprecated/__snapshots__/build-image-pipeline.test.ts.snap @@ -593,7 +593,7 @@ exports[`Build Image Pipeline Snapshot 1`] = ` ], }, "Environment": { - "ComputeType": "BUILD_GENERAL1_LARGE", + "ComputeType": "BUILD_GENERAL1_MEDIUM", "EnvironmentVariables": [ { "Name": "ECR_REPOSITORY_URI", diff --git a/test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap b/test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap index 5c5454f..309add2 100644 --- a/test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap +++ b/test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap @@ -407,7 +407,7 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` ], }, "Environment": { - "ComputeType": "BUILD_GENERAL1_2XLARGE", + "ComputeType": "BUILD_GENERAL1_XLARGE", "EnvironmentVariables": [ { "Name": "IMPORT_BUCKET", @@ -2931,7 +2931,7 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` ], }, "Environment": { - "ComputeType": "BUILD_GENERAL1_2XLARGE", + "ComputeType": "BUILD_GENERAL1_XLARGE", "EnvironmentVariables": [ { "Name": "IMPORT_BUCKET", @@ -5455,7 +5455,7 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` ], }, "Environment": { - "ComputeType": "BUILD_GENERAL1_2XLARGE", + "ComputeType": "BUILD_GENERAL1_XLARGE", "Image": { "Fn::Join": [ "", From 5827e525c3f36ed2d2de0aa6b692d3d5620803d8 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Sat, 25 Jan 2025 12:45:03 +0100 Subject: [PATCH 024/112] Normalize all the line endings --- eslint.config.mjs | 176 +++++++++++++++++++------------------- package.json | 110 ++++++++++++------------ scripts/create-ec2-ami.sh | 1 + 3 files changed, 144 insertions(+), 143 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index b3c89db..c185476 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,88 +1,88 @@ -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", - ], - ...eslint.configs.recommended, - }, - includeIgnoreFile(gitignorePath), - { - // your overrides - }, - ...compat.extends( - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended" - ), - ...tseslint.configs.recommended, -]; +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", + ], + ...eslint.configs.recommended, + }, + includeIgnoreFile(gitignorePath), + { + // your overrides + }, + ...compat.extends( + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended" + ), + ...tseslint.configs.recommended, +]; diff --git a/package.json b/package.json index c10ea14..671315c 100644 --- a/package.json +++ b/package.json @@ -1,55 +1,55 @@ -{ - "name": "aws4embeddedlinux-cdk-lib", - "version": "0.2.0", - "main": "dist/lib/index.js", - "types": "dist/lib/index.d.ts", - "license": "MIT", - "scripts": { - "build": "tsc", - "watch": "tsc -w", - "cdk": "cdk", - "clean": "tsc --build --clean && rm -rf dist && rm -rf source-zip && rm -rf cdk.out", - "doc": "typedoc --sort source-order --readme README.md", - "format": "eslint '**/*.{js,ts,json}' --quiet --fix", - "check": "eslint '**/*.{js,ts,json}'", - "build-assets": "./utils/build-assets.sh", - "prebuild": "yarn run build-assets", - "test": "yarn run prebuild && jest", - "update-snapshot": "yarn run prebuild && jest -u", - "prepare": "yarn run build", - "prepare-commit": "yarn run clean && yarn run format && yarn run build && yarn run check && yarn run test" - }, - "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" - } -} +{ + "name": "aws4embeddedlinux-cdk-lib", + "version": "0.2.0", + "main": "dist/lib/index.js", + "types": "dist/lib/index.d.ts", + "license": "MIT", + "scripts": { + "build": "tsc", + "watch": "tsc -w", + "cdk": "cdk", + "clean": "tsc --build --clean && rm -rf dist && rm -rf source-zip && rm -rf cdk.out", + "doc": "typedoc --sort source-order --readme README.md", + "format": "eslint '**/*.{js,ts,json}' --quiet --fix", + "check": "eslint '**/*.{js,ts,json}'", + "build-assets": "./utils/build-assets.sh", + "prebuild": "yarn run build-assets", + "test": "yarn run prebuild && jest", + "update-snapshot": "yarn run prebuild && jest -u", + "prepare": "yarn run build", + "prepare-commit": "yarn run clean && yarn run format && yarn run build && yarn run check && yarn run test" + }, + "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" + } +} diff --git a/scripts/create-ec2-ami.sh b/scripts/create-ec2-ami.sh index 0f47fd5..93e887f 100755 --- a/scripts/create-ec2-ami.sh +++ b/scripts/create-ec2-ami.sh @@ -158,3 +158,4 @@ else echo "Backup Failed, exiting" exit 2 fi + From acc1977b223f65b3cc6f805a32fa6d5c6a1ba505 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Sat, 25 Jan 2025 13:04:41 +0100 Subject: [PATCH 025/112] forcing lf endings --- .gitattributes | 2 +- eslint.config.mjs | 5 +---- package.json | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.gitattributes b/.gitattributes index 94f480d..6313b56 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -* text=auto eol=lf \ No newline at end of file +* text=auto eol=lf diff --git a/eslint.config.mjs b/eslint.config.mjs index c185476..0fc444e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -76,13 +76,10 @@ export default [ ...eslint.configs.recommended, }, includeIgnoreFile(gitignorePath), - { - // your overrides - }, ...compat.extends( "eslint:recommended", "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended" + "plugin:prettier/recommended", ), ...tseslint.configs.recommended, ]; diff --git a/package.json b/package.json index 671315c..00aab13 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "test": "yarn run prebuild && jest", "update-snapshot": "yarn run prebuild && jest -u", "prepare": "yarn run build", - "prepare-commit": "yarn run clean && yarn run format && yarn run build && yarn run check && yarn run test" + "prepare-commit": "yarn run clean && yarn run format && yarn run build && yarn run check && yarn run test " }, "dependencies": { "aws-cdk-lib": "2.176.0", From 0eab16aef75ddaf97f16bce1ac4cb2be79971bbc Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 5 Feb 2025 15:05:19 +0100 Subject: [PATCH 026/112] adding docker image file to allow uplaod & zip of source repo via cdk assets --- docker/alpine-zip/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 docker/alpine-zip/Dockerfile diff --git a/docker/alpine-zip/Dockerfile b/docker/alpine-zip/Dockerfile new file mode 100644 index 0000000..f052d86 --- /dev/null +++ b/docker/alpine-zip/Dockerfile @@ -0,0 +1,2 @@ +FROM alpine:latest +RUN apk --no-cache add zip \ No newline at end of file From 64eea571a12194804c28ed30f5ca39ab9b4d1029 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 5 Feb 2025 15:07:52 +0100 Subject: [PATCH 027/112] variable renaming to improve readability --- lib/codepipeline-resources.ts | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/codepipeline-resources.ts b/lib/codepipeline-resources.ts index 73e9393..cf33b79 100644 --- a/lib/codepipeline-resources.ts +++ b/lib/codepipeline-resources.ts @@ -18,9 +18,9 @@ export interface PipelineResourcesProps extends cdk.StackProps { /** The artifact bucket name - if not provided then the name will be '{prefix}-{account}-{region}-artifact'*/ readonly artifactBucketName?: string; /** The source bucket name - if not provided then the name will be '{prefix}-{account}-{region}-source'*/ - readonly sourceBucketName?: string; + readonly sourceRepositoryBucketName?: string; /** The source bucket name - if not provided then the name will be '{prefix}-{account}-{region}-output'*/ - readonly outputBucketName?: string; + readonly pipelineOutputBucketName?: string; /** The source bucket name - if not provided then the name will be '{prefix}-{account}-{region}-output-vm-import'*/ readonly outputVMImportBucketName?: string; /** Access logging bucket name - if not provided then the name will be '{prefix}-{account}-{region}-logs'*/ @@ -36,13 +36,13 @@ export class PipelineResourcesStack extends cdk.Stack { /** The respository to put the build host container in. */ public readonly ecrRepository: ecr.IRepository; /** The source bucket*/ - public readonly sourceBucket: s3.IBucket; + public readonly sourceRepositoryBucket: s3.IBucket; /** the artifact bucket*/ public readonly artifactBucket: s3.Bucket; /** The access logging bucket to use*/ public readonly accessLoggingBucket?: s3.Bucket; /** The output bucket*/ - public readonly outputBucket: s3.Bucket; + public readonly pipelineOutputBucket: s3.Bucket; /** The output vm import bucket*/ public readonly outputVMImportBucket: VMImportBucket; /** The encryption key use across*/ @@ -57,17 +57,17 @@ export class PipelineResourcesStack extends cdk.Stack { const artifactBucketName = props.artifactBucketName ? props.artifactBucketName : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-artifact`.toLowerCase(); - const sourceBucketName = props.sourceBucketName - ? props.sourceBucketName + const sourceRepositoryBucketName = props.sourceRepositoryBucketName + ? props.sourceRepositoryBucketName : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-source`.toLowerCase(); - const outputBucketName = props.outputBucketName - ? props.outputBucketName + const pipelineOutputBucketName = props.pipelineOutputBucketName + ? props.pipelineOutputBucketName : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-output`.toLowerCase(); const outputVMImportBucketName = props.outputVMImportBucketName ? props.outputVMImportBucketName : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-output-vm`.toLowerCase(); - const accessLoggingBucketName = props.sourceBucketName - ? props.sourceBucketName + const accessLoggingBucketName = props.sourceRepositoryBucketName + ? props.sourceRepositoryBucketName : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-access-logs`.toLowerCase(); // We will create a VPC with 3 Private and Public subnets for AWS @@ -117,8 +117,8 @@ export class PipelineResourcesStack extends cdk.Stack { }, ); - this.sourceBucket = new s3.Bucket(this, "PipelineResourcesSourceBucket", { - bucketName: sourceBucketName, + this.sourceRepositoryBucket = new s3.Bucket(this, "PipelineResourcesSourceBucket", { + bucketName: sourceRepositoryBucketName, versioned: true, enforceSSL: true, autoDeleteObjects: true, @@ -143,8 +143,8 @@ export class PipelineResourcesStack extends cdk.Stack { }, ); - this.outputBucket = new s3.Bucket(this, "PipelineResourcesOutputBucket", { - bucketName: outputBucketName, + this.pipelineOutputBucket = new s3.Bucket(this, "PipelineResourcesOutputBucket", { + bucketName: pipelineOutputBucketName, versioned: true, enforceSSL: true, autoDeleteObjects: true, @@ -177,7 +177,7 @@ export class PipelineResourcesStack extends cdk.Stack { new cdk.CfnOutput(this, "OutputPipelineResourcesSourceBucket", { exportName: "sourceBucket", - value: this.sourceBucket.bucketName, + value: this.sourceRepositoryBucket.bucketName, description: "The source bucket.", }); @@ -189,7 +189,7 @@ export class PipelineResourcesStack extends cdk.Stack { new cdk.CfnOutput(this, "OutputPipelineResourcesOutputBucket", { exportName: "outputBucket", - value: this.outputBucket.bucketName, + value: this.pipelineOutputBucket.bucketName, description: "The output bucket.", }); From 16ed4488ae2846cfe9c0509da9a2491bb71310ac Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 5 Feb 2025 15:08:20 +0100 Subject: [PATCH 028/112] differentiating ProjectKind from deprecated API --- lib/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index bd23a5f..f7d3842 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -27,9 +27,9 @@ export function isBucketVersioned(bucket: s3.Bucket | s3.IBucket) { } /** - * The kind of project built. + * The type of project built. */ -export enum ProjectKind { +export enum ProjectType { /** Build core-image-minimal from poky. */ Poky = "poky", /** Build the Qemu meta-aws Demonstration Distribution. */ @@ -44,4 +44,6 @@ export enum ProjectKind { 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", } From eda3f919e2a864c828afaf776e35a998ee58e340 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 5 Feb 2025 15:09:49 +0100 Subject: [PATCH 029/112] - code refactoring to remove local archive creation (using assets and bucket deployement instead - variable renaming to improve readability --- lib/codepipeline-embedded-linux-base-image.ts | 66 ++++++++++++------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/lib/codepipeline-embedded-linux-base-image.ts b/lib/codepipeline-embedded-linux-base-image.ts index 8909db8..04b89db 100644 --- a/lib/codepipeline-embedded-linux-base-image.ts +++ b/lib/codepipeline-embedded-linux-base-image.ts @@ -2,7 +2,8 @@ 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 { BucketDeployment, Source, DeployTimeSubstitutedFile } 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"; @@ -20,7 +21,7 @@ import * as kms from "aws-cdk-lib/aws-kms"; export interface EmbeddedLinuxCodePipelineBaseImageProps extends cdk.StackProps { /** The source bucket */ - readonly sourceBucket: s3.IBucket; + readonly sourceRepositoryBucket: s3.IBucket; /** The ECR Repository to push to. */ readonly ecrRepository: ecr.IRepository; /** Artifact bucket to use */ @@ -51,13 +52,11 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { this.ecrRepository = props.ecrRepository; this.ecrRepositoryImageTag = `${id}`; - const sourceBase: string = "base-image"; - const sourceFileName: string = `source-${sourceBase}.zip`; - const sourceLocalPath: string = `source-zip/${sourceBase}`; - const sourceDestinationKeyPrefix: string = `source/${sourceBase}`; + const sourceRepoBase: string = "base-image"; + const sourceRepoPath: string = `source-repo/${sourceRepoBase}`; // create the policy & role for the source bucket deployment - const sourceBucketDeploymentPolicy = new iam.PolicyDocument({ + const sourceRepositoryBucketDeploymentPolicy = new iam.PolicyDocument({ statements: [ new iam.PolicyStatement({ actions: [ @@ -71,37 +70,54 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { }), ], }); - const sourceBucketDeploymentRole = new iam.Role( + const sourceRepositoryBucketDeploymentRole = new iam.Role( this, "CodePipelineBuildBaseImageBucketDeploymentRole", { assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"), - inlinePolicies: { sourceBucketDeploymentPolicy }, + inlinePolicies: { sourceRepositoryBucketDeploymentPolicy }, }, ); - // deploy the source to the bucket + // archive and upload the source-repo folder into CDK owned bucket + let sourceRepoAsset: Asset = new Asset(this, "CodePipelineBuildBaseImageBucketDeploymentAsset", { + path: path.join(__dirname, "..", sourceRepoPath), + bundling: { + image: cdk.DockerImage.fromBuild(path.join(__dirname, "..", "docker", "alpine-zip")), + command: [ + 'sh', '-c', [ + `cd /asset-input`, + `chmod a+w /asset-output`, + `zip -q -o /asset-output/source-${sourceRepoBase}.zip -r *`, + ].join(' && '), + ], + outputType: cdk.BundlingOutput.SINGLE_FILE, // Bundling output will be zipped even though it produces a single archive file. + }, + }); + + // deploy the uploaded archive to the target bucket const bucketDeployment = new BucketDeployment( this, "CodePipelineBuildBaseImageBucketDeployment", { - // Note: Run `npm run zip-data` before deploying this stack! - sources: [Source.asset(path.join(__dirname, "..", sourceLocalPath))], - destinationBucket: props.sourceBucket, - role: sourceBucketDeploymentRole, - extract: true, - destinationKeyPrefix: sourceDestinationKeyPrefix, + sources: [ + Source.bucket(sourceRepoAsset.bucket, sourceRepoAsset.s3ObjectKey), + ], + destinationBucket: props.sourceRepositoryBucket, + role: sourceRepositoryBucketDeploymentRole, + extract: false, + destinationKeyPrefix: sourceRepoPath, }, ); // Create a source action. - const sourceOutput = new codepipeline.Artifact("Source"); + const sourceActionOutputArtifact = new codepipeline.Artifact("Source"); const sourceAction = new codepipeline_actions.S3SourceAction({ actionName: "Source", trigger: codepipeline_actions.S3Trigger.EVENTS, - output: sourceOutput, - bucket: props.sourceBucket, - bucketKey: `${sourceDestinationKeyPrefix}/${sourceFileName}`, + output: sourceActionOutputArtifact, + bucket: props.sourceRepositoryBucket, + bucketKey: `${sourceRepoPath}/${sourceRepoAsset.s3ObjectKey}`, }); // Create a build action. @@ -156,7 +172,7 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { const buildAction = new codepipeline_actions.CodeBuildAction({ actionName: "Build", project: project, - input: sourceOutput, + input: sourceActionOutputArtifact, }); const pipeline = new codepipeline.Pipeline( @@ -192,7 +208,7 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { targets: [pipelineTarget], }); - // Add a stack output for the ECR repository and image tag + // Add stack output for the ECR repository and image tag new cdk.CfnOutput(this, "ECRRepositoryName", { value: this.ecrRepository.repositoryName, description: @@ -206,5 +222,11 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { 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", }); + + // Add stack output for the source-repo bucket uri for this pipeline + new cdk.CfnOutput(this, "BuildSource", { + value: `s3://${props.sourceRepositoryBucket.bucketName}/${sourceRepoPath}/${sourceRepoAsset.s3ObjectKey}`, + description: "The source-repo bucket uri for this pipeline.", + }); } } From 46ac2aa789e82c82d88df43cdc64e645c52e1eff Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 5 Feb 2025 15:41:47 +0100 Subject: [PATCH 030/112] minor comment changes --- lib/codepipeline-embedded-linux-base-image.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/codepipeline-embedded-linux-base-image.ts b/lib/codepipeline-embedded-linux-base-image.ts index 04b89db..be85ae2 100644 --- a/lib/codepipeline-embedded-linux-base-image.ts +++ b/lib/codepipeline-embedded-linux-base-image.ts @@ -110,7 +110,7 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { }, ); - // Create a source action. + /** Create our CodeCodePipeline Actions. */ const sourceActionOutputArtifact = new codepipeline.Artifact("Source"); const sourceAction = new codepipeline_actions.S3SourceAction({ actionName: "Source", @@ -120,7 +120,7 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { bucketKey: `${sourceRepoPath}/${sourceRepoAsset.s3ObjectKey}`, }); - // Create a build action. + /** Create our CodeCodePipeline Project. */ const project = new codebuild.PipelineProject( this, "CodePipelineBuildBaseImageProject", From a01b026e4ca42589b92a6287be03d43a0ff78399 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 5 Feb 2025 16:35:25 +0100 Subject: [PATCH 031/112] moving the vmimport bucket class to the deprecated folder --- lib/{ => deprecated}/vm-import-bucket.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/{ => deprecated}/vm-import-bucket.ts (100%) diff --git a/lib/vm-import-bucket.ts b/lib/deprecated/vm-import-bucket.ts similarity index 100% rename from lib/vm-import-bucket.ts rename to lib/deprecated/vm-import-bucket.ts From 8089ca1b2a21c50d06352da931db359dca78f390 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 5 Feb 2025 16:35:53 +0100 Subject: [PATCH 032/112] adjusting the vmimport bucket class import --- lib/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/index.ts b/lib/index.ts index f7d3842..6e1229e 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -11,6 +11,7 @@ export * from "./deprecated/build-image-repo"; export * from "./deprecated/build-image-pipeline"; export * from "./deprecated/embedded-linux-pipeline"; export * from "./deprecated/embedded-linux-codebuild-project"; +export * from "./deprecated/vm-import-bucket"; export * from "./deprecated/constructs/source-repo"; export function isBucketVersioned(bucket: s3.Bucket | s3.IBucket) { From e901fff544b8fe3b5ebe9605a87ce004833a2163 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 5 Feb 2025 16:36:40 +0100 Subject: [PATCH 033/112] removing references to VMImportBucket --- lib/codepipeline-resources.ts | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/lib/codepipeline-resources.ts b/lib/codepipeline-resources.ts index cf33b79..1b067a1 100644 --- a/lib/codepipeline-resources.ts +++ b/lib/codepipeline-resources.ts @@ -6,7 +6,6 @@ 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"; -import { VMImportBucket } from "./vm-import-bucket"; /** * Select options for the {@link PipelineResourcesStack}. */ @@ -21,8 +20,6 @@ export interface PipelineResourcesProps extends cdk.StackProps { readonly sourceRepositoryBucketName?: string; /** The source bucket name - if not provided then the name will be '{prefix}-{account}-{region}-output'*/ readonly pipelineOutputBucketName?: string; - /** The source bucket name - if not provided then the name will be '{prefix}-{account}-{region}-output-vm-import'*/ - readonly outputVMImportBucketName?: string; /** Access logging bucket name - if not provided then the name will be '{prefix}-{account}-{region}-logs'*/ readonly accessLoggingBucketName?: string; } @@ -43,8 +40,6 @@ export class PipelineResourcesStack extends cdk.Stack { public readonly accessLoggingBucket?: s3.Bucket; /** The output bucket*/ public readonly pipelineOutputBucket: s3.Bucket; - /** The output vm import bucket*/ - public readonly outputVMImportBucket: VMImportBucket; /** The encryption key use across*/ public readonly encryptionKey: kms.Key; @@ -63,9 +58,6 @@ export class PipelineResourcesStack extends cdk.Stack { const pipelineOutputBucketName = props.pipelineOutputBucketName ? props.pipelineOutputBucketName : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-output`.toLowerCase(); - const outputVMImportBucketName = props.outputVMImportBucketName - ? props.outputVMImportBucketName - : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-output-vm`.toLowerCase(); const accessLoggingBucketName = props.sourceRepositoryBucketName ? props.sourceRepositoryBucketName : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-access-logs`.toLowerCase(); @@ -154,21 +146,6 @@ export class PipelineResourcesStack extends cdk.Stack { serverAccessLogsPrefix: "output-bucket", }); - this.outputVMImportBucket = new VMImportBucket( - this, - "PipelineResourcesOutputVMImportBucket", - { - bucketName: outputVMImportBucketName, - versioned: true, - enforceSSL: true, - autoDeleteObjects: true, - removalPolicy: cdk.RemovalPolicy.DESTROY, - encryptionKey: this.encryptionKey, - serverAccessLogsBucket: this.accessLoggingBucket, - serverAccessLogsPrefix: "output-vm-import-bucket", - }, - ); - new cdk.CfnOutput(this, "OutputPipelineResourcesAccessLoggingBucket", { exportName: "accessLoggingBucket", value: this.accessLoggingBucket.bucketName, @@ -192,11 +169,5 @@ export class PipelineResourcesStack extends cdk.Stack { value: this.pipelineOutputBucket.bucketName, description: "The output bucket.", }); - - new cdk.CfnOutput(this, "OutputPipelineResourcesOutputVMImportBuckett", { - exportName: "outputVMImportBucket", - value: this.outputVMImportBucket.bucketName, - description: "The output VM import bucket.", - }); } } From 274064f04215f8b4b17c6b8774ca34dfef31d154 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 5 Feb 2025 16:38:07 +0100 Subject: [PATCH 034/112] simplifying the build asset script --- utils/build-assets.sh | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/utils/build-assets.sh b/utils/build-assets.sh index fe57347..05d313e 100755 --- a/utils/build-assets.sh +++ b/utils/build-assets.sh @@ -4,31 +4,13 @@ SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" WD="$SCRIPTPATH/.." -# create a source-zip where all the source-repo folders will be stored as zip -mkdir -p $WD/source-zip - -# loop trough the source-repo folders -declare -a source_repos=(base-image kas meta-aws-demo nxp-imx poky poky-ami renesas) -for pipeline in "${source_repos[@]}" -do - if [ -f $WD/source-zip/$pipeline/source-$pipeline.zip ]; then - rm -rf $WD/source-zip/$pipeline - fi - mkdir -p $WD/source-zip/$pipeline - cd $WD/source-repo/$pipeline - # create a zip with the source repo content for the specific immage - zip -q -o $WD/source-zip/$pipeline/source-$pipeline.zip -r * -done # copy the folders into th dist folder -if [ -d $WD/dist/scripts ]; then rm -rf $WD/dist/scripts; fi +if [ -d $WD/dist/docker ]; then rm -rf $WD/dist/docker; fi if [ -d $WD/dist/source-repo ]; then rm -rf $WD/dist/source-repo; fi -if [ -d $WD/dist/source-zip ]; then rm -rf $WD/dist/source-zip; fi -mkdir -p $WD/dist/scripts +mkdir -p $WD/dist/docker mkdir -p $WD/dist/source-repo -mkdir -p $WD/dist/source-zip -cp -r $WD/scripts $WD/dist +cp -r $WD/docker $WD/dist cp -r $WD/source-repo $WD/dist -cp -r $WD/source-zip $WD/dist From 3c08b6634d2e502792a8fb015c1c91c3e6e7efd6 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 5 Feb 2025 16:39:16 +0100 Subject: [PATCH 035/112] excluding the test folder from the dist/build output --- tsconfig.json | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index a3c1c1c..91eb1e0 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,8 @@ "inlineSources": true, "experimentalDecorators": true, "strictPropertyInitialization": false, - "typeRoots": [ - "./node_modules/@types" - ], + "typeRoots": ["./node_modules/@types"], "outDir": "./dist" }, - "exclude": [ - "node_modules", - "cdk.out", - "dist" - ] + "exclude": ["node_modules", "cdk.out", "dist", "test"] } From 9f2f614673ba2da45d5e7989e60ec04907d1ecc4 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 6 Feb 2025 11:40:20 +0100 Subject: [PATCH 036/112] adding excluded folder fom build and eslint --- eslint.config.mjs | 4 ++++ tsconfig.json | 1 + 2 files changed, 5 insertions(+) diff --git a/eslint.config.mjs b/eslint.config.mjs index 0fc444e..a9f6154 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -72,6 +72,10 @@ export default [ "package-lock.json", "tsconfig.json", "typedoc.json", + "/dist/**", + "/docs/**", + "/test/**", + "/tmp/**", ], ...eslint.configs.recommended, }, diff --git a/tsconfig.json b/tsconfig.json index 91eb1e0..84f3817 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,5 +20,6 @@ "typeRoots": ["./node_modules/@types"], "outDir": "./dist" }, + "include": ["lib/**/*"], "exclude": ["node_modules", "cdk.out", "dist", "test"] } From 44adc1031a99a54ec739c81460e2d61600ce0db5 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 6 Feb 2025 15:37:32 +0100 Subject: [PATCH 037/112] cleanup and relocation of scripts and assets --- docker/alpine-zip/Dockerfile | 2 -- lib/index.ts | 2 +- source-repo/poky-ami/build.buildspec.yml | 6 ++++-- {scripts => source-repo/poky-ami}/create-ec2-ami.sh | 0 source-repo/{meta-aws-demo => qemu}/build.buildspec.yml | 0 tsconfig.json | 6 +++--- utils/build-assets.sh | 6 ------ 7 files changed, 8 insertions(+), 14 deletions(-) delete mode 100644 docker/alpine-zip/Dockerfile rename {scripts => source-repo/poky-ami}/create-ec2-ami.sh (100%) mode change 100755 => 100644 rename source-repo/{meta-aws-demo => qemu}/build.buildspec.yml (100%) diff --git a/docker/alpine-zip/Dockerfile b/docker/alpine-zip/Dockerfile deleted file mode 100644 index f052d86..0000000 --- a/docker/alpine-zip/Dockerfile +++ /dev/null @@ -1,2 +0,0 @@ -FROM alpine:latest -RUN apk --no-cache add zip \ No newline at end of file diff --git a/lib/index.ts b/lib/index.ts index 6e1229e..82f9e81 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -34,7 +34,7 @@ export enum ProjectType { /** Build core-image-minimal from poky. */ Poky = "poky", /** Build the Qemu meta-aws Demonstration Distribution. */ - MetaAwsDemo = "meta-aws-demo", + QEmu = "qemu", /** Build an EC2 AMI */ PokyAmi = "poky-ami", /** Build an kas based image */ diff --git a/source-repo/poky-ami/build.buildspec.yml b/source-repo/poky-ami/build.buildspec.yml index 11e1bd0..be2614a 100644 --- a/source-repo/poky-ami/build.buildspec.yml +++ b/source-repo/poky-ami/build.buildspec.yml @@ -56,12 +56,14 @@ phases: - 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 # 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 + - ./create-ec2-ami.sh $PIPELINE_OUTPUT_BUCKET 16 core-image-minimal aws-ec2-arm64 $TMP_DIR/tmp $VM_IMPORT_ROLE .rootfs # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - find /nfs/sstate-cache -atime +30 -type f -delete # only delete empty dirs diff --git a/scripts/create-ec2-ami.sh b/source-repo/poky-ami/create-ec2-ami.sh old mode 100755 new mode 100644 similarity index 100% rename from scripts/create-ec2-ami.sh rename to source-repo/poky-ami/create-ec2-ami.sh diff --git a/source-repo/meta-aws-demo/build.buildspec.yml b/source-repo/qemu/build.buildspec.yml similarity index 100% rename from source-repo/meta-aws-demo/build.buildspec.yml rename to source-repo/qemu/build.buildspec.yml diff --git a/tsconfig.json b/tsconfig.json index 84f3817..b8ce2fc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,8 +18,8 @@ "experimentalDecorators": true, "strictPropertyInitialization": false, "typeRoots": ["./node_modules/@types"], - "outDir": "./dist" + "outDir": "./dist", + "resolveJsonModule": true }, - "include": ["lib/**/*"], - "exclude": ["node_modules", "cdk.out", "dist", "test"] + "exclude": ["node_modules", "cdk.out", "dist"] } diff --git a/utils/build-assets.sh b/utils/build-assets.sh index 05d313e..187d93d 100755 --- a/utils/build-assets.sh +++ b/utils/build-assets.sh @@ -4,13 +4,7 @@ SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" WD="$SCRIPTPATH/.." - # copy the folders into th dist folder -if [ -d $WD/dist/docker ]; then rm -rf $WD/dist/docker; fi if [ -d $WD/dist/source-repo ]; then rm -rf $WD/dist/source-repo; fi - -mkdir -p $WD/dist/docker mkdir -p $WD/dist/source-repo - -cp -r $WD/docker $WD/dist cp -r $WD/source-repo $WD/dist From c3ccb0233a506c90efed16fae4c5a7a48bcf5dae Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 6 Feb 2025 15:38:31 +0100 Subject: [PATCH 038/112] variable renaming to improve readability --- lib/codepipeline-resources.ts | 106 ++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 51 deletions(-) diff --git a/lib/codepipeline-resources.ts b/lib/codepipeline-resources.ts index 1b067a1..dc64cc2 100644 --- a/lib/codepipeline-resources.ts +++ b/lib/codepipeline-resources.ts @@ -15,13 +15,13 @@ export interface PipelineResourcesProps extends cdk.StackProps { /** 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 artifactBucketName?: string; + readonly pipelineArtifactBucketName?: string; /** The source bucket name - if not provided then the name will be '{prefix}-{account}-{region}-source'*/ - readonly sourceRepositoryBucketName?: string; - /** The source bucket name - if not provided then the name will be '{prefix}-{account}-{region}-output'*/ + readonly pipelineSourceBucketName?: string; + /** The output bucket name - if not provided then the name will be '{prefix}-{account}-{region}-output'*/ readonly pipelineOutputBucketName?: string; - /** Access logging bucket name - if not provided then the name will be '{prefix}-{account}-{region}-logs'*/ - readonly accessLoggingBucketName?: string; + /** Cloudwatch logging bucket name - if not provided then the name will be '{prefix}-{account}-{region}-logs'*/ + readonly loggingBucketName?: string; } /** @@ -32,14 +32,14 @@ export class PipelineResourcesStack extends cdk.Stack { 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*/ - public readonly sourceRepositoryBucket: s3.IBucket; - /** the artifact bucket*/ - public readonly artifactBucket: s3.Bucket; - /** The access logging bucket to use*/ - public readonly accessLoggingBucket?: s3.Bucket; + readonly pipelineSourceBucket: s3.Bucket; /** The output bucket*/ - public readonly pipelineOutputBucket: s3.Bucket; + readonly pipelineOutputBucket: s3.Bucket; + /** The Cloudwatch logging bucket*/ + public readonly accessLoggingBucket?: s3.Bucket; /** The encryption key use across*/ public readonly encryptionKey: kms.Key; @@ -49,17 +49,17 @@ export class PipelineResourcesStack extends cdk.Stack { const ecrRepositoryName = props.ecrRepositoryName ? props.ecrRepositoryName : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-repo`.toLowerCase(); - const artifactBucketName = props.artifactBucketName - ? props.artifactBucketName + const pipelineArtifactBucketName = props.pipelineArtifactBucketName + ? props.pipelineArtifactBucketName : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-artifact`.toLowerCase(); - const sourceRepositoryBucketName = props.sourceRepositoryBucketName - ? props.sourceRepositoryBucketName + 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 accessLoggingBucketName = props.sourceRepositoryBucketName - ? props.sourceRepositoryBucketName + const loggingBucketName = props.loggingBucketName + ? props.loggingBucketName : `${props.resource_prefix}-${cdk.Stack.of(this).account}-${cdk.Stack.of(this).region}-access-logs`.toLowerCase(); // We will create a VPC with 3 Private and Public subnets for AWS @@ -98,9 +98,9 @@ export class PipelineResourcesStack extends cdk.Stack { // Create a bucket, then allow a deployment Lambda to upload to it. this.accessLoggingBucket = new s3.Bucket( this, - "PipelineResourcesAccessLoggingBucket", + "PipelineResourcesLoggingBucket", { - bucketName: accessLoggingBucketName, + bucketName: loggingBucketName, versioned: true, enforceSSL: true, autoDeleteObjects: true, @@ -109,22 +109,26 @@ export class PipelineResourcesStack extends cdk.Stack { }, ); - this.sourceRepositoryBucket = new s3.Bucket(this, "PipelineResourcesSourceBucket", { - bucketName: sourceRepositoryBucketName, - versioned: true, - enforceSSL: true, - autoDeleteObjects: true, - removalPolicy: cdk.RemovalPolicy.DESTROY, - encryptionKey: this.encryptionKey, - serverAccessLogsBucket: this.accessLoggingBucket, - serverAccessLogsPrefix: "source-bucket", - }); + this.pipelineSourceBucket = new s3.Bucket( + this, + "PipelineResourcesSourceBucket", + { + bucketName: pipelineSourceBucketName, + versioned: true, + enforceSSL: true, + autoDeleteObjects: true, + removalPolicy: cdk.RemovalPolicy.DESTROY, + encryptionKey: this.encryptionKey, + serverAccessLogsBucket: this.accessLoggingBucket, + serverAccessLogsPrefix: "source-bucket", + }, + ); - this.artifactBucket = new s3.Bucket( + this.pipelineArtifactBucket = new s3.Bucket( this, "PipelineResourcesArtifactBucket", { - bucketName: artifactBucketName, + bucketName: pipelineArtifactBucketName, versioned: true, enforceSSL: true, autoDeleteObjects: true, @@ -135,37 +139,37 @@ export class PipelineResourcesStack extends cdk.Stack { }, ); - this.pipelineOutputBucket = new s3.Bucket(this, "PipelineResourcesOutputBucket", { - bucketName: pipelineOutputBucketName, - versioned: true, - enforceSSL: true, - autoDeleteObjects: true, - removalPolicy: cdk.RemovalPolicy.DESTROY, - encryptionKey: this.encryptionKey, - serverAccessLogsBucket: this.accessLoggingBucket, - serverAccessLogsPrefix: "output-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.accessLoggingBucket, + serverAccessLogsPrefix: "output-bucket", + }, + ); - new cdk.CfnOutput(this, "OutputPipelineResourcesAccessLoggingBucket", { - exportName: "accessLoggingBucket", + new cdk.CfnOutput(this, "LoggingBucket", { value: this.accessLoggingBucket.bucketName, description: "The access logging bucket.", }); - new cdk.CfnOutput(this, "OutputPipelineResourcesSourceBucket", { - exportName: "sourceBucket", - value: this.sourceRepositoryBucket.bucketName, + new cdk.CfnOutput(this, "SourceBucket", { + value: this.pipelineSourceBucket.bucketName, description: "The source bucket.", }); - new cdk.CfnOutput(this, "OutputPipelineResourcesArtifactBucket", { - exportName: "artifactBucket", - value: this.artifactBucket.bucketName, + new cdk.CfnOutput(this, "ArtifactBucket", { + value: this.pipelineArtifactBucket.bucketName, description: "The artifact bucket.", }); - new cdk.CfnOutput(this, "OutputPipelineResourcesOutputBucket", { - exportName: "outputBucket", + new cdk.CfnOutput(this, "OutputBucket", { value: this.pipelineOutputBucket.bucketName, description: "The output bucket.", }); From 8a5e03a394540245fbd9e52689f753a4696abb57 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 6 Feb 2025 16:50:14 +0100 Subject: [PATCH 039/112] - variable renaming to improve readability - removed use of custom S3 Bucket object for VM Import (enabled by design if needed) - updating nag snapshots --- lib/codepipeline-embedded-linux-base-image.ts | 61 ++- lib/codepipeline-embedded-linux.ts | 323 +++++++++------ lib/codepipeline-resources.ts | 2 +- lib/index.ts | 9 - ...ine-embedded-linux-base-image.test.ts.snap | 31 +- .../codepipeline-embedded-linux.test.ts.snap | 322 +++++++++++++-- .../codepipeline-resources.test.ts.snap | 382 +++--------------- ...line-embedded-linux-base-image-nag.test.ts | 20 +- ...pipeline-embedded-linux-base-image.test.ts | 4 +- test/codepipeline-embedded-linux-nag.test.ts | 52 ++- test/codepipeline-embedded-linux.test.ts | 17 +- test/codepipeline-resources-nag.test.ts | 51 ++- test/codepipeline-resources.test.ts | 3 +- 13 files changed, 681 insertions(+), 596 deletions(-) diff --git a/lib/codepipeline-embedded-linux-base-image.ts b/lib/codepipeline-embedded-linux-base-image.ts index be85ae2..4dd8e05 100644 --- a/lib/codepipeline-embedded-linux-base-image.ts +++ b/lib/codepipeline-embedded-linux-base-image.ts @@ -2,7 +2,7 @@ import * as path from "path"; import * as cdk from "aws-cdk-lib"; import { Construct } from "constructs"; -import { BucketDeployment, Source, DeployTimeSubstitutedFile } from "aws-cdk-lib/aws-s3-deployment"; +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"; @@ -20,12 +20,14 @@ import * as kms from "aws-cdk-lib/aws-kms"; */ export interface EmbeddedLinuxCodePipelineBaseImageProps extends cdk.StackProps { - /** The source bucket */ - readonly sourceRepositoryBucket: s3.IBucket; + /** 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; - /** Artifact bucket to use */ - readonly artifactBucket: s3.Bucket; /** The encryption key use across*/ readonly encryptionKey: kms.Key; } @@ -51,12 +53,15 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { this.ecrRepository = props.ecrRepository; this.ecrRepositoryImageTag = `${id}`; + + const projectType: string = "base-image"; - const sourceRepoBase: string = "base-image"; - const sourceRepoPath: string = `source-repo/${sourceRepoBase}`; + if (!props.pipelineSourcePrefix) { + props.pipelineSourcePrefix = `${projectType}`; + } // create the policy & role for the source bucket deployment - const sourceRepositoryBucketDeploymentPolicy = new iam.PolicyDocument({ + const pipelineSourceBucketDeploymentPolicy = new iam.PolicyDocument({ statements: [ new iam.PolicyStatement({ actions: [ @@ -70,30 +75,23 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { }), ], }); - const sourceRepositoryBucketDeploymentRole = new iam.Role( + const pipelineSourceBucketDeploymentRole = new iam.Role( this, "CodePipelineBuildBaseImageBucketDeploymentRole", { assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"), - inlinePolicies: { sourceRepositoryBucketDeploymentPolicy }, + inlinePolicies: { pipelineSourceBucketDeploymentPolicy }, }, ); // archive and upload the source-repo folder into CDK owned bucket - let sourceRepoAsset: Asset = new Asset(this, "CodePipelineBuildBaseImageBucketDeploymentAsset", { - path: path.join(__dirname, "..", sourceRepoPath), - bundling: { - image: cdk.DockerImage.fromBuild(path.join(__dirname, "..", "docker", "alpine-zip")), - command: [ - 'sh', '-c', [ - `cd /asset-input`, - `chmod a+w /asset-output`, - `zip -q -o /asset-output/source-${sourceRepoBase}.zip -r *`, - ].join(' && '), - ], - outputType: cdk.BundlingOutput.SINGLE_FILE, // Bundling output will be zipped even though it produces a single archive file. + 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( @@ -103,10 +101,10 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { sources: [ Source.bucket(sourceRepoAsset.bucket, sourceRepoAsset.s3ObjectKey), ], - destinationBucket: props.sourceRepositoryBucket, - role: sourceRepositoryBucketDeploymentRole, + destinationBucket: props.pipelineSourceBucket, + role: pipelineSourceBucketDeploymentRole, extract: false, - destinationKeyPrefix: sourceRepoPath, + destinationKeyPrefix: props.pipelineSourcePrefix, }, ); @@ -116,8 +114,8 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { actionName: "Source", trigger: codepipeline_actions.S3Trigger.EVENTS, output: sourceActionOutputArtifact, - bucket: props.sourceRepositoryBucket, - bucketKey: `${sourceRepoPath}/${sourceRepoAsset.s3ObjectKey}`, + bucket: props.pipelineSourceBucket, + bucketKey: `${props.pipelineSourcePrefix}/${sourceRepoAsset.s3ObjectKey}`, }); /** Create our CodeCodePipeline Project. */ @@ -179,7 +177,7 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { this, "CodePipelineBuildBaseImageCodePipeline", { - artifactBucket: props.artifactBucket, + artifactBucket: props.pipelineArtifactBucket, pipelineName: `${this.ecrRepositoryImageTag}`, pipelineType: codepipeline.PipelineType.V1, stages: [ @@ -223,9 +221,8 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { description: "The AWS CLI command to check if the ECR Image was pushed", }); - // Add stack output for the source-repo bucket uri for this pipeline - new cdk.CfnOutput(this, "BuildSource", { - value: `s3://${props.sourceRepositoryBucket.bucketName}/${sourceRepoPath}/${sourceRepoAsset.s3ObjectKey}`, + 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 index 9f9e9f0..5aa1243 100644 --- a/lib/codepipeline-embedded-linux.ts +++ b/lib/codepipeline-embedded-linux.ts @@ -17,31 +17,38 @@ 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 { VMImportBucket } from "./vm-import-bucket"; -import { ProjectKind } from "."; +import { ProjectType } from "."; /** * Properties to allow customizing the build. */ export interface EmbeddedLinuxCodePipelineProps extends cdk.StackProps { - /** The source bucket */ - readonly sourceBucket: s3.IBucket; + /** 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; - /** Artifact bucket to use */ - readonly artifactBucket: s3.Bucket; - /** Output bucket to use */ - readonly outputBucket: s3.Bucket | VMImportBucket; /** The type of project being built. */ - readonly projectKind: ProjectKind; + readonly projectType: ProjectType; /** VPC where the networking setup resides. */ readonly vpc: ec2.IVpc; - /** Prefix for S3 object within bucket */ - readonly artifactOutputObjectKey?: string; /** 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; } @@ -59,16 +66,15 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { ) { super(scope, id, props); - if (props.projectKind && props.projectKind == ProjectKind.PokyAmi) { - if (!(props.outputBucket instanceof VMImportBucket)) { - throw "The 'outputBucket' property provided in [EmbeddedLinuxCodePipelineProps] is not of type [VMImportBucket] when using prokect kind [PokyAmi]"; - } + if (!props.pipelineSourcePrefix) { + props.pipelineSourcePrefix = `${props.projectType}`; + } + if (!props.pipelineArtifactPrefix) { + props.pipelineArtifactPrefix = `${props.projectType}`; + } + if (!props.pipelineOutputPrefix) { + props.pipelineOutputPrefix = `${props.projectType}`; } - - const sourceBase: string = `${props.projectKind}`; - const sourceFileName: string = `source-${sourceBase}.zip`; - const sourceLocalPath: string = `source-zip/${sourceBase}`; - const sourceDestinationKeyPrefix: string = `source/${sourceBase}`; /** Set up networking access and EFS FileSystems. */ const projectSg = new ec2.SecurityGroup( @@ -96,7 +102,7 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { efsFileSystem.connections.allowFrom(projectSg, ec2.Port.tcp(2049)); // create the policy & role for the source bucket deployment - const sourceBucketDeploymentPolicy = new iam.PolicyDocument({ + const pipelineSourceBucketDeploymentPolicy = new iam.PolicyDocument({ statements: [ new iam.PolicyStatement({ actions: [ @@ -105,68 +111,58 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { "logs:PutLogEvents", ], resources: [ - `arn:aws:logs:${cdk.Stack.of(this).region}:${cdk.Stack.of(this).account}:log-group:/aws/lambda/EmbeddedLinuxCodePipeline-CustomCDKBucketDeployment-${props.projectKind}*`, + `arn:aws:logs:${cdk.Stack.of(this).region}:${cdk.Stack.of(this).account}:log-group:/aws/lambda/EmbeddedLinuxCodePipelineBaseImage-CustomCDKBucketDeployment*`, ], }), ], }); - const sourceBucketDeploymentRole = new iam.Role( + const pipelineSourceBucketDeploymentRole = new iam.Role( this, "EmbeddedLinuxCodePipelineBucketDeploymentRole", { assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"), - inlinePolicies: { sourceBucketDeploymentPolicy }, + inlinePolicies: { pipelineSourceBucketDeploymentPolicy }, + }, + ); + + // archive and upload the source-repo folder into CDK owned bucket + const sourceRepoAsset: Asset = new Asset( + this, + "EmbeddedLinuxCodePipelineBucketDeploymentAsset", + { + path: path.join(__dirname, "..", "source-repo", props.projectType), }, ); - // deploy the source to the bucket + // deploy the sourceRepo to the bucket const bucketDeployment = new BucketDeployment( this, "EmbeddedLinuxCodePipelineBucketDeployment", { - // Note: Run `npm run zip-data` before deploying this stack! - sources: [Source.asset(path.join(__dirname, "..", sourceLocalPath))], - destinationBucket: props.sourceBucket, - role: sourceBucketDeploymentRole, - extract: true, - destinationKeyPrefix: sourceDestinationKeyPrefix, + sources: [ + Source.bucket(sourceRepoAsset.bucket, sourceRepoAsset.s3ObjectKey), + ], + destinationBucket: props.pipelineSourceBucket, + role: pipelineSourceBucketDeploymentRole, + extract: false, + destinationKeyPrefix: props.pipelineSourcePrefix, }, ); - let environmentVariables = {}; - let scriptAsset!: Asset; - - if (props.projectKind && props.projectKind == ProjectKind.PokyAmi) { - scriptAsset = new Asset(this, "CreateAMIScript", { - path: path.join(__dirname, "../scripts/create-ec2-ami.sh"), - }); - - environmentVariables = { - IMPORT_BUCKET: { - type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, - value: props.outputBucket.bucketName, - }, - ROLE_NAME: { - type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, - value: (props.outputBucket as VMImportBucket).roleName, - }, - SCRIPT_URL: { - type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, - value: scriptAsset.s3ObjectUrl, - }, - }; - } - /** Create our CodeCodePipeline Actions. */ - const sourceOutput = new codepipeline.Artifact("Source"); + const sourceActionOutputArtifact = new codepipeline.Artifact("Source"); const sourceAction = new codepipeline_actions.S3SourceAction({ actionName: "Source", trigger: codepipeline_actions.S3Trigger.EVENTS, - output: sourceOutput, - bucket: props.sourceBucket, - bucketKey: `${sourceDestinationKeyPrefix}/${sourceFileName}`, + 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", @@ -183,7 +179,7 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { ), privileged: true, environmentVariables: { - ...environmentVariables, + ...props.environmentVariables, AWS_ACCOUNT_ID: { type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, value: cdk.Stack.of(this).account, @@ -192,6 +188,18 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { type: codebuild.BuildEnvironmentVariableType.PLAINTEXT, value: cdk.Stack.of(this).region, }, + 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), @@ -226,57 +234,25 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { props.buildPolicyAdditions.map((p) => project.addToRolePolicy(p)); } - if (props.projectKind && props.projectKind == ProjectKind.PokyAmi) { - props.outputBucket.grantReadWrite(project); - project.addToRolePolicy(this.addVMExportPolicy()); - - 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( - this.addAMIS3BackupPolicy(props.outputBucket.bucketArn), - ); - project.addToRolePolicy( - this.addAMIEC2EBSBackupPolicy(cdk.Stack.of(this).region), - ); - project.addToRolePolicy( - this.addAMIEBSBackupPolicy(cdk.Stack.of(this).region), - ); - project.addToRolePolicy(this.addAMIBackupPolicy()); - scriptAsset.grantRead(project); - } + // 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 buildOutput = new codepipeline.Artifact(); + const buildActionOutputArtifact = new codepipeline.Artifact(); const buildAction = new codepipeline_actions.CodeBuildAction({ - input: sourceOutput, + input: sourceActionOutputArtifact, actionName: "Build", - outputs: [buildOutput], + outputs: [buildActionOutputArtifact], project, }); - let artifactAction: codepipeline_actions.S3DeployAction; - - if (props.artifactOutputObjectKey) { - artifactAction = new codepipeline_actions.S3DeployAction({ - actionName: "Artifact", - input: buildOutput, - bucket: props.outputBucket, - objectKey: props.artifactOutputObjectKey, - }); - } else { - artifactAction = new codepipeline_actions.S3DeployAction({ + const artifactAction: codepipeline_actions.S3DeployAction = + new codepipeline_actions.S3DeployAction({ actionName: "Artifact", - input: buildOutput, - bucket: props.outputBucket, + 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. */ @@ -287,26 +263,26 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { 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.') - `), + 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, }, ); @@ -337,7 +313,7 @@ def handler(event, context): "EmbeddedLinuxCodePipeline", { pipelineName: `${id}`, - artifactBucket: props.artifactBucket, + artifactBucket: props.pipelineArtifactBucket, restartExecutionOnUpdate: true, pipelineType: codepipeline.PipelineType.V1, stages: [ @@ -384,15 +360,104 @@ def handler(event, context): targets: [pipelineTarget], }); - new cdk.CfnOutput(this, "BuildSource", { - value: `s3://${props.sourceBucket.bucketName}/${sourceDestinationKeyPrefix}/${sourceFileName}`, - description: "The source bucket key of this pipeline.", + // 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, "BuildOutput", { - value: props.outputBucket.bucketName, + 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(this.addVMExportPolicy()); + 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( + this.addAMIS3BackupPolicy(props.pipelineOutputBucket.bucketArn), + ); + project.addToRolePolicy( + this.addAMIEC2EBSBackupPolicy(cdk.Stack.of(this).region), + ); + project.addToRolePolicy( + this.addAMIEBSBackupPolicy(cdk.Stack.of(this).region), + ); + project.addToRolePolicy(this.addAMIBackupPolicy()); } private addVMExportPolicy(): iam.PolicyStatement { diff --git a/lib/codepipeline-resources.ts b/lib/codepipeline-resources.ts index dc64cc2..9d29ee3 100644 --- a/lib/codepipeline-resources.ts +++ b/lib/codepipeline-resources.ts @@ -60,7 +60,7 @@ export class PipelineResourcesStack extends cdk.Stack { : `${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}-access-logs`.toLowerCase(); + : `${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 diff --git a/lib/index.ts b/lib/index.ts index 82f9e81..e897a4a 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -5,15 +5,6 @@ export * from "./codepipeline-embedded-linux-base-image"; export * from "./codepipeline-embedded-linux"; export * from "./codepipeline-resources"; -export * from "./deprecated/network"; -export * from "./deprecated/build-image-data"; -export * from "./deprecated/build-image-repo"; -export * from "./deprecated/build-image-pipeline"; -export * from "./deprecated/embedded-linux-pipeline"; -export * from "./deprecated/embedded-linux-codebuild-project"; -export * from "./deprecated/vm-import-bucket"; -export * from "./deprecated/constructs/source-repo"; - export function isBucketVersioned(bucket: s3.Bucket | s3.IBucket) { const bucketCfn: s3.CfnBucket = bucket.node.defaultChild as s3.CfnBucket; if ( diff --git a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap index 1f9147f..9707429 100644 --- a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap @@ -28,6 +28,21 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "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": { @@ -50,11 +65,11 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "CodePipelineBuildBaseImageBucketDeploymentCustomResource9FCDB7FE": { "DeletionPolicy": "Delete", "Properties": { - "DestinationBucketKeyPrefix": "source/base-image", + "DestinationBucketKeyPrefix": "base-image", "DestinationBucketName": { "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", }, - "Extract": true, + "Extract": false, "OutputObjectKeys": true, "Prune": true, "ServiceToken": { @@ -103,7 +118,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` ], "Version": "2012-10-17", }, - "PolicyName": "sourceBucketDeploymentPolicy", + "PolicyName": "pipelineSourceBucketDeploymentPolicy", }, ], }, @@ -257,7 +272,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "S3Bucket": { "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", }, - "S3ObjectKey": "source/base-image/source-base-image.zip", + "S3ObjectKey": "base-image/arbitrary-file.ext", }, "Name": "Source", "OutputArtifacts": [ @@ -441,7 +456,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, "Type": "AWS::IAM::Policy", }, - "CodePipelineBuildBaseImageCodePipelineMyTestStackCodePipelineBuildBaseImageCodePipelineFF25ACC6SourceEventRulesourcebaseimagesourcebaseimagezip4051FAE5": { + "CodePipelineBuildBaseImageCodePipelineMyTestStackCodePipelineBuildBaseImageCodePipelineFF25ACC6SourceEventRulebaseimage463ab4e34f1fc19129697c4ba70a2910697e6f4dc82b08fdabb32f2eed60a01fzip4059CF7E": { "DependsOn": [ "CodePipelineBuildBaseImageProject69590E59", "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", @@ -462,7 +477,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], "key": [ - "source/base-image/source-base-image.zip", + "base-image/arbitrary-file.ext", ], }, "resources": { @@ -474,7 +489,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` { "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", }, - "/source/base-image/source-base-image.zip", + "/base-image/arbitrary-file.ext", ], ], }, @@ -685,7 +700,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` { "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", }, - "/source/base-image/source-base-image.zip", + "/base-image/arbitrary-file.ext", ], ], }, diff --git a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap index bb5dbd1..16036a5 100644 --- a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap @@ -3,14 +3,38 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` { "Outputs": { - "BuildOutput": { + "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::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesOutputBucketA2144F25070A0F1C", + "Fn::Join": [ + "", + [ + "s3://", + { + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesOutputBucketA2144F25070A0F1C", + }, + "/poky", + ], + ], }, }, - "BuildSource": { - "Description": "The source bucket key of this pipeline.", + "SourceURI": { + "Description": "The source bucket uri for this pipeline.", "Value": { "Fn::Join": [ "", @@ -19,7 +43,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` { "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", }, - "/source/poky/source-poky.zip", + "/poky/arbitrary-file.ext", ], ], }, @@ -111,7 +135,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "S3Bucket": { "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", }, - "S3ObjectKey": "source/poky/source-poky.zip", + "S3ObjectKey": "poky/arbitrary-file.ext", }, "Name": "Source", "OutputArtifacts": [ @@ -177,10 +201,10 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "Configuration": { "BucketName": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesOutputBucketA2144F25070A0F1C", + "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesArtifactBucketFF61EB98FA6EAAC1", }, "Extract": "true", - "ObjectKey": "pipeline-poky", + "ObjectKey": "poky/arbitrary-file.ext", }, "InputArtifacts": [ { @@ -260,14 +284,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", }, "/*", ], @@ -346,11 +370,11 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "EmbeddedLinuxCodePipelineBucketDeploymentCustomResourceBA39990C": { "DeletionPolicy": "Delete", "Properties": { - "DestinationBucketKeyPrefix": "source/poky", + "DestinationBucketKeyPrefix": "poky", "DestinationBucketName": { "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", }, - "Extract": true, + "Extract": false, "OutputObjectKeys": true, "Prune": true, "ServiceToken": { @@ -394,12 +418,12 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "logs:PutLogEvents", ], "Effect": "Allow", - "Resource": "arn:aws:logs:eu-central-1:111111111111:log-group:/aws/lambda/EmbeddedLinuxCodePipeline-CustomCDKBucketDeployment-poky*", + "Resource": "arn:aws:logs:eu-central-1:111111111111:log-group:/aws/lambda/EmbeddedLinuxCodePipelineBaseImage-CustomCDKBucketDeployment*", }, ], "Version": "2012-10-17", }, - "PolicyName": "sourceBucketDeploymentPolicy", + "PolicyName": "pipelineSourceBucketDeploymentPolicy", }, ], }, @@ -816,7 +840,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "Type": "AWS::EC2::SecurityGroupIngress", }, - "EmbeddedLinuxCodePipelineMyTestStackEmbeddedLinuxCodePipelineE5C7D172SourceEventRulesourcepokysourcepokyzip2B36EB88": { + "EmbeddedLinuxCodePipelineMyTestStackEmbeddedLinuxCodePipelineE5C7D172SourceEventRulepoky2c3284e71ba6f2c28421a26a63b3f77e74abad491196ba63ec03dfb5b8674f59zipE030E80D": { "DependsOn": [ "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", "EmbeddedLinuxCodePipelineProjectF55E3B36", @@ -838,7 +862,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], "key": [ - "source/poky/source-poky.zip", + "poky/arbitrary-file.ext", ], }, "resources": { @@ -850,7 +874,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` { "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", }, - "/source/poky/source-poky.zip", + "/poky/arbitrary-file.ext", ], ], }, @@ -905,30 +929,30 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "", [ " -import boto3 -import json + import boto3 + import json -ecr_client = boto3.client('ecr') -codepipeline_client = boto3.client('codepipeline') + 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='", + 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.') - ", + 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.') + ", ], ], }, @@ -1081,6 +1105,25 @@ def handler(event, context): "Type": "PLAINTEXT", "Value": "eu-central-1", }, + { + "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": [ @@ -1468,14 +1511,14 @@ def handler(event, context): "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", }, "/*", ], @@ -1496,6 +1539,115 @@ def handler(event, context): "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", }, @@ -1710,7 +1862,7 @@ def handler(event, context): { "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", }, - "/source/poky/source-poky.zip", + "/poky/arbitrary-file.ext", ], ], }, @@ -1778,6 +1930,100 @@ def handler(event, context): }, "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 *)", diff --git a/test/__snapshots__/codepipeline-resources.test.ts.snap b/test/__snapshots__/codepipeline-resources.test.ts.snap index be77083..78df388 100644 --- a/test/__snapshots__/codepipeline-resources.test.ts.snap +++ b/test/__snapshots__/codepipeline-resources.test.ts.snap @@ -3,47 +3,26 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` { "Outputs": { - "OutputPipelineResourcesAccessLoggingBucket": { - "Description": "The access logging bucket.", - "Export": { - "Name": "accessLoggingBucket", - }, - "Value": { - "Ref": "PipelineResourcesAccessLoggingBucket66A74BE5", - }, - }, - "OutputPipelineResourcesArtifactBucket": { + "ArtifactBucket": { "Description": "The artifact bucket.", - "Export": { - "Name": "artifactBucket", - }, "Value": { "Ref": "PipelineResourcesArtifactBucketFF61EB98", }, }, - "OutputPipelineResourcesOutputBucket": { - "Description": "The output bucket.", - "Export": { - "Name": "outputBucket", - }, + "LoggingBucket": { + "Description": "The access logging bucket.", "Value": { - "Ref": "PipelineResourcesOutputBucketA2144F25", + "Ref": "PipelineResourcesLoggingBucketD957F175", }, }, - "OutputPipelineResourcesOutputVMImportBuckett": { - "Description": "The output VM import bucket.", - "Export": { - "Name": "outputVMImportBucket", - }, + "OutputBucket": { + "Description": "The output bucket.", "Value": { - "Ref": "PipelineResourcesOutputVMImportBucket410130C7", + "Ref": "PipelineResourcesOutputBucketA2144F25", }, }, - "OutputPipelineResourcesSourceBucket": { + "SourceBucket": { "Description": "The source bucket.", - "Export": { - "Name": "sourceBucket", - }, "Value": { "Ref": "PipelineResourcesSourceBucket1FA488F5", }, @@ -72,7 +51,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` [ "Lambda function for auto-deleting objects in ", { - "Ref": "PipelineResourcesAccessLoggingBucket66A74BE5", + "Ref": "PipelineResourcesLoggingBucketD957F175", }, " S3 bucket.", ], @@ -113,151 +92,6 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, "Type": "AWS::IAM::Role", }, - "PipelineResourcesAccessLoggingBucket66A74BE5": { - "DeletionPolicy": "Delete", - "Properties": { - "AccessControl": "LogDeliveryWrite", - "BucketEncryption": { - "ServerSideEncryptionConfiguration": [ - { - "ServerSideEncryptionByDefault": { - "KMSMasterKeyID": { - "Fn::GetAtt": [ - "PipelineResourcesArtifactKey368D3018", - "Arn", - ], - }, - "SSEAlgorithm": "aws:kms", - }, - }, - ], - }, - "BucketName": "test-111111111111-eu-central-1-access-logs", - "OwnershipControls": { - "Rules": [ - { - "ObjectOwnership": "ObjectWriter", - }, - ], - }, - "Tags": [ - { - "Key": "aws-cdk:auto-delete-objects", - "Value": "true", - }, - ], - "VersioningConfiguration": { - "Status": "Enabled", - }, - }, - "Type": "AWS::S3::Bucket", - "UpdateReplacePolicy": "Delete", - }, - "PipelineResourcesAccessLoggingBucketAutoDeleteObjectsCustomResource32A88A27": { - "DeletionPolicy": "Delete", - "DependsOn": [ - "PipelineResourcesAccessLoggingBucketPolicyF9B77CD5", - ], - "Properties": { - "BucketName": { - "Ref": "PipelineResourcesAccessLoggingBucket66A74BE5", - }, - "ServiceToken": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F", - "Arn", - ], - }, - }, - "Type": "Custom::S3AutoDeleteObjects", - "UpdateReplacePolicy": "Delete", - }, - "PipelineResourcesAccessLoggingBucketPolicyF9B77CD5": { - "Properties": { - "Bucket": { - "Ref": "PipelineResourcesAccessLoggingBucket66A74BE5", - }, - "PolicyDocument": { - "Statement": [ - { - "Action": "s3:*", - "Condition": { - "Bool": { - "aws:SecureTransport": "false", - }, - }, - "Effect": "Deny", - "Principal": { - "AWS": "*", - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineResourcesAccessLoggingBucket66A74BE5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineResourcesAccessLoggingBucket66A74BE5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - { - "Action": [ - "s3:PutBucketPolicy", - "s3:GetBucket*", - "s3:List*", - "s3:DeleteObject*", - ], - "Effect": "Allow", - "Principal": { - "AWS": { - "Fn::GetAtt": [ - "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092", - "Arn", - ], - }, - }, - "Resource": [ - { - "Fn::GetAtt": [ - "PipelineResourcesAccessLoggingBucket66A74BE5", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineResourcesAccessLoggingBucket66A74BE5", - "Arn", - ], - }, - "/*", - ], - ], - }, - ], - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::S3::BucketPolicy", - }, "PipelineResourcesArtifactBucketAutoDeleteObjectsCustomResource92CEB6DD": { "DeletionPolicy": "Delete", "DependsOn": [ @@ -298,7 +132,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "BucketName": "test-111111111111-eu-central-1-artifact", "LoggingConfiguration": { "DestinationBucketName": { - "Ref": "PipelineResourcesAccessLoggingBucket66A74BE5", + "Ref": "PipelineResourcesLoggingBucketD957F175", }, "LogFilePrefix": "artifact-bucket", }, @@ -455,9 +289,29 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Type": "AWS::ECR::Repository", "UpdateReplacePolicy": "Delete", }, - "PipelineResourcesOutputBucketA2144F25": { + "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": [ { @@ -473,12 +327,13 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, ], }, - "BucketName": "test-111111111111-eu-central-1-output", - "LoggingConfiguration": { - "DestinationBucketName": { - "Ref": "PipelineResourcesAccessLoggingBucket66A74BE5", - }, - "LogFilePrefix": "output-bucket", + "BucketName": "test-111111111111-eu-central-1-logs", + "OwnershipControls": { + "Rules": [ + { + "ObjectOwnership": "ObjectWriter", + }, + ], }, "Tags": [ { @@ -493,29 +348,10 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "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": { + "PipelineResourcesLoggingBucketPolicy520659AE": { "Properties": { "Bucket": { - "Ref": "PipelineResourcesOutputBucketA2144F25", + "Ref": "PipelineResourcesLoggingBucketD957F175", }, "PolicyDocument": { "Statement": [ @@ -533,7 +369,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Resource": [ { "Fn::GetAtt": [ - "PipelineResourcesOutputBucketA2144F25", + "PipelineResourcesLoggingBucketD957F175", "Arn", ], }, @@ -543,7 +379,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` [ { "Fn::GetAtt": [ - "PipelineResourcesOutputBucketA2144F25", + "PipelineResourcesLoggingBucketD957F175", "Arn", ], }, @@ -572,7 +408,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Resource": [ { "Fn::GetAtt": [ - "PipelineResourcesOutputBucketA2144F25", + "PipelineResourcesLoggingBucketD957F175", "Arn", ], }, @@ -582,7 +418,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` [ { "Fn::GetAtt": [ - "PipelineResourcesOutputBucketA2144F25", + "PipelineResourcesLoggingBucketD957F175", "Arn", ], }, @@ -598,7 +434,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, "Type": "AWS::S3::BucketPolicy", }, - "PipelineResourcesOutputVMImportBucket410130C7": { + "PipelineResourcesOutputBucketA2144F25": { "DeletionPolicy": "Delete", "Properties": { "BucketEncryption": { @@ -616,12 +452,12 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, ], }, - "BucketName": "test-111111111111-eu-central-1-output-vm", + "BucketName": "test-111111111111-eu-central-1-output", "LoggingConfiguration": { "DestinationBucketName": { - "Ref": "PipelineResourcesAccessLoggingBucket66A74BE5", + "Ref": "PipelineResourcesLoggingBucketD957F175", }, - "LogFilePrefix": "output-vm-import-bucket", + "LogFilePrefix": "output-bucket", }, "Tags": [ { @@ -636,14 +472,14 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Delete", }, - "PipelineResourcesOutputVMImportBucketAutoDeleteObjectsCustomResource630CC98A": { + "PipelineResourcesOutputBucketAutoDeleteObjectsCustomResource5A511D2C": { "DeletionPolicy": "Delete", "DependsOn": [ - "PipelineResourcesOutputVMImportBucketPolicy8034D299", + "PipelineResourcesOutputBucketPolicyAE7D91E7", ], "Properties": { "BucketName": { - "Ref": "PipelineResourcesOutputVMImportBucket410130C7", + "Ref": "PipelineResourcesOutputBucketA2144F25", }, "ServiceToken": { "Fn::GetAtt": [ @@ -655,10 +491,10 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Type": "Custom::S3AutoDeleteObjects", "UpdateReplacePolicy": "Delete", }, - "PipelineResourcesOutputVMImportBucketPolicy8034D299": { + "PipelineResourcesOutputBucketPolicyAE7D91E7": { "Properties": { "Bucket": { - "Ref": "PipelineResourcesOutputVMImportBucket410130C7", + "Ref": "PipelineResourcesOutputBucketA2144F25", }, "PolicyDocument": { "Statement": [ @@ -676,7 +512,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Resource": [ { "Fn::GetAtt": [ - "PipelineResourcesOutputVMImportBucket410130C7", + "PipelineResourcesOutputBucketA2144F25", "Arn", ], }, @@ -686,7 +522,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` [ { "Fn::GetAtt": [ - "PipelineResourcesOutputVMImportBucket410130C7", + "PipelineResourcesOutputBucketA2144F25", "Arn", ], }, @@ -715,7 +551,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Resource": [ { "Fn::GetAtt": [ - "PipelineResourcesOutputVMImportBucket410130C7", + "PipelineResourcesOutputBucketA2144F25", "Arn", ], }, @@ -725,7 +561,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` [ { "Fn::GetAtt": [ - "PipelineResourcesOutputVMImportBucket410130C7", + "PipelineResourcesOutputBucketA2144F25", "Arn", ], }, @@ -762,7 +598,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "BucketName": "test-111111111111-eu-central-1-source", "LoggingConfiguration": { "DestinationBucketName": { - "Ref": "PipelineResourcesAccessLoggingBucket66A74BE5", + "Ref": "PipelineResourcesLoggingBucketD957F175", }, "LogFilePrefix": "source-bucket", }, @@ -1508,108 +1344,6 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, "Type": "AWS::EC2::VPCGatewayAttachment", }, - "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": [ - "PipelineResourcesOutputVMImportBucket410130C7", - "Arn", - ], - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "PipelineResourcesOutputVMImportBucket410130C7", - "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": [ - "PipelineResourcesArtifactKey368D3018", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "importPolicy", - }, - ], - }, - "Type": "AWS::IAM::Role", - }, }, "Rules": { "CheckBootstrapVersion": { diff --git a/test/codepipeline-embedded-linux-base-image-nag.test.ts b/test/codepipeline-embedded-linux-base-image-nag.test.ts index f533839..c9e34bf 100644 --- a/test/codepipeline-embedded-linux-base-image-nag.test.ts +++ b/test/codepipeline-embedded-linux-base-image-nag.test.ts @@ -4,7 +4,7 @@ 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 { EmbeddedLinuxCodePipelineBaseImageStack } from "../lib/codepipeline-embedded-linux-base-image"; +import { EmbeddedLinuxCodePipelineBaseImageProps, EmbeddedLinuxCodePipelineBaseImageStack } from "../lib/codepipeline-embedded-linux-base-image"; import { DEFAULT_ENV } from "./util"; function addNagSuppressions(stack: cdk.Stack) { @@ -87,17 +87,21 @@ describe("EmbeddedLinuxCodePipelineBaseImageStack cdk-nag AwsSolutions Pack", () removalPolicy: cdk.RemovalPolicy.DESTROY, enableKeyRotation: true, }); - const sourceBucket = new s3.Bucket(baseStack, "SourceBucket", { - versioned: true, - }); - const artifactBucket = new s3.Bucket(baseStack, "ArtifactBucket", {}); + 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 = { + const props : EmbeddedLinuxCodePipelineBaseImageProps = { env: DEFAULT_ENV, - sourceBucket: sourceBucket, + pipelineSourceBucket: pipelineSourceBucket, + pipelineArtifactBucket: pipelineArtifactBucket, ecrRepository: ecrRepository, - artifactBucket: artifactBucket, encryptionKey: encryptionKey, }; diff --git a/test/codepipeline-embedded-linux-base-image.test.ts b/test/codepipeline-embedded-linux-base-image.test.ts index 0d896fd..9679efa 100644 --- a/test/codepipeline-embedded-linux-base-image.test.ts +++ b/test/codepipeline-embedded-linux-base-image.test.ts @@ -34,9 +34,9 @@ describe("EmbeddedLinuxCodePipelineBaseImageStack", () => { const embeddedLinuxCodePipelineBaseImageProps: EmbeddedLinuxCodePipelineBaseImageProps = { env: DEFAULT_ENV, - sourceBucket: pipelineResourcesStack.sourceBucket, + pipelineSourceBucket: pipelineResourcesStack.pipelineSourceBucket, + pipelineArtifactBucket: pipelineResourcesStack.pipelineArtifactBucket, ecrRepository: pipelineResourcesStack.ecrRepository, - artifactBucket: pipelineResourcesStack.artifactBucket, encryptionKey: pipelineResourcesStack.encryptionKey, }; stack = new EmbeddedLinuxCodePipelineBaseImageStack( diff --git a/test/codepipeline-embedded-linux-nag.test.ts b/test/codepipeline-embedded-linux-nag.test.ts index 392f780..cbb32a8 100644 --- a/test/codepipeline-embedded-linux-nag.test.ts +++ b/test/codepipeline-embedded-linux-nag.test.ts @@ -7,9 +7,8 @@ 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 { ProjectKind } from "../lib"; +import { ProjectType } from "../lib"; import { DEFAULT_ENV } from "./util"; -import { VMImportBucket } from "../lib/vm-import-bucket"; function addNagSuppressions(stack: cdk.Stack) { NagSuppressions.addStackSuppressions(stack, [ @@ -131,6 +130,30 @@ function addNagSuppressions(stack: cdk.Stack) { }, ], ); + 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", () => { @@ -146,31 +169,30 @@ describe("EmbeddedLinuxCodePipelineStack cdk-nag AwsSolutions Pack", () => { removalPolicy: cdk.RemovalPolicy.DESTROY, enableKeyRotation: true, }); - const sourceBucket = new s3.Bucket(baseStack, "SourceBucket", { - versioned: true, - }); - const artifactBucket = new s3.Bucket(baseStack, "ArtifactBucket", {}); - // const outputBucket = new s3.Bucket(baseStack, 'OutputtBucket', {}); - const outputBucketVMImportBucket = new VMImportBucket( + const pipelineSourceBucket = new s3.Bucket( baseStack, - "OutputtBucketVMImportBucket", + "pipelineSourceBucket", { - encryptionKey: encryptionKey, + 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, - sourceBucket: sourceBucket, + pipelineSourceBucket: pipelineSourceBucket, + pipelineArtifactBucket: pipelineArtifactBucket, + pipelineOutputBucket: pipelineOutputBucket, ecrRepository: ecrRepository, ecrRepositoryImageTag: "ubuntu_22_04", - artifactBucket: artifactBucket, - outputBucket: outputBucketVMImportBucket, - projectKind: ProjectKind.PokyAmi, + projectType: ProjectType.PokyAmi, vpc: vpc, - artifactOutputObjectKey: `${ProjectKind.PokyAmi}`, + pipelineArtifactPrefix: `${ProjectType.PokyAmi}`, encryptionKey: encryptionKey, }); diff --git a/test/codepipeline-embedded-linux.test.ts b/test/codepipeline-embedded-linux.test.ts index 6020d72..0497075 100644 --- a/test/codepipeline-embedded-linux.test.ts +++ b/test/codepipeline-embedded-linux.test.ts @@ -3,7 +3,7 @@ import * as assertions from "aws-cdk-lib/assertions"; import { PipelineResourcesProps, PipelineResourcesStack, - ProjectKind, + ProjectType, } from "../lib"; import { EmbeddedLinuxCodePipelineBaseImageProps, @@ -43,11 +43,12 @@ describe("EmbeddedLinuxCodePipelineStack", () => { const embeddedLinuxCodePipelineBaseImageProps: EmbeddedLinuxCodePipelineBaseImageProps = { env: DEFAULT_ENV, - sourceBucket: pipelineResourcesStack.sourceBucket, + pipelineSourceBucket: pipelineResourcesStack.pipelineSourceBucket, + pipelineArtifactBucket: pipelineResourcesStack.pipelineArtifactBucket, ecrRepository: pipelineResourcesStack.ecrRepository, - artifactBucket: pipelineResourcesStack.artifactBucket, encryptionKey: pipelineResourcesStack.encryptionKey, }; + embeddedLinuxCodePipelineBaseImageStack = new EmbeddedLinuxCodePipelineBaseImageStack( app, @@ -60,12 +61,12 @@ describe("EmbeddedLinuxCodePipelineStack", () => { ecrRepository: embeddedLinuxCodePipelineBaseImageStack.ecrRepository, ecrRepositoryImageTag: embeddedLinuxCodePipelineBaseImageStack.ecrRepositoryImageTag, - sourceBucket: pipelineResourcesStack.sourceBucket, - artifactBucket: pipelineResourcesStack.artifactBucket, - outputBucket: pipelineResourcesStack.outputBucket, - projectKind: ProjectKind.Poky, + pipelineSourceBucket: pipelineResourcesStack.pipelineSourceBucket, + pipelineArtifactBucket: pipelineResourcesStack.pipelineArtifactBucket, + pipelineOutputBucket: pipelineResourcesStack.pipelineOutputBucket, + projectType: ProjectType.Poky, vpc: pipelineResourcesStack.vpc, - artifactOutputObjectKey: "pipeline-poky", + pipelineArtifactPrefix: `${ProjectType.Poky}`, encryptionKey: pipelineResourcesStack.encryptionKey, }; diff --git a/test/codepipeline-resources-nag.test.ts b/test/codepipeline-resources-nag.test.ts index ada2edd..cf7b2b3 100644 --- a/test/codepipeline-resources-nag.test.ts +++ b/test/codepipeline-resources-nag.test.ts @@ -6,26 +6,37 @@ import { DEFAULT_ENV } from "./util"; import { PipelineResourcesStack } from "../lib"; function addNagSuppressions(stack: cdk.Stack) { - NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/VMImportRole/Resource`, - [ - { - id: "AwsSolutions-IAM5", - reason: "Read permissions needed on bucket.", - appliesTo: [ - { - regex: - "/Resource::/\\*$/g", - }, - { - regex: `/Resource::arn:aws:ec2:${DEFAULT_ENV.region}::snapshot/\\*$/g`, - }, - { regex: "/Resource::\\*$/g" }, - ], - }, - ], - ); + // NagSuppressions.addResourceSuppressionsByPath( + // stack, + // `/${stack.stackName}/VMImportRole/Resource`, + // [ + // { + // id: "AwsSolutions-IAM5", + // reason: "Read permissions needed on bucket.", + // appliesTo: [ + // { + // regex: + // "/Resource::/\\*$/g", + // } + // ], + // }, + // ], + // ); + // NagSuppressions.addResourceSuppressionsByPath( + // stack, + // `/${stack.stackName}/EmbeddedLinuxCodePipelineVMImportRole/Resource`, + // [ + // { + // id: "AwsSolutions-IAM5", + // reason: "Wildcard permissions needed on snapshot.", + // appliesTo: [ + // { + // regex: `/Resource::arn:aws:ec2:${DEFAULT_ENV.region}::snapshot/\\*$/g`, + // } + // ], + // }, + // ], + // ); } describe("PipelineResourcesStack cdk-nag AwsSolutions Pack", () => { diff --git a/test/codepipeline-resources.test.ts b/test/codepipeline-resources.test.ts index 8ad6c37..954135e 100644 --- a/test/codepipeline-resources.test.ts +++ b/test/codepipeline-resources.test.ts @@ -24,8 +24,7 @@ describe("PipelineResourcesStack", () => { `artifact`, `source`, `output`, - `output-vm`, - `access-logs`, + `logs`, ]; it.each(bucketSuffixes)(`Has S3 Bucket`, (bucketSuffix) => { const bucketName = From 7f69595002c7bef4275290b7eac0cc2d0faac557 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 7 Feb 2025 09:18:59 +0100 Subject: [PATCH 040/112] updating script path --- source-repo/poky-ami/build.buildspec.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source-repo/poky-ami/build.buildspec.yml b/source-repo/poky-ami/build.buildspec.yml index be2614a..45ab819 100644 --- a/source-repo/poky-ami/build.buildspec.yml +++ b/source-repo/poky-ami/build.buildspec.yml @@ -63,7 +63,7 @@ phases: - 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 $PIPELINE_OUTPUT_BUCKET 16 core-image-minimal aws-ec2-arm64 $TMP_DIR/tmp $VM_IMPORT_ROLE .rootfs - - ./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 $PIPELINE_OUTPUT_BUCKET 16 core-image-minimal aws-ec2-arm64 $TMP_DIR/tmp $VM_IMPORT_ROLE .rootfs # Prune old files in our EFS Mounts, that are not accessed by this or any build within 30 days - find /nfs/sstate-cache -atime +30 -type f -delete # only delete empty dirs From e18796a220c9b2a192d4fa8867ee9d8c895cfcc9 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 7 Feb 2025 09:19:56 +0100 Subject: [PATCH 041/112] varible renaming to improve readability --- lib/codepipeline-resources.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/codepipeline-resources.ts b/lib/codepipeline-resources.ts index 9d29ee3..f710416 100644 --- a/lib/codepipeline-resources.ts +++ b/lib/codepipeline-resources.ts @@ -39,7 +39,7 @@ export class PipelineResourcesStack extends cdk.Stack { /** The output bucket*/ readonly pipelineOutputBucket: s3.Bucket; /** The Cloudwatch logging bucket*/ - public readonly accessLoggingBucket?: s3.Bucket; + public readonly loggingBucket?: s3.Bucket; /** The encryption key use across*/ public readonly encryptionKey: kms.Key; @@ -96,7 +96,7 @@ export class PipelineResourcesStack extends cdk.Stack { }); // Create a bucket, then allow a deployment Lambda to upload to it. - this.accessLoggingBucket = new s3.Bucket( + this.loggingBucket = new s3.Bucket( this, "PipelineResourcesLoggingBucket", { @@ -119,7 +119,7 @@ export class PipelineResourcesStack extends cdk.Stack { autoDeleteObjects: true, removalPolicy: cdk.RemovalPolicy.DESTROY, encryptionKey: this.encryptionKey, - serverAccessLogsBucket: this.accessLoggingBucket, + serverAccessLogsBucket: this.loggingBucket, serverAccessLogsPrefix: "source-bucket", }, ); @@ -134,7 +134,7 @@ export class PipelineResourcesStack extends cdk.Stack { autoDeleteObjects: true, removalPolicy: cdk.RemovalPolicy.DESTROY, encryptionKey: this.encryptionKey, - serverAccessLogsBucket: this.accessLoggingBucket, + serverAccessLogsBucket: this.loggingBucket, serverAccessLogsPrefix: "artifact-bucket", }, ); @@ -149,13 +149,13 @@ export class PipelineResourcesStack extends cdk.Stack { autoDeleteObjects: true, removalPolicy: cdk.RemovalPolicy.DESTROY, encryptionKey: this.encryptionKey, - serverAccessLogsBucket: this.accessLoggingBucket, + serverAccessLogsBucket: this.loggingBucket, serverAccessLogsPrefix: "output-bucket", }, ); new cdk.CfnOutput(this, "LoggingBucket", { - value: this.accessLoggingBucket.bucketName, + value: this.loggingBucket.bucketName, description: "The access logging bucket.", }); From 78d4de8fbb1a6e215ee582602f8d0d401ea15b16 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 7 Feb 2025 09:21:04 +0100 Subject: [PATCH 042/112] switching to S3 poll trigger --- lib/codepipeline-embedded-linux-base-image.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/codepipeline-embedded-linux-base-image.ts b/lib/codepipeline-embedded-linux-base-image.ts index 4dd8e05..fa59f0e 100644 --- a/lib/codepipeline-embedded-linux-base-image.ts +++ b/lib/codepipeline-embedded-linux-base-image.ts @@ -112,7 +112,7 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { const sourceActionOutputArtifact = new codepipeline.Artifact("Source"); const sourceAction = new codepipeline_actions.S3SourceAction({ actionName: "Source", - trigger: codepipeline_actions.S3Trigger.EVENTS, + trigger: codepipeline_actions.S3Trigger.POLL, output: sourceActionOutputArtifact, bucket: props.pipelineSourceBucket, bucketKey: `${props.pipelineSourcePrefix}/${sourceRepoAsset.s3ObjectKey}`, From 83cf8067ac2d7f36dab157c868fa79e753c03846 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 7 Feb 2025 09:21:42 +0100 Subject: [PATCH 043/112] code cleanup --- test/codepipeline-resources-nag.test.ts | 31 ------------------------- 1 file changed, 31 deletions(-) diff --git a/test/codepipeline-resources-nag.test.ts b/test/codepipeline-resources-nag.test.ts index cf7b2b3..5be1944 100644 --- a/test/codepipeline-resources-nag.test.ts +++ b/test/codepipeline-resources-nag.test.ts @@ -6,37 +6,6 @@ import { DEFAULT_ENV } from "./util"; import { PipelineResourcesStack } from "../lib"; function addNagSuppressions(stack: cdk.Stack) { - // NagSuppressions.addResourceSuppressionsByPath( - // stack, - // `/${stack.stackName}/VMImportRole/Resource`, - // [ - // { - // id: "AwsSolutions-IAM5", - // reason: "Read permissions needed on bucket.", - // appliesTo: [ - // { - // regex: - // "/Resource::/\\*$/g", - // } - // ], - // }, - // ], - // ); - // NagSuppressions.addResourceSuppressionsByPath( - // stack, - // `/${stack.stackName}/EmbeddedLinuxCodePipelineVMImportRole/Resource`, - // [ - // { - // id: "AwsSolutions-IAM5", - // reason: "Wildcard permissions needed on snapshot.", - // appliesTo: [ - // { - // regex: `/Resource::arn:aws:ec2:${DEFAULT_ENV.region}::snapshot/\\*$/g`, - // } - // ], - // }, - // ], - // ); } describe("PipelineResourcesStack cdk-nag AwsSolutions Pack", () => { From 83b83060430695a996f71ab67b5f1a7bcd4f90dd Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 7 Feb 2025 09:33:26 +0100 Subject: [PATCH 044/112] adjusting the readme with additional details --- README.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 06ad417..2d8c399 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ import { EmbeddedLinuxCodePipelineStack, EmbeddedLinuxCodeBuildProjectStack, PipelineResourcesStack, - ProjectKind, + ProjectType, } from "aws4embeddedlinux-cdk-lib"; ``` @@ -106,6 +106,7 @@ yarn link ```bash yarn install yarn link "aws4embeddedlinux-cdk-lib" +yarn run build ``` This will link through the system `node_modules` install. @@ -123,7 +124,7 @@ import { EmbeddedLinuxCodePipelineStack, EmbeddedLinuxCodeBuildProjectStack, PipelineResourcesStack, - ProjectKind, + ProjectType, } from "aws4embeddedlinux-cdk-lib"; ``` @@ -153,11 +154,15 @@ The following steps detaisl at a high level, how you can enable the use of AWS S ```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, + const projectPipeline = new EmbeddedLinuxCodePipelineStack(app, "MyPokyPipeline", { + projectType: ProjectType.Poky, + ecrRepository: , + ecrRepositoryImageTag: , + pipelineSourceBucket: , + pipelineArtifactBucket: , + pipelineOutputBucket: , + vpc: , + encryptionKey: , buildPolicyAdditions: [ iam.PolicyStatement.fromJson({ Effect: "Allow", @@ -168,6 +173,7 @@ The following steps detaisl at a high level, how you can enable the use of AWS S ], }); ``` + - The secret can then be used in the CodeBuild Project by adding it to the BuildSpec. ```yaml From 885401c892a614554f6003de7fb3feaa4d09fca1 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 7 Feb 2025 10:33:46 +0100 Subject: [PATCH 045/112] function refactoring --- lib/codepipeline-embedded-linux.ts | 120 +++++++++++++---------------- 1 file changed, 55 insertions(+), 65 deletions(-) diff --git a/lib/codepipeline-embedded-linux.ts b/lib/codepipeline-embedded-linux.ts index 5aa1243..8d54dd1 100644 --- a/lib/codepipeline-embedded-linux.ts +++ b/lib/codepipeline-embedded-linux.ts @@ -153,7 +153,7 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { const sourceActionOutputArtifact = new codepipeline.Artifact("Source"); const sourceAction = new codepipeline_actions.S3SourceAction({ actionName: "Source", - trigger: codepipeline_actions.S3Trigger.EVENTS, + trigger: codepipeline_actions.S3Trigger.POLL, output: sourceActionOutputArtifact, bucket: props.pipelineSourceBucket, bucketKey: `${props.pipelineSourcePrefix}/${sourceRepoAsset.s3ObjectKey}`, @@ -433,11 +433,25 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { ); return vmImportRole; } + private addAMIExportPolicy( project: codebuild.PipelineProject, props: EmbeddedLinuxCodePipelineProps, ) { - project.addToRolePolicy(this.addVMExportPolicy()); + 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"], @@ -448,35 +462,7 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { }), ); //Permissions for BackUp to S3 - project.addToRolePolicy( - this.addAMIS3BackupPolicy(props.pipelineOutputBucket.bucketArn), - ); - project.addToRolePolicy( - this.addAMIEC2EBSBackupPolicy(cdk.Stack.of(this).region), - ); - project.addToRolePolicy( - this.addAMIEBSBackupPolicy(cdk.Stack.of(this).region), - ); - project.addToRolePolicy(this.addAMIBackupPolicy()); - } - - 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({ + project.addToRolePolicy(new iam.PolicyStatement({ actions: [ "s3:GetObject", "s3:ListBucket", @@ -484,41 +470,45 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { "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-*`, + `${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: ["*"], + }) + ); } } From b3d9d3f3e5ae12911dead80917215123316f67f9 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 7 Feb 2025 14:00:15 +0100 Subject: [PATCH 046/112] improving the doc / readme --- README.md | 226 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 205 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 2d8c399..f628e69 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,182 @@ # aws4embeddedlinux-ci -This [AWS CDK](https://github.com/aws/aws-cdk) library helps you deploy an AWS cloud infrastructure supporting the embedded Linux builds for your project using pipelines. +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 +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](#table-of-contents) + ## API documentation -[API documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci/) generated by `npm run doc`. +The [API documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci/) is generated automatically using [Typedoc](https://typedoc.org/). + +[Bask to the top](#table-of-contents) + +## 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](#table-of-contents) + + +## 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](#table-of-contents) ## Setup -In order to use this library, you must set up the [AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html), including +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. @@ -22,9 +186,9 @@ Additionally, you must have [NodeJS](https://nodejs.org/en/) installed. > This library is tested against Node Versions 18, 20, and 22. If these versions are not available for your system, we recommend using [NVM](https://github.com/nvm-sh/nvm) to install a compatible version. > -## Quickstart +You can also use the [sample project code](https://github.com/aws4embeddedlinux/aws4embeddedlinux-ci-examples) provided to get started and deploy the stacks. -You can use the [sample code](https://github.com/aws4embeddedlinux/aws4embeddedlinux-ci-examples) provided in our examples repo to get started with deploy the stacks. +[Bask to the top](#table-of-contents) ### Setting Up A New Project @@ -61,6 +225,27 @@ import { } from "aws4embeddedlinux-cdk-lib"; ``` +Then deploy the base resources and base image pipeline stacks: + +```typescript +const pipelineResourcesStack = new PipelineResourcesStack(app, `demo-resources`, {...}); +const baseImageStack = new EmbeddedLinuxCodePipelineBaseImageStack(app, `demo-pipeline-base-image`, {...}); +``` + +And ultimately deploy the target pipeline: +```typescript +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: @@ -80,8 +265,6 @@ This will create an Ubuntu based container for building the Yocto images. > The 'Base Image' pipeline will run weekly by default to keep the container patched and up to date. > -Once the 'Base Image' pipeline complete successfully, the rest of your application pipelines can be executed. - > [!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). @@ -89,11 +272,13 @@ Once the 'Base Image' pipeline complete successfully, the rest of your applicati Once your pipelines completes successfully, the Yocto deploy directory generated content will be pushed into a S3 bucket. +[Bask to the top](#table-of-contents) + ## 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. +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: +In this library repo, execute the following: ```bash yarn install @@ -101,7 +286,7 @@ yarn run build yarn link ``` -### In your project folder: +and in your project folder: ```bash yarn install @@ -116,17 +301,6 @@ This will link through the system `node_modules` install. > You should not install / reference the `aws4embeddedlinux/aws4embeddedlinux-ci` library in your `package.json` when using this approach. > -Then you can import the packages / classes using: - -```ts -import { - EmbeddedLinuxCodePipelineBaseImageStack, - EmbeddedLinuxCodePipelineStack, - EmbeddedLinuxCodeBuildProjectStack, - PipelineResourcesStack, - ProjectType, -} from "aws4embeddedlinux-cdk-lib"; -``` > _Note:_ > @@ -187,6 +361,8 @@ See the [CodeBuild Documentation](https://docs.aws.amazon.com/codebuild/latest/u 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](#table-of-contents) + ## Known issues - The use of this CDK library is currently not supported in Windows environments (you can still use WSL). @@ -194,14 +370,22 @@ CVE checking is enabled in the reference implementations. Details on this can be - 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](#table-of-contents) + ## Security See [SECURITY](SECURITY.md) for more information about reporting issues with this project. +[Bask to the top](#table-of-contents) + ## Contributing See [CONTRIBUTING](CONTRIBUTING.md) for more information. +[Bask to the top](#table-of-contents) + ## License This library is licensed under the MIT-0 License. See the [LICENSE](LICENSE) file. + +[Bask to the top](#table-of-contents) From cfcd85683388c6fbe90e2e8d46f8d1f8c2e4ab68 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 7 Feb 2025 14:13:33 +0100 Subject: [PATCH 047/112] minor change in navigation --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index f628e69..91a15cb 100644 --- a/README.md +++ b/README.md @@ -21,13 +21,13 @@ 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](#table-of-contents) +[Bask to the top](#aws4embeddedlinux-ci) ## API documentation The [API documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci/) is generated automatically using [Typedoc](https://typedoc.org/). -[Bask to the top](#table-of-contents) +[Bask to the top](#aws4embeddedlinux-ci) ## Project Build with AWS CodePipeline @@ -131,7 +131,7 @@ A build should automatically start. Once it succeeds you will get an image conta - First build: **30 minutes** - Rebuild (without any change, just use sstate cache): **9 minutes** -[Bask to the top](#table-of-contents) +[Bask to the top](#aws4embeddedlinux-ci) ## Project Build with AWS CodeBuild as Action Runner @@ -172,7 +172,7 @@ 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](#table-of-contents) +[Bask to the top](#aws4embeddedlinux-ci) ## Setup @@ -188,7 +188,7 @@ Additionally, you must have [NodeJS](https://nodejs.org/en/) installed. 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](#table-of-contents) +[Bask to the top](#aws4embeddedlinux-ci) ### Setting Up A New Project @@ -272,7 +272,7 @@ This will create an Ubuntu based container for building the Yocto images. Once your pipelines completes successfully, the Yocto deploy directory generated content will be pushed into a S3 bucket. -[Bask to the top](#table-of-contents) +[Bask to the top](#aws4embeddedlinux-ci) ## Development Setup @@ -361,7 +361,7 @@ See the [CodeBuild Documentation](https://docs.aws.amazon.com/codebuild/latest/u 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](#table-of-contents) +[Bask to the top](#aws4embeddedlinux-ci) ## Known issues @@ -370,22 +370,22 @@ CVE checking is enabled in the reference implementations. Details on this can be - 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](#table-of-contents) +[Bask to the top](#aws4embeddedlinux-ci) ## Security See [SECURITY](SECURITY.md) for more information about reporting issues with this project. -[Bask to the top](#table-of-contents) +[Bask to the top](#aws4embeddedlinux-ci) ## Contributing See [CONTRIBUTING](CONTRIBUTING.md) for more information. -[Bask to the top](#table-of-contents) +[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](#table-of-contents) +[Bask to the top](#aws4embeddedlinux-ci) From 90bbea25c42dfa1f776a2da57135e5060fd6d94c Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 7 Feb 2025 15:46:47 +0100 Subject: [PATCH 048/112] adding the ability to use a custom local source path be used to create a pipeline --- lib/codepipeline-embedded-linux.ts | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/lib/codepipeline-embedded-linux.ts b/lib/codepipeline-embedded-linux.ts index 8d54dd1..a150f47 100644 --- a/lib/codepipeline-embedded-linux.ts +++ b/lib/codepipeline-embedded-linux.ts @@ -1,3 +1,6 @@ +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"; @@ -12,7 +15,6 @@ 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 path from "path"; 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"; @@ -51,6 +53,8 @@ export interface EmbeddedLinuxCodePipelineProps extends cdk.StackProps { }; /** The encryption key use across*/ readonly encryptionKey: kms.Key; + /** Custom asset to be provided when using ProjectType.Custom */ + readonly sourceCustomPath?: string; } /** @@ -126,13 +130,22 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { ); // archive and upload the source-repo folder into CDK owned bucket - const sourceRepoAsset: Asset = new Asset( - this, - "EmbeddedLinuxCodePipelineBucketDeploymentAsset", - { - path: path.join(__dirname, "..", "source-repo", props.projectType), - }, - ); + 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( From 4f53d67825bffcd8246ffead31bd277354bea09b Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Mon, 10 Feb 2025 09:36:56 +0100 Subject: [PATCH 049/112] switching to codepipeline_actions.S3Trigger.EVENTS, --- lib/codepipeline-embedded-linux-base-image.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/codepipeline-embedded-linux-base-image.ts b/lib/codepipeline-embedded-linux-base-image.ts index fa59f0e..0d218ca 100644 --- a/lib/codepipeline-embedded-linux-base-image.ts +++ b/lib/codepipeline-embedded-linux-base-image.ts @@ -53,7 +53,7 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { this.ecrRepository = props.ecrRepository; this.ecrRepositoryImageTag = `${id}`; - + const projectType: string = "base-image"; if (!props.pipelineSourcePrefix) { @@ -112,7 +112,7 @@ export class EmbeddedLinuxCodePipelineBaseImageStack extends cdk.Stack { const sourceActionOutputArtifact = new codepipeline.Artifact("Source"); const sourceAction = new codepipeline_actions.S3SourceAction({ actionName: "Source", - trigger: codepipeline_actions.S3Trigger.POLL, + trigger: codepipeline_actions.S3Trigger.EVENTS, output: sourceActionOutputArtifact, bucket: props.pipelineSourceBucket, bucketKey: `${props.pipelineSourcePrefix}/${sourceRepoAsset.s3ObjectKey}`, From 9a0766b8d98fbc28689286ab7b2a965cf4b40b84 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Mon, 10 Feb 2025 09:38:02 +0100 Subject: [PATCH 050/112] - switching to codepipeline_actions.S3Trigger.EVENTS, - adding a custom project type where you can provide the location of your buildspec --- lib/codepipeline-embedded-linux.ts | 52 +++++++++++++++++++----------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/lib/codepipeline-embedded-linux.ts b/lib/codepipeline-embedded-linux.ts index a150f47..b27fdcb 100644 --- a/lib/codepipeline-embedded-linux.ts +++ b/lib/codepipeline-embedded-linux.ts @@ -130,7 +130,12 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { ); // archive and upload the source-repo folder into CDK owned bucket - let sourcePath = path.join(__dirname, "..", "source-repo", props.projectType); + let sourcePath = path.join( + __dirname, + "..", + "source-repo", + props.projectType, + ); if (props.projectType == ProjectType.Custom) { if (!props.sourceCustomPath) { throw new Error( @@ -145,7 +150,11 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { sourcePath = props.sourceCustomPath; } - const sourceRepoAsset: Asset = new Asset(this, "EmbeddedLinuxCodePipelineBucketDeploymentAsset", { path: sourcePath, }); + const sourceRepoAsset: Asset = new Asset( + this, + "EmbeddedLinuxCodePipelineBucketDeploymentAsset", + { path: sourcePath }, + ); // deploy the sourceRepo to the bucket const bucketDeployment = new BucketDeployment( @@ -166,7 +175,7 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { const sourceActionOutputArtifact = new codepipeline.Artifact("Source"); const sourceAction = new codepipeline_actions.S3SourceAction({ actionName: "Source", - trigger: codepipeline_actions.S3Trigger.POLL, + trigger: codepipeline_actions.S3Trigger.EVENTS, output: sourceActionOutputArtifact, bucket: props.pipelineSourceBucket, bucketKey: `${props.pipelineSourcePrefix}/${sourceRepoAsset.s3ObjectKey}`, @@ -201,6 +210,10 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { 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, @@ -463,7 +476,7 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { "ec2:CancelImportTask", ], resources: ["*"], - }) + }), ); project.addToRolePolicy( new iam.PolicyStatement({ @@ -475,19 +488,20 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { }), ); //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: [ + "s3:GetObject", + "s3:ListBucket", + "s3:PutObject", + "s3:PutObjectTagging", + "s3:AbortMultipartUpload", + ], + resources: [ + `${props.pipelineOutputBucket.bucketArn}`, + `${props.pipelineOutputBucket.bucketArn}/*`, + ], + }), ); project.addToRolePolicy( new iam.PolicyStatement({ @@ -512,7 +526,7 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { "ebs:PutSnapshotBlock", ], resources: [`arn:aws:ec2:${cdk.Stack.of(this).region}::snapshot/*`], - }) + }), ); project.addToRolePolicy( new iam.PolicyStatement({ @@ -521,7 +535,7 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { "ec2:GetEbsEncryptionByDefault", ], resources: ["*"], - }) + }), ); } } From 625c6f4c80fe922c8ce9fbc6c7f916a07f575ee1 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Mon, 10 Feb 2025 09:38:24 +0100 Subject: [PATCH 051/112] variable renaming --- lib/codepipeline-resources.ts | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/lib/codepipeline-resources.ts b/lib/codepipeline-resources.ts index f710416..28ced5d 100644 --- a/lib/codepipeline-resources.ts +++ b/lib/codepipeline-resources.ts @@ -96,18 +96,14 @@ export class PipelineResourcesStack extends cdk.Stack { }); // 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.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, From df9fa19e7a0b288c0d72d98275ef4fcf90dc3f3d Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Mon, 10 Feb 2025 19:30:04 +0100 Subject: [PATCH 052/112] - extending create ami script with additional parameters - adding tags and name to the created ami --- source-repo/poky-ami/build.buildspec.yml | 12 +++- source-repo/poky-ami/create-ec2-ami.sh | 74 +++++++++++++++++++----- 2 files changed, 71 insertions(+), 15 deletions(-) diff --git a/source-repo/poky-ami/build.buildspec.yml b/source-repo/poky-ami/build.buildspec.yml index 45ab819..78b73a7 100644 --- a/source-repo/poky-ami/build.buildspec.yml +++ b/source-repo/poky-ami/build.buildspec.yml @@ -63,7 +63,17 @@ phases: - 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 $PIPELINE_OUTPUT_BUCKET 16 core-image-minimal aws-ec2-arm64 $TMP_DIR/tmp $VM_IMPORT_ROLE .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 /nfs/sstate-cache -atime +30 -type f -delete # only delete empty dirs diff --git a/source-repo/poky-ami/create-ec2-ami.sh b/source-repo/poky-ami/create-ec2-ami.sh index 93e887f..b91671e 100644 --- a/source-repo/poky-ami/create-ec2-ami.sh +++ b/source-repo/poky-ami/create-ec2-ami.sh @@ -7,23 +7,56 @@ set -eo pipefail 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") @@ -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" From 660e298a0a0fe6d40452b40acd5a2852e42d8ee3 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Mon, 10 Feb 2025 19:30:45 +0100 Subject: [PATCH 053/112] test updates --- .../codepipeline-embedded-linux.test.ts.snap | 5 +++++ ...depipeline-embedded-linux-base-image-nag.test.ts | 13 ++++++++++--- test/codepipeline-embedded-linux-nag.test.ts | 8 ++++++-- test/codepipeline-resources-nag.test.ts | 7 +------ test/codepipeline-resources.test.ts | 7 +------ 5 files changed, 23 insertions(+), 17 deletions(-) diff --git a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap index 16036a5..9bb090c 100644 --- a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap @@ -1105,6 +1105,11 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Type": "PLAINTEXT", "Value": "eu-central-1", }, + { + "Name": "PIPELINE_PROJECT_NAME", + "Type": "PLAINTEXT", + "Value": "MyTestStack", + }, { "Name": "PIPELINE_OUTPUT_BUCKET", "Type": "PLAINTEXT", diff --git a/test/codepipeline-embedded-linux-base-image-nag.test.ts b/test/codepipeline-embedded-linux-base-image-nag.test.ts index c9e34bf..a2b2e66 100644 --- a/test/codepipeline-embedded-linux-base-image-nag.test.ts +++ b/test/codepipeline-embedded-linux-base-image-nag.test.ts @@ -4,7 +4,10 @@ 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 { + EmbeddedLinuxCodePipelineBaseImageProps, + EmbeddedLinuxCodePipelineBaseImageStack, +} from "../lib/codepipeline-embedded-linux-base-image"; import { DEFAULT_ENV } from "./util"; function addNagSuppressions(stack: cdk.Stack) { @@ -94,10 +97,14 @@ describe("EmbeddedLinuxCodePipelineBaseImageStack cdk-nag AwsSolutions Pack", () versioned: true, }, ); - const pipelineArtifactBucket = new s3.Bucket(baseStack, "PipelineArtifactBucket", {}); + const pipelineArtifactBucket = new s3.Bucket( + baseStack, + "PipelineArtifactBucket", + {}, + ); const ecrRepository = new ecr.Repository(baseStack, "EcrRepository", {}); - const props : EmbeddedLinuxCodePipelineBaseImageProps = { + const props: EmbeddedLinuxCodePipelineBaseImageProps = { env: DEFAULT_ENV, pipelineSourceBucket: pipelineSourceBucket, pipelineArtifactBucket: pipelineArtifactBucket, diff --git a/test/codepipeline-embedded-linux-nag.test.ts b/test/codepipeline-embedded-linux-nag.test.ts index cbb32a8..065e74c 100644 --- a/test/codepipeline-embedded-linux-nag.test.ts +++ b/test/codepipeline-embedded-linux-nag.test.ts @@ -149,7 +149,7 @@ function addNagSuppressions(stack: cdk.Stack) { }, { regex: `/Resource::\\*$/g`, - } + }, ], }, ], @@ -176,7 +176,11 @@ describe("EmbeddedLinuxCodePipelineStack cdk-nag AwsSolutions Pack", () => { versioned: true, }, ); - const pipelineArtifactBucket = new s3.Bucket(baseStack, "ArtifactBucket", {}); + const pipelineArtifactBucket = new s3.Bucket( + baseStack, + "ArtifactBucket", + {}, + ); const pipelineOutputBucket = new s3.Bucket(baseStack, "OutputBucket", { encryptionKey: encryptionKey, }); diff --git a/test/codepipeline-resources-nag.test.ts b/test/codepipeline-resources-nag.test.ts index 5be1944..310bee9 100644 --- a/test/codepipeline-resources-nag.test.ts +++ b/test/codepipeline-resources-nag.test.ts @@ -1,13 +1,10 @@ import * as cdk from "aws-cdk-lib"; import { Annotations, Match } from "aws-cdk-lib/assertions"; -import { AwsSolutionsChecks, NagSuppressions } from "cdk-nag"; +import { AwsSolutionsChecks } from "cdk-nag"; import { DEFAULT_ENV } from "./util"; import { PipelineResourcesStack } from "../lib"; -function addNagSuppressions(stack: cdk.Stack) { -} - describe("PipelineResourcesStack cdk-nag AwsSolutions Pack", () => { const app: cdk.App = new cdk.App(); let stack: cdk.Stack; @@ -21,8 +18,6 @@ describe("PipelineResourcesStack cdk-nag AwsSolutions Pack", () => { stack = new PipelineResourcesStack(app, "MyTestStack", props); - addNagSuppressions(stack); - // WHEN cdk.Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); }); diff --git a/test/codepipeline-resources.test.ts b/test/codepipeline-resources.test.ts index 954135e..391e12c 100644 --- a/test/codepipeline-resources.test.ts +++ b/test/codepipeline-resources.test.ts @@ -20,12 +20,7 @@ describe("PipelineResourcesStack", () => { template = assertions.Template.fromStack(stack); }); - const bucketSuffixes = [ - `artifact`, - `source`, - `output`, - `logs`, - ]; + 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(); From 137d9db5ae0c3f611b9cf33dae1a735e9718fb31 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 13 Feb 2025 16:51:03 +0100 Subject: [PATCH 054/112] removing node 18/20 support --- .github/workflows/test-cdk.yml | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-cdk.yml b/.github/workflows/test-cdk.yml index 96418a1..1e41c1d 100644 --- a/.github/workflows/test-cdk.yml +++ b/.github/workflows/test-cdk.yml @@ -10,7 +10,7 @@ jobs: strategy: matrix: - node-version: [18.x, 20.x, 22.x] + node-version: [22.x] steps: - name: Check out repository code diff --git a/README.md b/README.md index 91a15cb..2576bce 100644 --- a/README.md +++ b/README.md @@ -183,7 +183,7 @@ Additionally, you must have [NodeJS](https://nodejs.org/en/) installed. > [!NOTE] > -> This library is tested against Node Versions 18, 20, and 22. If these versions are 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. > You can also use the [sample project code](https://github.com/aws4embeddedlinux/aws4embeddedlinux-ci-examples) provided to get started and deploy the stacks. From 130dea289bed73ad7d00279356c88ba3da2c6d9b Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 13 Feb 2025 16:54:02 +0100 Subject: [PATCH 055/112] removing deprecated code --- README-deprecated.md | 50 - lib/deprecated/build-image-data.ts | 116 - lib/deprecated/build-image-pipeline.ts | 186 - lib/deprecated/build-image-repo.ts | 26 - lib/deprecated/constructs/source-repo.ts | 60 - .../embedded-linux-codebuild-project.ts | 286 - lib/deprecated/embedded-linux-pipeline.ts | 500 -- lib/deprecated/network.ts | 39 - lib/deprecated/vm-import-bucket.ts | 70 - .../build-image-data.test.ts.snap | 621 -- .../build-image-pipeline.test.ts.snap | 1174 --- .../build-image-repo.test.ts.snap | 50 - .../embedded-linux-pipeline.test.ts.snap | 7217 ----------------- .../__snapshots__/network.test.ts.snap | 665 -- .../__snapshots__/source-repo.test.ts.snap | 55 - test/deprecated/build-image-data-nag.test.ts | 78 - test/deprecated/build-image-data.test.ts | 34 - .../build-image-pipeline-nag.test.ts | 96 - test/deprecated/build-image-pipeline.test.ts | 55 - test/deprecated/build-image-repo-nag.test.ts | 36 - test/deprecated/build-image-repo.test.ts | 16 - .../embedded-linux-pipeline-nag.test.ts | 168 - .../embedded-linux-pipeline.test.ts | 97 - test/deprecated/network.test-nag.test.ts | 39 - test/deprecated/network.test.ts | 26 - test/deprecated/source-repo-nag.test.ts | 46 - test/deprecated/source-repo.test.ts | 22 - test/deprecated/util.ts | 17 - 28 files changed, 11845 deletions(-) delete mode 100644 README-deprecated.md delete mode 100644 lib/deprecated/build-image-data.ts delete mode 100644 lib/deprecated/build-image-pipeline.ts delete mode 100644 lib/deprecated/build-image-repo.ts delete mode 100644 lib/deprecated/constructs/source-repo.ts delete mode 100644 lib/deprecated/embedded-linux-codebuild-project.ts delete mode 100644 lib/deprecated/embedded-linux-pipeline.ts delete mode 100644 lib/deprecated/network.ts delete mode 100644 lib/deprecated/vm-import-bucket.ts delete mode 100644 test/deprecated/__snapshots__/build-image-data.test.ts.snap delete mode 100644 test/deprecated/__snapshots__/build-image-pipeline.test.ts.snap delete mode 100644 test/deprecated/__snapshots__/build-image-repo.test.ts.snap delete mode 100644 test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap delete mode 100644 test/deprecated/__snapshots__/network.test.ts.snap delete mode 100644 test/deprecated/__snapshots__/source-repo.test.ts.snap delete mode 100644 test/deprecated/build-image-data-nag.test.ts delete mode 100644 test/deprecated/build-image-data.test.ts delete mode 100644 test/deprecated/build-image-pipeline-nag.test.ts delete mode 100644 test/deprecated/build-image-pipeline.test.ts delete mode 100644 test/deprecated/build-image-repo-nag.test.ts delete mode 100644 test/deprecated/build-image-repo.test.ts delete mode 100644 test/deprecated/embedded-linux-pipeline-nag.test.ts delete mode 100644 test/deprecated/embedded-linux-pipeline.test.ts delete mode 100644 test/deprecated/network.test-nag.test.ts delete mode 100644 test/deprecated/network.test.ts delete mode 100644 test/deprecated/source-repo-nag.test.ts delete mode 100644 test/deprecated/source-repo.test.ts delete mode 100644 test/deprecated/util.ts diff --git a/README-deprecated.md b/README-deprecated.md deleted file mode 100644 index 07adac3..0000000 --- a/README-deprecated.md +++ /dev/null @@ -1,50 +0,0 @@ -# aws4embeddedlinux-ci - Deprecated API - -This [AWS CDK](https://github.com/aws/aws-cdk) library helps you deploy an AWS cloud infrastructure supporting the embedded Linux builds for your project using pipelines. - -This README is documenting the deprecated set of APIs. - -## Architecture - -Here is the overall architecture : - -![architecture overview](images/architecture-v0.1.x.svg "Architecture") - -As you can notice, the architecture is using AWS CodeCommit (compared to S3 in the non deprecated version) which is no longer available in newly created AWS accounts. - -## API documentation - -The [API documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci/) generated by `npm run doc` includes both APIs. - -## Setup - -The instructions remains the same as in the [README](./README.md#setup) except for the packages / classes imports: - -```ts -import { - EmbeddedLinuxPipelineStack, - EmbeddedLinuxCodebuildProjectStack, - BuildImageDataStack, - BuildImagePipelineStack, - BuildImageRepoStack, - PipelineNetworkStack, - ImageKind, - ProjectKind, -} from "/aws4embeddedlinux-ci/lib"; -``` - -## Known issues - -Please refer to the [README](./README.md#known-issues) - -## Security - -Please refer to the [README](./README.md#security) - -## Contributing - -Please refer to the [README](./README.md#contributing) - -## License - -Please refer to the [README](./README.md#license) \ No newline at end of file diff --git a/lib/deprecated/build-image-data.ts b/lib/deprecated/build-image-data.ts deleted file mode 100644 index 7ef6c2f..0000000 --- a/lib/deprecated/build-image-data.ts +++ /dev/null @@ -1,116 +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}. - * - * @deprecated Use the new {@link PipelineResourcesProps} class instead. - * - */ -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}. - * - * @deprecated Use the new {@link PipelineResourcesStack} class instead. - * - */ -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 sourceBase: string = "base-image"; - const sourceLocalPath: string = `source-zip/${sourceBase}`; - - 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, "..", "..", sourceLocalPath)), - ], - destinationBucket: dataBucket, - role: dataBucketDeploymentRole, - extract: true, - }); - - return dataBucket; - } -} diff --git a/lib/deprecated/build-image-pipeline.ts b/lib/deprecated/build-image-pipeline.ts deleted file mode 100644 index c089dde..0000000 --- a/lib/deprecated/build-image-pipeline.ts +++ /dev/null @@ -1,186 +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. - * - * @deprecated Use the new {@link PipelineResourcesStack} class instead. - * - */ -export enum ImageKind { - /** Ubuntu 22.04 (LTS) */ - Ubuntu22_04 = "ubuntu_22_04", -} - -/** - * - * Select options for the {@link BuildImagePipelineStack}. - * - * @deprecated Use the new {@link BuildBaseImageCodePipelineProps} class instead. - * - */ -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}. - * - * @deprecated Use the new {@link BuildBaseImageCodePipelineStack} class instead. - * - */ -export class BuildImagePipelineStack extends cdk.Stack { - constructor(scope: Construct, id: string, props: BuildImagePipelineProps) { - super(scope, id, props); - const sourceBase: string = "base-image"; - const sourceFileName: string = `source-${sourceBase}.zip`; - const sourceBucketKey: string = `${sourceFileName}`; - - // Create a source action. - const sourceOutput = new codepipeline.Artifact("BuildImageSource"); - const sourceAction = new codepipeline_actions.S3SourceAction({ - actionName: "Build-Image-Source", - bucket: props.dataBucket, - bucketKey: sourceBucketKey, - output: sourceOutput, - }); - - // Create a build action. - const buildImageProject = new codebuild.PipelineProject( - this, - "BuildImageProject", - { - 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.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.ONE_YEAR, - removalPolicy: cdk.RemovalPolicy.DESTROY, - }), - }, - }, - }, - ); - 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/deprecated/build-image-repo.ts b/lib/deprecated/build-image-repo.ts deleted file mode 100644 index 5c984fb..0000000 --- a/lib/deprecated/build-image-repo.ts +++ /dev/null @@ -1,26 +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} - * - * @deprecated Use the new {@link PipelineResourcesStack} class instead. - * - */ -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/deprecated/constructs/source-repo.ts b/lib/deprecated/constructs/source-repo.ts deleted file mode 100644 index ff45cb3..0000000 --- a/lib/deprecated/constructs/source-repo.ts +++ /dev/null @@ -1,60 +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"; - -/** - * @deprecated - 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", -} - -/** - * @deprecated - The SourceRepoProps. - */ -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; -} - -/** - * @deprecated - * - * 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/deprecated/embedded-linux-codebuild-project.ts b/lib/deprecated/embedded-linux-codebuild-project.ts deleted file mode 100644 index b40cc7c..0000000 --- a/lib/deprecated/embedded-linux-codebuild-project.ts +++ /dev/null @@ -1,286 +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. - * - * @deprecated Use the new {@link EmbeddedLinuxCodeBuildProjectProps} class instead. - * - */ -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; -} - -/** - * @deprecated - * - * The stack for creating a build pipeline. - * - * See {@link EmbeddedLinuxCodebuildProjectProps} for configration options. - * - * @deprecated Use the new {@link EmbeddedLinuxCodeBuildProjectStack} class instead. - * - */ -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); - const efsFileSystem: efs.FileSystem = new efs.FileSystem( - this, - `EFSFileSystem`, - { - vpc: props.vpc, - allowAnonymousAccess: true, - removalPolicy: cdk.RemovalPolicy.DESTROY, - }, - ); - efsFileSystem.connections.allowFrom(projectSg, Port.tcp(2049)); - // 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.X_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", - // }), - // ], - fileSystemLocations: [ - FileSystemLocation.efs({ - identifier: "nfs", - location: `${efsFileSystem.fileSystemId}.efs.${efsFileSystem.env.region}.amazonaws.com:/`, - mountPoint: "/nfs", - }), - ], - logging: { - cloudWatch: { - logGroup: new LogGroup(this, "PipelineBuildLogs", { - retention: RetentionDays.ONE_YEAR, - removalPolicy: cdk.RemovalPolicy.DESTROY, - }), - }, - }, - }); - - 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.ONE_YEAR, - }, - ); - - 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/deprecated/embedded-linux-pipeline.ts b/lib/deprecated/embedded-linux-pipeline.ts deleted file mode 100644 index 8f7e218..0000000 --- a/lib/deprecated/embedded-linux-pipeline.ts +++ /dev/null @@ -1,500 +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. - * - * @deprecated Use the new {@link EmbeddedLinuxCodePipelineProps} class instead. - * - */ -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. - * - * @deprecated Use the new {@link EmbeddedLinuxCodePipelineStack} class instead. - * - */ -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); - const efsFileSystem: efs.FileSystem = new efs.FileSystem( - this, - `EFSFileSystem`, - { - vpc: props.vpc, - allowAnonymousAccess: true, - removalPolicy: cdk.RemovalPolicy.DESTROY, - }, - ); - efsFileSystem.connections.allowFrom(projectSg, Port.tcp(2049)); - - 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, "../../scripts/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, - 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.X_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: "/nfs/build-output", - // }), - // FileSystemLocation.efs({ - // identifier: "sstate_cache", - // location: sstateFS, - // mountPoint: "/nfs/sstate-cache", - // }), - // FileSystemLocation.efs({ - // identifier: "dl_dir", - // location: dlFS, - // mountPoint: "/nfs/downloads", - // }), - // ], - fileSystemLocations: [ - FileSystemLocation.efs({ - identifier: "nfs", - location: `${efsFileSystem.fileSystemId}.efs.${efsFileSystem.env.region}.amazonaws.com:/`, - mountPoint: "/nfs", - }), - ], - logging: { - cloudWatch: { - logGroup: new LogGroup(this, "PipelineBuildLogs", { - retention: RetentionDays.ONE_YEAR, - removalPolicy: cdk.RemovalPolicy.DESTROY, - }), - }, - }, - }); - - 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.ONE_YEAR, - }, - ); - - 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], - }, - ], - }); - pipeline.node.addDependency(project); - - 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/deprecated/network.ts b/lib/deprecated/network.ts deleted file mode 100644 index 314656c..0000000 --- a/lib/deprecated/network.ts +++ /dev/null @@ -1,39 +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. - * - * @deprecated Use the new {@link PipelineResourcesStack} class instead. - * - */ -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.ONE_YEAR, - removalPolicy: cdk.RemovalPolicy.DESTROY, - }), - ), - }); - } -} diff --git a/lib/deprecated/vm-import-bucket.ts b/lib/deprecated/vm-import-bucket.ts deleted file mode 100644 index f62640c..0000000 --- a/lib/deprecated/vm-import-bucket.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Construct } from "constructs"; -import * as s3 from "aws-cdk-lib/aws-s3"; -import * as iam from "aws-cdk-lib/aws-iam"; -import * as kms from "aws-cdk-lib/aws-kms"; - -const TAG = "aws4embeddedlinux-ci"; - -export interface VMImportBucketProps extends s3.BucketProps { - /** The sanitized role name */ - readonly sanitizedRoleName?: string; - readonly encryptionKey: kms.Key; -} - -/** - * 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.encryptionKey.keyArn], - }), - ], - }); - - 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/test/deprecated/__snapshots__/build-image-data.test.ts.snap b/test/deprecated/__snapshots__/build-image-data.test.ts.snap deleted file mode 100644 index 920a3b9..0000000 --- a/test/deprecated/__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/deprecated/__snapshots__/build-image-pipeline.test.ts.snap b/test/deprecated/__snapshots__/build-image-pipeline.test.ts.snap deleted file mode 100644 index 8045180..0000000 --- a/test/deprecated/__snapshots__/build-image-pipeline.test.ts.snap +++ /dev/null @@ -1,1174 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Build Image Pipeline 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": { - "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", - }, - "BuildImageBuildLogs65D4471D": { - "DeletionPolicy": "Delete", - "Properties": { - "RetentionInDays": 365, - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Delete", - }, - "BuildImagePipeline01DF392E": { - "DependsOn": [ - "BuildImagePipelineRoleDefaultPolicy211D9F92", - "BuildImagePipelineRole576404EF", - ], - "Properties": { - "ArtifactStore": { - "EncryptionKey": { - "Id": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "Type": "KMS", - }, - "Location": { - "Ref": "PipelineArtifacts4A9B2621", - }, - "Type": "S3", - }, - "Name": "ubuntu_22_04BuildImagePipeline", - "PipelineType": "V1", - "RestartExecutionOnUpdate": true, - "RoleArn": { - "Fn::GetAtt": [ - "BuildImagePipelineRole576404EF", - "Arn", - ], - }, - "Stages": [ - { - "Actions": [ - { - "ActionTypeId": { - "Category": "Source", - "Owner": "AWS", - "Provider": "S3", - "Version": "1", - }, - "Configuration": { - "S3Bucket": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - "S3ObjectKey": "source-base-image.zip", - }, - "Name": "Build-Image-Source", - "OutputArtifacts": [ - { - "Name": "BuildImageSource", - }, - ], - "RoleArn": { - "Fn::GetAtt": [ - "BuildImagePipelineSourceBuildImageSourceCodePipelineActionRole30249AA3", - "Arn", - ], - }, - "RunOrder": 1, - }, - ], - "Name": "Source", - }, - { - "Actions": [ - { - "ActionTypeId": { - "Category": "Build", - "Owner": "AWS", - "Provider": "CodeBuild", - "Version": "1", - }, - "Configuration": { - "ProjectName": { - "Ref": "BuildImageProjectD5B891B2", - }, - }, - "InputArtifacts": [ - { - "Name": "BuildImageSource", - }, - ], - "Name": "Build", - "RoleArn": { - "Fn::GetAtt": [ - "BuildImagePipelineBuildCodePipelineActionRole15E18A3A", - "Arn", - ], - }, - "RunOrder": 1, - }, - ], - "Name": "Build", - }, - ], - }, - "Type": "AWS::CodePipeline::Pipeline", - }, - "BuildImagePipelineBuildCodePipelineActionRole15E18A3A": { - "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", - }, - "BuildImagePipelineBuildCodePipelineActionRoleDefaultPolicyF886D181": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "codebuild:BatchGetBuilds", - "codebuild:StartBuild", - "codebuild:StopBuild", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "BuildImageProjectD5B891B2", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "BuildImagePipelineBuildCodePipelineActionRoleDefaultPolicyF886D181", - "Roles": [ - { - "Ref": "BuildImagePipelineBuildCodePipelineActionRole15E18A3A", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "BuildImagePipelineEventsRole6FF38A6B": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "events.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "BuildImagePipelineEventsRoleDefaultPolicy7384E26F": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": "codepipeline:StartPipelineExecution", - "Effect": "Allow", - "Resource": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codepipeline:eu-central-1:111111111111:", - { - "Ref": "BuildImagePipeline01DF392E", - }, - ], - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "BuildImagePipelineEventsRoleDefaultPolicy7384E26F", - "Roles": [ - { - "Ref": "BuildImagePipelineEventsRole6FF38A6B", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "BuildImagePipelineRole576404EF": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "codepipeline.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "BuildImagePipelineRoleDefaultPolicy211D9F92": { - "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": [ - "BuildImagePipelineSourceBuildImageSourceCodePipelineActionRole30249AA3", - "Arn", - ], - }, - }, - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "BuildImagePipelineBuildCodePipelineActionRole15E18A3A", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "BuildImagePipelineRoleDefaultPolicy211D9F92", - "Roles": [ - { - "Ref": "BuildImagePipelineRole576404EF", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "BuildImagePipelineSourceBuildImageSourceCodePipelineActionRole30249AA3": { - "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", - }, - "BuildImagePipelineSourceBuildImageSourceCodePipelineActionRoleDefaultPolicy7FF981F0": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "s3:GetObject*", - "s3:GetBucket*", - "s3:List*", - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttBucket83908E77Arn063C8555", - }, - { - "Fn::Join": [ - "", - [ - { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttBucket83908E77Arn063C8555", - }, - "/source-base-image.zip", - ], - ], - }, - ], - }, - { - "Action": [ - "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:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - "kms:Decrypt", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "BuildImagePipelineSourceBuildImageSourceCodePipelineActionRoleDefaultPolicy7FF981F0", - "Roles": [ - { - "Ref": "BuildImagePipelineSourceBuildImageSourceCodePipelineActionRole30249AA3", - }, - ], - }, - "Type": "AWS::IAM::Policy", - }, - "BuildImageProjectD5B891B2": { - "Properties": { - "Artifacts": { - "Type": "CODEPIPELINE", - }, - "Cache": { - "Type": "NO_CACHE", - }, - "EncryptionKey": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "Environment": { - "ComputeType": "BUILD_GENERAL1_MEDIUM", - "EnvironmentVariables": [ - { - "Name": "ECR_REPOSITORY_URI", - "Type": "PLAINTEXT", - "Value": { - "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", - }, - ], - ], - }, - }, - { - "Name": "AWS_ACCOUNT_ID", - "Type": "PLAINTEXT", - "Value": "111111111111", - }, - { - "Name": "AWS_DEFAULT_REGION", - "Type": "PLAINTEXT", - "Value": "eu-central-1", - }, - { - "Name": "IMAGE_TAG", - "Type": "PLAINTEXT", - "Value": "ubuntu_22_04", - }, - ], - "Image": "aws/codebuild/standard:7.0", - "ImagePullCredentialsType": "CODEBUILD", - "PrivilegedMode": true, - "Type": "LINUX_CONTAINER", - }, - "LogsConfig": { - "CloudWatchLogs": { - "GroupName": { - "Ref": "BuildImageBuildLogs65D4471D", - }, - "Status": "ENABLED", - }, - }, - "ServiceRole": { - "Fn::GetAtt": [ - "BuildImageProjectRole3D242EB1", - "Arn", - ], - }, - "Source": { - "BuildSpec": "buildspec.yml", - "Type": "CODEPIPELINE", - }, - }, - "Type": "AWS::CodeBuild::Project", - }, - "BuildImageProjectRole3D242EB1": { - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "codebuild.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "BuildImageProjectRoleDefaultPolicyDE9DF999": { - "Properties": { - "PolicyDocument": { - "Statement": [ - { - "Action": [ - "logs:CreateLogStream", - "logs:PutLogEvents", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "BuildImageBuildLogs65D4471D", - "Arn", - ], - }, - }, - { - "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": "BuildImageProjectD5B891B2", - }, - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":logs:eu-central-1:111111111111:log-group:/aws/codebuild/", - { - "Ref": "BuildImageProjectD5B891B2", - }, - ":*", - ], - ], - }, - ], - }, - { - "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": "BuildImageProjectD5B891B2", - }, - "-*", - ], - ], - }, - }, - { - "Action": [ - "ecr:BatchCheckLayerAvailability", - "ecr:GetDownloadUrlForLayer", - "ecr:BatchGetImage", - "ecr:CompleteLayerUpload", - "ecr:UploadLayerPart", - "ecr:InitiateLayerUpload", - "ecr:PutImage", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "RepoStack:ExportsOutputFnGetAttRepository22E53BBDArn3AD4E30B", - }, - }, - { - "Action": "ecr:GetAuthorizationToken", - "Effect": "Allow", - "Resource": "*", - }, - { - "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", - ], - }, - }, - { - "Action": [ - "kms:Decrypt", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - }, - ], - "Version": "2012-10-17", - }, - "PolicyName": "BuildImageProjectRoleDefaultPolicyDE9DF999", - "Roles": [ - { - "Ref": "BuildImageProjectRole3D242EB1", - }, - ], - }, - "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": { - "Properties": { - "ScheduleExpression": "cron(0 6 ? * Monday *)", - "State": "ENABLED", - "Targets": [ - { - "Arn": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":codepipeline:eu-central-1:111111111111:", - { - "Ref": "BuildImagePipeline01DF392E", - }, - ], - ], - }, - "Id": "Target0", - "RoleArn": { - "Fn::GetAtt": [ - "BuildImagePipelineEventsRole6FF38A6B", - "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/deprecated/__snapshots__/build-image-repo.test.ts.snap b/test/deprecated/__snapshots__/build-image-repo.test.ts.snap deleted file mode 100644 index fbbe919..0000000 --- a/test/deprecated/__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/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap b/test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap deleted file mode 100644 index 309add2..0000000 --- a/test/deprecated/__snapshots__/embedded-linux-pipeline.test.ts.snap +++ /dev/null @@ -1,7217 +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", - }, - "EFSFileSystem3D4FCE7F": { - "DeletionPolicy": "Delete", - "Properties": { - "Encrypted": true, - "FileSystemTags": [ - { - "Key": "Name", - "Value": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EFSFileSystem", - }, - ], - }, - "Type": "AWS::EFS::FileSystem", - "UpdateReplacePolicy": "Delete", - }, - "EFSFileSystemEfsMountTarget178C2E276": { - "Properties": { - "FileSystemId": { - "Ref": "EFSFileSystem3D4FCE7F", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EFSFileSystemEfsSecurityGroup5486A2B1", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EFSFileSystemEfsMountTarget2F4D1BB6B": { - "Properties": { - "FileSystemId": { - "Ref": "EFSFileSystem3D4FCE7F", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EFSFileSystemEfsSecurityGroup5486A2B1", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EFSFileSystemEfsMountTarget3FFC5E69F": { - "Properties": { - "FileSystemId": { - "Ref": "EFSFileSystem3D4FCE7F", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EFSFileSystemEfsSecurityGroup5486A2B1", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EFSFileSystemEfsSecurityGroup5486A2B1": { - "Properties": { - "GroupDescription": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EFSFileSystem/EfsSecurityGroup", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "Tags": [ - { - "Key": "Name", - "Value": "PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992/EFSFileSystem", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "EFSFileSystemEfsSecurityGroupfromPokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992BuildProjectSecurityGroup1FC90CF52049C427FFB2": { - "Properties": { - "Description": "from PokyAmiPipeline2ExportsOutputFnGetAttPipelineVpc0543904ACidrBlock70DEC992BuildProjectSecurityGroup1FC90CF5:2049", - "FromPort": 2049, - "GroupId": { - "Fn::GetAtt": [ - "EFSFileSystemEfsSecurityGroup5486A2B1", - "GroupId", - ], - }, - "IpProtocol": "tcp", - "SourceSecurityGroupId": { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - "ToPort": 2049, - }, - "Type": "AWS::EC2::SecurityGroupIngress", - }, - "EmbeddedLinuxBuildProject45760157": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - ], - "Properties": { - "Artifacts": { - "Type": "CODEPIPELINE", - }, - "Cache": { - "Type": "NO_CACHE", - }, - "EncryptionKey": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "Environment": { - "ComputeType": "BUILD_GENERAL1_XLARGE", - "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": "nfs", - "Location": { - "Fn::Join": [ - "", - [ - { - "Ref": "EFSFileSystem3D4FCE7F", - }, - ".efs.eu-central-1.amazonaws.com:/", - ], - ], - }, - "MountPoint": "/nfs", - "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": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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", - }, - "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "events.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineRole1094A815": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "codepipeline.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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", - }, - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleDefaultPolicyE4783D85": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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", - }, - "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": 365, - "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": "Delete", - "Properties": { - "RetentionInDays": 365, - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Delete", - }, - "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", - }, - "EFSFileSystem3D4FCE7F": { - "DeletionPolicy": "Delete", - "Properties": { - "Encrypted": true, - "FileSystemTags": [ - { - "Key": "Name", - "Value": "MyTestStack/EFSFileSystem", - }, - ], - }, - "Type": "AWS::EFS::FileSystem", - "UpdateReplacePolicy": "Delete", - }, - "EFSFileSystemEfsMountTarget178C2E276": { - "Properties": { - "FileSystemId": { - "Ref": "EFSFileSystem3D4FCE7F", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EFSFileSystemEfsSecurityGroup5486A2B1", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EFSFileSystemEfsMountTarget2F4D1BB6B": { - "Properties": { - "FileSystemId": { - "Ref": "EFSFileSystem3D4FCE7F", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EFSFileSystemEfsSecurityGroup5486A2B1", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EFSFileSystemEfsMountTarget3FFC5E69F": { - "Properties": { - "FileSystemId": { - "Ref": "EFSFileSystem3D4FCE7F", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EFSFileSystemEfsSecurityGroup5486A2B1", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EFSFileSystemEfsSecurityGroup5486A2B1": { - "Properties": { - "GroupDescription": "MyTestStack/EFSFileSystem/EfsSecurityGroup", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "Tags": [ - { - "Key": "Name", - "Value": "MyTestStack/EFSFileSystem", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "EFSFileSystemEfsSecurityGroupfromMyTestStackBuildProjectSecurityGroupA374A3A92049B46A9A5C": { - "Properties": { - "Description": "from MyTestStackBuildProjectSecurityGroupA374A3A9:2049", - "FromPort": 2049, - "GroupId": { - "Fn::GetAtt": [ - "EFSFileSystemEfsSecurityGroup5486A2B1", - "GroupId", - ], - }, - "IpProtocol": "tcp", - "SourceSecurityGroupId": { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - "ToPort": 2049, - }, - "Type": "AWS::EC2::SecurityGroupIngress", - }, - "EmbeddedLinuxBuildProject45760157": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - ], - "Properties": { - "Artifacts": { - "Type": "CODEPIPELINE", - }, - "Cache": { - "Type": "NO_CACHE", - }, - "EncryptionKey": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "Environment": { - "ComputeType": "BUILD_GENERAL1_XLARGE", - "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": "nfs", - "Location": { - "Fn::Join": [ - "", - [ - { - "Ref": "EFSFileSystem3D4FCE7F", - }, - ".efs.eu-central-1.amazonaws.com:/", - ], - ], - }, - "MountPoint": "/nfs", - "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": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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", - }, - "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "events.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineRole1094A815": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "codepipeline.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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", - }, - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleDefaultPolicyE4783D85": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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", - }, - "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": 365, - "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": "Delete", - "Properties": { - "RetentionInDays": 365, - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Delete", - }, - "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", - }, - "EFSFileSystem3D4FCE7F": { - "DeletionPolicy": "Delete", - "Properties": { - "Encrypted": true, - "FileSystemTags": [ - { - "Key": "Name", - "Value": "MyTestStack/EFSFileSystem", - }, - ], - }, - "Type": "AWS::EFS::FileSystem", - "UpdateReplacePolicy": "Delete", - }, - "EFSFileSystemEfsMountTarget178C2E276": { - "Properties": { - "FileSystemId": { - "Ref": "EFSFileSystem3D4FCE7F", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EFSFileSystemEfsSecurityGroup5486A2B1", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet1SubnetEF90658EEBA34A64", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EFSFileSystemEfsMountTarget2F4D1BB6B": { - "Properties": { - "FileSystemId": { - "Ref": "EFSFileSystem3D4FCE7F", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EFSFileSystemEfsSecurityGroup5486A2B1", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet2Subnet0764F5E844EB0F67", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EFSFileSystemEfsMountTarget3FFC5E69F": { - "Properties": { - "FileSystemId": { - "Ref": "EFSFileSystem3D4FCE7F", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EFSFileSystemEfsSecurityGroup5486A2B1", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucketPrivateSubnet3SubnetB0BAE95180198C81", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EFSFileSystemEfsSecurityGroup5486A2B1": { - "Properties": { - "GroupDescription": "MyTestStack/EFSFileSystem/EfsSecurityGroup", - "SecurityGroupEgress": [ - { - "CidrIp": "0.0.0.0/0", - "Description": "Allow all outbound traffic by default", - "IpProtocol": "-1", - }, - ], - "Tags": [ - { - "Key": "Name", - "Value": "MyTestStack/EFSFileSystem", - }, - ], - "VpcId": { - "Fn::ImportValue": "RepoStack:ExportsOutputRefBucket83908E7781C90AC0", - }, - }, - "Type": "AWS::EC2::SecurityGroup", - }, - "EFSFileSystemEfsSecurityGroupfromMyTestStackBuildProjectSecurityGroupA374A3A92049B46A9A5C": { - "Properties": { - "Description": "from MyTestStackBuildProjectSecurityGroupA374A3A9:2049", - "FromPort": 2049, - "GroupId": { - "Fn::GetAtt": [ - "EFSFileSystemEfsSecurityGroup5486A2B1", - "GroupId", - ], - }, - "IpProtocol": "tcp", - "SourceSecurityGroupId": { - "Fn::GetAtt": [ - "BuildProjectSecurityGroup28D27668", - "GroupId", - ], - }, - "ToPort": 2049, - }, - "Type": "AWS::EC2::SecurityGroupIngress", - }, - "EmbeddedLinuxBuildProject45760157": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - ], - "Properties": { - "Artifacts": { - "Type": "CODEPIPELINE", - }, - "Cache": { - "Type": "NO_CACHE", - }, - "EncryptionKey": { - "Fn::GetAtt": [ - "PipelineArtifactKeyEC0C0075", - "Arn", - ], - }, - "Environment": { - "ComputeType": "BUILD_GENERAL1_XLARGE", - "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": "nfs", - "Location": { - "Fn::Join": [ - "", - [ - { - "Ref": "EFSFileSystem3D4FCE7F", - }, - ".efs.eu-central-1.amazonaws.com:/", - ], - ], - }, - "MountPoint": "/nfs", - "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": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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", - }, - "EmbeddedLinuxPipelineEventsRoleDefaultPolicy7234197B": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "events.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineRole1094A815": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "codepipeline.amazonaws.com", - }, - }, - ], - "Version": "2012-10-17", - }, - }, - "Type": "AWS::IAM::Role", - }, - "EmbeddedLinuxPipelineRoleDefaultPolicyD23E75B9": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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", - }, - "EmbeddedLinuxPipelineSourceCodePipelineActionRoleDefaultPolicyE4783D85": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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": { - "DependsOn": [ - "EmbeddedLinuxBuildProjectPolicyDocumentBD98C4E9", - "EmbeddedLinuxBuildProject45760157", - "EmbeddedLinuxBuildProjectRoleDefaultPolicy59C0930B", - "EmbeddedLinuxBuildProjectRole4EBABAB2", - ], - "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", - }, - "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": 365, - "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": "Delete", - "Properties": { - "RetentionInDays": 365, - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Delete", - }, - "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": "2c3284e71ba6f2c28421a26a63b3f77e74abad491196ba63ec03dfb5b8674f59.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/deprecated/__snapshots__/network.test.ts.snap b/test/deprecated/__snapshots__/network.test.ts.snap deleted file mode 100644 index b0b119c..0000000 --- a/test/deprecated/__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": "Delete", - "Properties": { - "RetentionInDays": 365, - }, - "Type": "AWS::Logs::LogGroup", - "UpdateReplacePolicy": "Delete", - }, - "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/deprecated/__snapshots__/source-repo.test.ts.snap b/test/deprecated/__snapshots__/source-repo.test.ts.snap deleted file mode 100644 index 220ae8e..0000000 --- a/test/deprecated/__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": "2c3284e71ba6f2c28421a26a63b3f77e74abad491196ba63ec03dfb5b8674f59.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/deprecated/build-image-data-nag.test.ts b/test/deprecated/build-image-data-nag.test.ts deleted file mode 100644 index 6a39f1f..0000000 --- a/test/deprecated/build-image-data-nag.test.ts +++ /dev/null @@ -1,78 +0,0 @@ -import * as cdk from "aws-cdk-lib"; -import { BuildImageDataStack } from "../../lib/deprecated/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/deprecated/build-image-data.test.ts b/test/deprecated/build-image-data.test.ts deleted file mode 100644 index 63ef5eb..0000000 --- a/test/deprecated/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/deprecated/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/deprecated/build-image-pipeline-nag.test.ts b/test/deprecated/build-image-pipeline-nag.test.ts deleted file mode 100644 index cad5adc..0000000 --- a/test/deprecated/build-image-pipeline-nag.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -import * as cdk from "aws-cdk-lib"; -import { - BuildImagePipelineStack, - ImageKind, -} from "../../lib/deprecated/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/deprecated/build-image-pipeline.test.ts b/test/deprecated/build-image-pipeline.test.ts deleted file mode 100644 index c7ada37..0000000 --- a/test/deprecated/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/deprecated/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: 365, - }); - 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/deprecated/build-image-repo-nag.test.ts b/test/deprecated/build-image-repo-nag.test.ts deleted file mode 100644 index 3645cbf..0000000 --- a/test/deprecated/build-image-repo-nag.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { BuildImageRepoStack } from "../../lib/deprecated/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/deprecated/build-image-repo.test.ts b/test/deprecated/build-image-repo.test.ts deleted file mode 100644 index 99030c9..0000000 --- a/test/deprecated/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/deprecated/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/deprecated/embedded-linux-pipeline-nag.test.ts b/test/deprecated/embedded-linux-pipeline-nag.test.ts deleted file mode 100644 index aaa733b..0000000 --- a/test/deprecated/embedded-linux-pipeline-nag.test.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { EmbeddedLinuxPipelineStack } from "../../lib/deprecated/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/deprecated/embedded-linux-pipeline.test.ts b/test/deprecated/embedded-linux-pipeline.test.ts deleted file mode 100644 index 9400335..0000000 --- a/test/deprecated/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/deprecated/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: 365, - }); - }); - - 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/deprecated/network.test-nag.test.ts b/test/deprecated/network.test-nag.test.ts deleted file mode 100644 index 7f11fc3..0000000 --- a/test/deprecated/network.test-nag.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { PipelineNetworkStack } from "../../lib/deprecated/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/deprecated/network.test.ts b/test/deprecated/network.test.ts deleted file mode 100644 index 0da68dd..0000000 --- a/test/deprecated/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/deprecated/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: 365, - }); - }); - - 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/deprecated/source-repo-nag.test.ts b/test/deprecated/source-repo-nag.test.ts deleted file mode 100644 index 723c20d..0000000 --- a/test/deprecated/source-repo-nag.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { - SourceRepo, - ProjectKind, -} from "../../lib/deprecated/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/deprecated/source-repo.test.ts b/test/deprecated/source-repo.test.ts deleted file mode 100644 index 992a249..0000000 --- a/test/deprecated/source-repo.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as cdk from "aws-cdk-lib"; -import { Template } from "aws-cdk-lib/assertions"; -import { - SourceRepo, - ProjectKind, -} from "../../lib/deprecated/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/deprecated/util.ts b/test/deprecated/util.ts deleted file mode 100644 index 97fc9e8..0000000 --- a/test/deprecated/util.ts +++ /dev/null @@ -1,17 +0,0 @@ -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. - */ -export function normalizedTemplateFromStack(stack: cdk.Stack): Template { - const templateWithRandomKeys = Template.fromStack(stack); - const templateWithConstKeys = JSON.parse( - JSON.stringify(templateWithRandomKeys.toJSON()).replace( - /[a-z0-9]{64}\.(zip|sh)/g, - "arbitrary-file.ext", - ), - ); - - return templateWithConstKeys; -} From 8f31c9fbf58396cf7ca5db35bb6dfd8519866458 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 13 Feb 2025 17:09:53 +0100 Subject: [PATCH 056/112] switching to yarn --- .github/workflows/doc.yml | 34 +++++++++++++++++----------------- .github/workflows/test-cdk.yml | 8 ++++---- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 7b35f35..d16ea69 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -1,25 +1,25 @@ 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: Checkout + uses: actions/checkout@v3 - - name: Install and Build - run: | - npm ci - npm run doc + - name: Install and Build + run: | + yarn install --frozen-lockfile + yarn run doc - - name: Deploy - uses: JamesIves/github-pages-deploy-action@v4 - with: - folder: dist/docs + - name: Deploy + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: dist/docs diff --git a/.github/workflows/test-cdk.yml b/.github/workflows/test-cdk.yml index 1e41c1d..8f2cb45 100644 --- a/.github/workflows/test-cdk.yml +++ b/.github/workflows/test-cdk.yml @@ -19,7 +19,7 @@ jobs: uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - - run: npm ci - - run: npm run check - - run: npm run build --if-present - - run: npm test + - run: yarn install --frozen-lockfile + - run: yarn run check + - run: yarn run build --if-present + - run: yarn test From 2943ee93706dd2947fd864c575795f12926cca89 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 13 Feb 2025 17:09:53 +0100 Subject: [PATCH 057/112] switching to yarn --- .github/workflows/doc.yml | 34 +++++++++++++++++----------------- .github/workflows/test-cdk.yml | 8 ++++---- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index 7b35f35..d16ea69 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -1,25 +1,25 @@ 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: Checkout + uses: actions/checkout@v3 - - name: Install and Build - run: | - npm ci - npm run doc + - name: Install and Build + run: | + yarn install --frozen-lockfile + yarn run doc - - name: Deploy - uses: JamesIves/github-pages-deploy-action@v4 - with: - folder: dist/docs + - name: Deploy + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: dist/docs diff --git a/.github/workflows/test-cdk.yml b/.github/workflows/test-cdk.yml index 1e41c1d..a94ef29 100644 --- a/.github/workflows/test-cdk.yml +++ b/.github/workflows/test-cdk.yml @@ -19,7 +19,7 @@ jobs: uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - - run: npm ci - - run: npm run check - - run: npm run build --if-present - - run: npm test + - run: yarn install --frozen-lockfile + - run: yarn run check + - run: yarn run build + - run: yarn test From 78d855184a06630402cf9177beecfd5757e7571e Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 13 Feb 2025 17:26:43 +0100 Subject: [PATCH 058/112] fixing shell check --- source-repo/poky-ami/create-ec2-ami.sh | 2 +- source-repo/renesas/build.sh | 36 +++++++++++++------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/source-repo/poky-ami/create-ec2-ami.sh b/source-repo/poky-ami/create-ec2-ami.sh index b91671e..f0889b7 100644 --- a/source-repo/poky-ami/create-ec2-ami.sh +++ b/source-repo/poky-ami/create-ec2-ami.sh @@ -22,7 +22,7 @@ fi for arg in "$@" do - key=$(echo $arg | cut -f1 -d=) + key=$(echo "$arg" | cut -f1 -d=) len=${#key} val="${arg:$len+1}" diff --git a/source-repo/renesas/build.sh b/source-repo/renesas/build.sh index bb0ea43..b24ef3d 100644 --- a/source-repo/renesas/build.sh +++ b/source-repo/renesas/build.sh @@ -1,17 +1,17 @@ #!/bin/bash set -e -BOARD_LIST=("h3ulcb" "m3ulcb") -TARGET_BOARD=$1 -PROPRIETARY_DIR=`pwd`/proprietary -WORK=`pwd`/${TARGET_BOARD} +export BOARD_LIST=("h3ulcb" "m3ulcb") +export TARGET_BOARD=$1 +export PROPRIETARY_DIR="$(pwd)/proprietary" +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: " + echo "Usage: $0 \${TARGET_BOARD_NAME}" + echo "BOARD_NAME list: " for i in ${BOARD_LIST[@]}; do echo " - $i"; done exit } @@ -20,8 +20,8 @@ Usage () { 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 +29,18 @@ 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 +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 +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 From 0fec27dc968ae273dc6c199b752a0c2680c56713 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 14 Feb 2025 08:23:29 +0100 Subject: [PATCH 059/112] fixing shell check warnings --- source-repo/renesas/build.sh | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/source-repo/renesas/build.sh b/source-repo/renesas/build.sh index b24ef3d..d1710b8 100644 --- a/source-repo/renesas/build.sh +++ b/source-repo/renesas/build.sh @@ -1,23 +1,24 @@ #!/bin/bash set -e -export BOARD_LIST=("h3ulcb" "m3ulcb") export TARGET_BOARD=$1 -export PROPRIETARY_DIR="$(pwd)/proprietary" +export BOARD_LIST=("h3ulcb" "m3ulcb") +PROPRIETARY_DIR="$(pwd)/proprietary" +export PROPRIETARY_DIR WORK="$(pwd)/${TARGET_BOARD}" 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 + echo "Usage: $0 \${TARGET_BOARD_NAME}" + echo "BOARD_NAME list: " + 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}" @@ -36,6 +37,7 @@ mkdir -p "${WORK_PROP_DIR}" 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/ From 59f8c076723dda82bfb8f97e6152bd532449b683 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 14 Feb 2025 08:24:03 +0100 Subject: [PATCH 060/112] adjusting shell check script path --- .github/workflows/shellcheck.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml index 7c1181d..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 scripts/*.sh + run: for file in $(find ./source-repo -type f -iname "*.sh"); do shellcheck $file; done; From b6034de356ea6f2167598b653cacba2edbc05426 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 14 Feb 2025 08:32:13 +0100 Subject: [PATCH 061/112] pre-commit failures fixes --- .editorconfig | 2 +- .gitignore | 2 +- README.md | 44 ++++++++++++------------ package.json | 2 +- source-repo/base-image/Dockerfile | 4 +-- source-repo/poky-ami/build.buildspec.yml | 4 +-- source-repo/poky-ami/create-ec2-ami.sh | 1 - source-repo/poky-ami/manifest.xml | 2 +- source-repo/poky/manifest.xml | 2 +- utils/build-assets.sh | 2 +- 10 files changed, 32 insertions(+), 33 deletions(-) diff --git a/.editorconfig b/.editorconfig index 3a6cecc..402505f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,4 +6,4 @@ root = true # Unix-style newlines with a newline ending every file [*] end_of_line = lf -insert_final_newline = true \ No newline at end of file +insert_final_newline = true diff --git a/.gitignore b/.gitignore index bd4522b..a6c87aa 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,4 @@ cdk.context.json **/.DS_Store assets -source-zip \ No newline at end of file +source-zip diff --git a/README.md b/README.md index 2576bce..006bd5c 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ The [API documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci 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. +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. @@ -41,7 +41,7 @@ Each pipelines will refresh/re-run automatically every week using AWS EventBridg ### __Poky__ -The pipeline name will end with **`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. @@ -52,7 +52,7 @@ This example will build the `core-image-minimal` image from Poky using the repo ### __Poky EC2 AMI__ -The pipeline name will end with **`poky-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). @@ -63,9 +63,9 @@ Yocto can be used to create an EC2 AMI. This example builds an AMI based on Poky ### __Kas__ -The pipeline name will end with **`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. +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. @@ -76,9 +76,9 @@ This tool can help programatically manage layers and config with tighter Yocto i ### __QEmu__ -The pipeline name will end with **`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). +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. @@ -89,11 +89,11 @@ The Qemu image can be run in the CodeBuild environment. Using SLIRP networking, ### __NXP / IMX__ -The pipeline name will end with **`nxp`**. +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**. +**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. @@ -102,7 +102,7 @@ See the [IMX Yocto Users Guide](https://www.nxp.com/docs/en/user-guide/IMX_YOCTO - First build: **xx minutes** - Rebuild (without any change, just use sstate cache): **xx minutes** -### __Renesas__ +### __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. @@ -163,11 +163,11 @@ runs-on: ${{ vars.CODEBUILD_RUNNER_NAME }}-${{ github.run_id }}-${{ github.run_a with: -``` +``` runs-on: codebuild--${{ github.run_id }}-${{ github.run_attempt }} ``` -`` should be replaced by your AWS CodeBuild project name (`aws4el-ci-codebuild-project`). +`` 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. @@ -177,14 +177,14 @@ Refer to the following [example](https://github.com/aws4embeddedlinux/meta-aws-d ## 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. +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. -> +> You can also use the [sample project code](https://github.com/aws4embeddedlinux/aws4embeddedlinux-ci-examples) provided to get started and deploy the stacks. @@ -192,7 +192,7 @@ You can also use the [sample project code](https://github.com/aws4embeddedlinux/ ### Setting Up A New Project -In order to create a new project, you will need to initialize a new CDK project. +In order to create a new project, you will need to initialize a new CDK project. More details can be found in the [CDK Getting Started Documentation](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html). @@ -211,7 +211,7 @@ yarn install yarn add github:aws4embeddedlinux/aws4embeddedlinux-ci ``` -Once added, you can start creatin your application using the library. +Once added, you can start creatin your application using the library. For example, you can start by importing classes using: @@ -254,13 +254,13 @@ Once you have completed the code of your application, you can deploy the CDK sta cdk deploy ``` -After the CDK application is successfully deployed, the 'Base Image' pipeline needs to complete successfully. +After the CDK application is successfully deployed, the 'Base Image' pipeline needs to complete successfully. -This will create an Ubuntu based container for building the Yocto images. +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. +> 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. > @@ -294,7 +294,7 @@ yarn link "aws4embeddedlinux-cdk-lib" yarn run build ``` -This will link through the system `node_modules` install. +This will link through the system `node_modules` install. > _Note:_ > @@ -310,7 +310,7 @@ This will link through the system `node_modules` install. > _Note:_ > -> When using a system node install on Linux, this can require sudo access. +> 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 @@ -348,7 +348,7 @@ The following steps detaisl at a high level, how you can enable the use of AWS S }); ``` -- The secret can then be used in the CodeBuild Project by adding it to the BuildSpec. +- The secret can then be used in the CodeBuild Project by adding it to the BuildSpec. ```yaml env: diff --git a/package.json b/package.json index 00aab13..547636e 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "test": "yarn run prebuild && jest", "update-snapshot": "yarn run prebuild && jest -u", "prepare": "yarn run build", - "prepare-commit": "yarn run clean && yarn run format && yarn run build && yarn run check && yarn run test " + "prepare-commit": "yarn run clean && yarn run format && yarn run build && yarn run check && yarn run test & pre-commit run --all-files --color=always --show-diff-on-failure" }, "dependencies": { "aws-cdk-lib": "2.176.0", diff --git a/source-repo/base-image/Dockerfile b/source-repo/base-image/Dockerfile index 530c01b..b0faabb 100644 --- a/source-repo/base-image/Dockerfile +++ b/source-repo/base-image/Dockerfile @@ -25,7 +25,7 @@ RUN unzip -qq /tmp/awscliv2.zip -d /tmp RUN /tmp/aws/install # install kas tool -RUN pip3 install -q PyYAML==5.3.1 -q && pip3 install -q 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 @@ -34,7 +34,7 @@ RUN groupadd -g 1000 yoctouser RUN useradd -u 1000 -g 1000 -m yoctouser # These will be mount points for an EFS volume. This allows the cache to be reused. -RUN mkdir -p /nfs && chown -R yoctouser /nfs && chmod -R 755 /nfs +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"' diff --git a/source-repo/poky-ami/build.buildspec.yml b/source-repo/poky-ami/build.buildspec.yml index 78b73a7..005f64e 100644 --- a/source-repo/poky-ami/build.buildspec.yml +++ b/source-repo/poky-ami/build.buildspec.yml @@ -73,7 +73,7 @@ phases: 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 /nfs/sstate-cache -atime +30 -type f -delete # only delete empty dirs @@ -83,7 +83,7 @@ phases: # only delete empty dirs - 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/source-repo/poky-ami/create-ec2-ami.sh b/source-repo/poky-ami/create-ec2-ami.sh index f0889b7..a8ea80a 100644 --- a/source-repo/poky-ami/create-ec2-ami.sh +++ b/source-repo/poky-ami/create-ec2-ami.sh @@ -204,4 +204,3 @@ else echo "Backup Failed, exiting" exit 2 fi - diff --git a/source-repo/poky-ami/manifest.xml b/source-repo/poky-ami/manifest.xml index ea62b95..c3564a4 100644 --- a/source-repo/poky-ami/manifest.xml +++ b/source-repo/poky-ami/manifest.xml @@ -12,4 +12,4 @@ revision="2d8b3cba8ff27c9ec2187a52b6a551fe1dcfaa07" /> - \ No newline at end of file + diff --git a/source-repo/poky/manifest.xml b/source-repo/poky/manifest.xml index ea62b95..c3564a4 100644 --- a/source-repo/poky/manifest.xml +++ b/source-repo/poky/manifest.xml @@ -12,4 +12,4 @@ revision="2d8b3cba8ff27c9ec2187a52b6a551fe1dcfaa07" /> - \ No newline at end of file + diff --git a/utils/build-assets.sh b/utils/build-assets.sh index 187d93d..425cd67 100755 --- a/utils/build-assets.sh +++ b/utils/build-assets.sh @@ -5,6 +5,6 @@ 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 +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 From a75c8f53c009233a943314304728d4a49db314da Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 14 Feb 2025 08:49:03 +0100 Subject: [PATCH 062/112] pre-commit failures fixes --- .../codepipeline-embedded-linux-base-image.test.ts.snap | 2 +- test/__snapshots__/codepipeline-embedded-linux.test.ts.snap | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap index 9707429..4c808c7 100644 --- a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap @@ -456,7 +456,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, "Type": "AWS::IAM::Policy", }, - "CodePipelineBuildBaseImageCodePipelineMyTestStackCodePipelineBuildBaseImageCodePipelineFF25ACC6SourceEventRulebaseimage463ab4e34f1fc19129697c4ba70a2910697e6f4dc82b08fdabb32f2eed60a01fzip4059CF7E": { + "CodePipelineBuildBaseImageCodePipelineMyTestStackCodePipelineBuildBaseImageCodePipelineFF25ACC6SourceEventRulebaseimage1ccdf1583059080a3911192a20ae50cc6b3bfa57d56d0b5b4d3866f920b3ad20zip04E1981E": { "DependsOn": [ "CodePipelineBuildBaseImageProject69590E59", "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", diff --git a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap index 9bb090c..22deb32 100644 --- a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap @@ -840,7 +840,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "Type": "AWS::EC2::SecurityGroupIngress", }, - "EmbeddedLinuxCodePipelineMyTestStackEmbeddedLinuxCodePipelineE5C7D172SourceEventRulepoky2c3284e71ba6f2c28421a26a63b3f77e74abad491196ba63ec03dfb5b8674f59zipE030E80D": { + "EmbeddedLinuxCodePipelineMyTestStackEmbeddedLinuxCodePipelineE5C7D172SourceEventRulepokyf48cd2a94def24552abdd5b6ef9ffe6137be08fbc49a17964c6f7cae81245d5dzipEC68B3DA": { "DependsOn": [ "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", "EmbeddedLinuxCodePipelineProjectF55E3B36", From 8ae5a97282cef4901292b4b10d000dd288b7e124 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 14 Feb 2025 11:01:19 +0100 Subject: [PATCH 063/112] adding a post install script to force dist folder generation on install --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 547636e..291587a 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "test": "yarn run prebuild && jest", "update-snapshot": "yarn run prebuild && jest -u", "prepare": "yarn run build", - "prepare-commit": "yarn run clean && yarn run format && yarn run build && yarn run check && yarn run test & pre-commit run --all-files --color=always --show-diff-on-failure" + "prepare-commit": "yarn run clean && yarn run format && yarn run build && yarn run check && yarn run test & pre-commit run --all-files --color=always --show-diff-on-failure", + "postinstall": "yarn build" }, "dependencies": { "aws-cdk-lib": "2.176.0", From 6d7a88308e44407924cb85374079d572469d5f8f Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 14 Feb 2025 12:35:56 +0100 Subject: [PATCH 064/112] reveerting change --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 291587a..547636e 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,7 @@ "test": "yarn run prebuild && jest", "update-snapshot": "yarn run prebuild && jest -u", "prepare": "yarn run build", - "prepare-commit": "yarn run clean && yarn run format && yarn run build && yarn run check && yarn run test & pre-commit run --all-files --color=always --show-diff-on-failure", - "postinstall": "yarn build" + "prepare-commit": "yarn run clean && yarn run format && yarn run build && yarn run check && yarn run test & pre-commit run --all-files --color=always --show-diff-on-failure" }, "dependencies": { "aws-cdk-lib": "2.176.0", From e27750e33b7415b6acbc0589a8583aae9d9e86aa Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 19 Feb 2025 08:56:58 +0100 Subject: [PATCH 065/112] adjusting lifecycle scripts --- package.json | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 547636e..3f13dbf 100644 --- a/package.json +++ b/package.json @@ -6,18 +6,21 @@ "license": "MIT", "scripts": { "build": "tsc", - "watch": "tsc -w", - "cdk": "cdk", - "clean": "tsc --build --clean && rm -rf dist && rm -rf source-zip && rm -rf cdk.out", + "check": "eslint '**/*.{js,ts,json}'", + "clean": "tsc --build --clean", "doc": "typedoc --sort source-order --readme README.md", "format": "eslint '**/*.{js,ts,json}' --quiet --fix", - "check": "eslint '**/*.{js,ts,json}'", - "build-assets": "./utils/build-assets.sh", - "prebuild": "yarn run build-assets", - "test": "yarn run prebuild && jest", - "update-snapshot": "yarn run prebuild && jest -u", - "prepare": "yarn run build", - "prepare-commit": "yarn run clean && yarn run format && yarn run build && yarn run check && yarn run test & pre-commit run --all-files --color=always --show-diff-on-failure" + "prepare": "yarn build", + "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", From 3a65fdfd695d678cd19409e09576131c94b5f5d9 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 19 Feb 2025 13:45:40 +0100 Subject: [PATCH 066/112] updating to Yarn 2 (v4.6.0) --- .gitignore | 9 + .yarnrc.yml | 1 + README.md | 14 +- package.json | 6 +- yarn.lock | 8051 ++++++++++++++++++++++++++++++-------------------- 5 files changed, 4869 insertions(+), 3212 deletions(-) create mode 100644 .yarnrc.yml diff --git a/.gitignore b/.gitignore index a6c87aa..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 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 006bd5c..657fbfd 100644 --- a/README.md +++ b/README.md @@ -204,13 +204,21 @@ cd my-project cdk init app --language typescript ``` -Then you will need to install the CDK library including the `aws4embeddedlinux-ci` library: +Then you will need to install the CDK library including the `aws4embeddedlinux-ci` library either using `npm`: + +```bash +npm install aws4embeddedlinux/aws4embeddedlinux-ci +``` + +of `yarn': ```bash -yarn install yarn add github:aws4embeddedlinux/aws4embeddedlinux-ci +yarn install ``` +> If you are not familliar with Yarn, please refer to the [documentation](https://yarnpkg.com/getting-started). + Once added, you can start creatin your application using the library. For example, you can start by importing classes using: @@ -276,6 +284,8 @@ Once your pipelines completes successfully, the Yocto deploy directory generated ## 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: diff --git a/package.json b/package.json index 3f13dbf..bf40894 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "clean": "tsc --build --clean", "doc": "typedoc --sort source-order --readme README.md", "format": "eslint '**/*.{js,ts,json}' --quiet --fix", - "prepare": "yarn build", + "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", @@ -54,5 +55,6 @@ }, "overrides": { "glob": "^9.3.5" - } + }, + "packageManager": "yarn@4.6.0" } diff --git a/yarn.lock b/yarn.lock index bc38821..542ddf3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,3208 +1,4843 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@aws-cdk/asset-awscli-v1@^2.2.208": - version "2.2.220" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.220.tgz#2ab5a4006ed1e6a98adafc4f3379b59d42eedad9" - integrity sha512-2eXZnnIgwWmXc7eRh8mRKPp6yHTKiQrLziRX/oVSfp4M6Jn2no0QFKJoHWqziF5MDQa5TF8qhD4FGsls/1nYPg== - -"@aws-cdk/asset-kubectl-v20@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.3.tgz#80e09004be173995e91614e34d947da11dd9ff4d" - integrity sha512-cDG1w3ieM6eOT9mTefRuTypk95+oyD7P5X/wRltwmYxU7nZc3+076YEVS6vrjDKr3ADYbfn0lDKpfB1FBtO9CQ== - -"@aws-cdk/asset-node-proxy-agent-v6@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.0.tgz#6d3c7860354d4856a7e75375f2f0ecab313b4989" - integrity sha512-7bY3J8GCVxLupn/kNmpPc5VJz8grx+4RKfnnJiO1LG+uxkZfANZG3RMHhE+qQxxwkyQ9/MfPtTpf748UhR425A== - -"@aws-cdk/cloud-assembly-schema@^39.0.1": - version "39.2.5" - resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-39.2.5.tgz#c7c6a9866262e43e4d777934dcc3804191a586db" - integrity sha512-2065lXgoHT7XzrL5bm+jIutUNNBTDFBOSSgQNdHntTkl7Ljhyaithp2Ppayy1aLmShW12S1yJ+6JAGzE4M7EGg== - dependencies: - jsonschema "~1.4.1" - semver "^7.6.3" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/compat-data@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" - integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.7.tgz#0439347a183b97534d52811144d763a17f9d2b24" - integrity sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.5" - "@babel/helper-compilation-targets" "^7.26.5" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.7" - "@babel/parser" "^7.26.7" - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.26.7" - "@babel/types" "^7.26.7" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.26.5", "@babel/generator@^7.7.2": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" - integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== - dependencies: - "@babel/parser" "^7.26.5" - "@babel/types" "^7.26.5" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - -"@babel/helper-compilation-targets@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" - integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== - dependencies: - "@babel/compat-data" "^7.26.5" - "@babel/helper-validator-option" "^7.25.9" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-module-imports@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" - integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/helper-module-transforms@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" - integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== - dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" - integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== - -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== - -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - -"@babel/helper-validator-option@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" - integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== - -"@babel/helpers@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.7.tgz#fd1d2a7c431b6e39290277aacfd8367857c576a4" - integrity sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A== - dependencies: - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.7" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.7.tgz#e114cd099e5f7d17b05368678da0fb9f69b3385c" - integrity sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w== - dependencies: - "@babel/types" "^7.26.7" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" - integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" - integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" - integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/template@^7.25.9", "@babel/template@^7.3.3": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.7.tgz#99a0a136f6a75e7fb8b0a1ace421e0b25994b8bb" - integrity sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.5" - "@babel/parser" "^7.26.7" - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.7" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.5", "@babel/types@^7.26.7", "@babel/types@^7.3.3": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.7.tgz#5e2b89c0768e874d4d061961f3a5a153d71dc17a" - integrity sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - -"@balena/dockerignore@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@balena/dockerignore/-/dockerignore-1.0.2.tgz#9ffe4726915251e8eb69f44ef3547e0da2c03e0d" - integrity sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q== - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" - integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": - version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== - -"@eslint/compat@^1.2.4": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@eslint/compat/-/compat-1.2.5.tgz#438f8bbe105341853469b2cf2d10b6321cadeb3a" - integrity sha512-5iuG/StT+7OfvhoBHPlmxkPA9om6aDUFgmD4+mWKAGsYt4vCe8rypneG03AuseyRHBmcCLXQtIH5S26tIoggLg== - -"@eslint/config-array@^0.19.0": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.1.tgz#734aaea2c40be22bbb1f2a9dac687c57a6a4c984" - integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== - dependencies: - "@eslint/object-schema" "^2.1.5" - debug "^4.3.1" - minimatch "^3.1.2" - -"@eslint/core@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.10.0.tgz#23727063c21b335f752dbb3a16450f6f9cbc9091" - integrity sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/eslintrc@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c" - integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@9.19.0", "@eslint/js@^9.16.0": - version "9.19.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.19.0.tgz#51dbb140ed6b49d05adc0b171c41e1a8713b7789" - integrity sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ== - -"@eslint/object-schema@^2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.5.tgz#8670a8f6258a2be5b2c620ff314a1d984c23eb2e" - integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== - -"@eslint/plugin-kit@^0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz#ee07372035539e7847ef834e3f5e7b79f09e3a81" - integrity sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A== - dependencies: - "@eslint/core" "^0.10.0" - levn "^0.4.1" - -"@gerrit0/mini-shiki@^1.24.0": - version "1.27.2" - resolved "https://registry.yarnpkg.com/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz#cf2a9fcb08a6581c78fc94821f0c854ec4b9f899" - integrity sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og== - dependencies: - "@shikijs/engine-oniguruma" "^1.27.2" - "@shikijs/types" "^1.27.2" - "@shikijs/vscode-textmate" "^10.0.1" - -"@humanfs/core@^0.19.1": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" - integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== - -"@humanfs/node@^0.16.6": - version "0.16.6" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" - integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== - dependencies: - "@humanfs/core" "^0.19.1" - "@humanwhocodes/retry" "^0.3.0" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/retry@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" - integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== - -"@humanwhocodes/retry@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b" - integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" - integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@microsoft/tsdoc-config@0.17.1": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz#e0f0b50628f4ad7fe121ca616beacfe6a25b9335" - integrity sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw== - dependencies: - "@microsoft/tsdoc" "0.15.1" - ajv "~8.12.0" - jju "~1.4.0" - resolve "~1.22.2" - -"@microsoft/tsdoc@0.15.1": - version "0.15.1" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz#d4f6937353bc4568292654efb0a0e0532adbcba2" - integrity sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@pkgr/core@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" - integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== - -"@shikijs/engine-oniguruma@^1.27.2": - version "1.29.1" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.1.tgz#118de735cb4e5a07d8792969342b988d2cfda01c" - integrity sha512-gSt2WhLNgEeLstcweQOSp+C+MhOpTsgdNXRqr3zP6M+BUBZ8Md9OU2BYwUYsALBxHza7hwaIWtFHjQ/aOOychw== - dependencies: - "@shikijs/types" "1.29.1" - "@shikijs/vscode-textmate" "^10.0.1" - -"@shikijs/types@1.29.1", "@shikijs/types@^1.27.2": - version "1.29.1" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.29.1.tgz#41f05dac7203f64ac0ac3c4b7dc75cb6b85f76f5" - integrity sha512-aBqAuhYRp5vSir3Pc9+QPu9WESBOjUo03ao0IHLC4TyTioSsp/SkbAZSrIH4ghYYC1T1KTEpRSBa83bas4RnPA== - dependencies: - "@shikijs/vscode-textmate" "^10.0.1" - "@types/hast" "^3.0.4" - -"@shikijs/vscode-textmate@^10.0.1": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz#d06d45b67ac5e9b0088e3f67ebd3f25c6c3d711a" - integrity sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sinonjs/commons@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/babel__core@^7.1.14": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" - integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== - dependencies: - "@babel/types" "^7.20.7" - -"@types/estree@^1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/hast@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" - integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== - dependencies: - "@types/unist" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.5.14": - version "29.5.14" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" - integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/node@*": - version "22.10.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.10.tgz#85fe89f8bf459dc57dfef1689bd5b52ad1af07e6" - integrity sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww== - dependencies: - undici-types "~6.20.0" - -"@types/node@20.14.8": - version "20.14.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.8.tgz#45c26a2a5de26c3534a9504530ddb3b27ce031ac" - integrity sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA== - dependencies: - undici-types "~5.26.4" - -"@types/stack-utils@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== - -"@types/unist@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" - integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^17.0.8": - version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@8.21.0", "@typescript-eslint/eslint-plugin@^8.18.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz#395014a75112ecdb81142b866ab6bb62e3be0f2a" - integrity sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.21.0" - "@typescript-eslint/type-utils" "8.21.0" - "@typescript-eslint/utils" "8.21.0" - "@typescript-eslint/visitor-keys" "8.21.0" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^2.0.0" - -"@typescript-eslint/parser@8.21.0", "@typescript-eslint/parser@^8.18.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.21.0.tgz#312c638aaba4f640d45bfde7c6795a9d75deb088" - integrity sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA== - dependencies: - "@typescript-eslint/scope-manager" "8.21.0" - "@typescript-eslint/types" "8.21.0" - "@typescript-eslint/typescript-estree" "8.21.0" - "@typescript-eslint/visitor-keys" "8.21.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@8.21.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz#d08d94e2a34b4ccdcc975543c25bb62917437500" - integrity sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA== - dependencies: - "@typescript-eslint/types" "8.21.0" - "@typescript-eslint/visitor-keys" "8.21.0" - -"@typescript-eslint/type-utils@8.21.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz#2e69d1a93cdbedc73fe694cd6ae4dfedd00430a0" - integrity sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ== - dependencies: - "@typescript-eslint/typescript-estree" "8.21.0" - "@typescript-eslint/utils" "8.21.0" - debug "^4.3.4" - ts-api-utils "^2.0.0" - -"@typescript-eslint/types@8.21.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.21.0.tgz#58f30aec8db8212fd886835dc5969cdf47cb29f5" - integrity sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A== - -"@typescript-eslint/typescript-estree@8.21.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz#5ce71acdbed3b97b959f6168afba5a03c88f69a9" - integrity sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg== - dependencies: - "@typescript-eslint/types" "8.21.0" - "@typescript-eslint/visitor-keys" "8.21.0" - 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 "^2.0.0" - -"@typescript-eslint/utils@8.21.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.21.0.tgz#bc4874fbc30feb3298b926e3b03d94570b3999c5" - integrity sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.21.0" - "@typescript-eslint/types" "8.21.0" - "@typescript-eslint/typescript-estree" "8.21.0" - -"@typescript-eslint/visitor-keys@8.21.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz#a89744c4cdc83b5c761eb5878befe6c33d1481b2" - integrity sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w== - dependencies: - "@typescript-eslint/types" "8.21.0" - eslint-visitor-keys "^4.2.0" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== - dependencies: - acorn "^8.11.0" - -acorn@^8.11.0, acorn@^8.14.0, acorn@^8.4.1: - version "8.14.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" - integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ajv@~8.12.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async@^3.2.3: - version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" - integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== - -aws-cdk-lib@2.176.0: - version "2.176.0" - resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.176.0.tgz#1ea69b54aef35ddd8f8e57a2059e5bd2f0ba42a3" - integrity sha512-6Gs2kBaq4elQ4fNAOiCgbD9oOLx/heb/Lp4OVE6Uf7FulYW0DikWJXxR5GWJslTJ4/sCf3UU91q415fc0bruLg== - 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.0.1" - "@balena/dockerignore" "^1.0.2" - case "1.6.3" - fs-extra "^11.2.0" - ignore "^5.3.2" - jsonschema "^1.4.1" - mime-types "^2.1.35" - minimatch "^3.1.2" - punycode "^2.3.1" - semver "^7.6.3" - table "^6.8.2" - yaml "1.10.2" - -aws-cdk@2.176.0: - version "2.176.0" - resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-2.176.0.tgz#46966fb466254470f14c42df75ec99fb76b571b8" - integrity sha512-yRjIXzK2ddznwuSjasWAViYBtBSQbEu6GHlylaC3GHsIUPhrK3KguqIuhdlxjMeiQ1Fvok8REDLCReZJdrSLLg== - optionalDependencies: - fsevents "2.3.2" - -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" - integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-import-attributes" "^7.24.7" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.24.0: - version "4.24.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" - integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== - dependencies: - caniuse-lite "^1.0.30001688" - electron-to-chromium "^1.5.73" - node-releases "^2.0.19" - update-browserslist-db "^1.1.1" - -bs-logger@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001688: - version "1.0.30001695" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz#39dfedd8f94851132795fdf9b79d29659ad9c4d4" - integrity sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw== - -case@1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" - integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== - -cdk-nag@^2.35.0: - version "2.35.0" - resolved "https://registry.yarnpkg.com/cdk-nag/-/cdk-nag-2.35.0.tgz#2c267ffa48c8567971752783c20a3fa8aea41283" - integrity sha512-jH2cff8abe6MF28N3qDOP97+vbcYZMjoFZutipD+rRtqm2uk7BoStayInUt+s9L15mKLZq6Z/8YELIzy+rDLIQ== - -chalk@^4.0.0, chalk@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cjs-module-lexer@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" - integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" - integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -constructs@^10.4.2: - version "10.4.2" - resolved "https://registry.yarnpkg.com/constructs/-/constructs-10.4.2.tgz#e875a78bef932cca12ea63965969873a25c1c132" - integrity sha512-wsNxBlAott2qg8Zv87q3eYZYgheb9lchtBfjHzzLHtXbttwSrHPs1NNQbBrmbb1YZvYg2+Vh0Dor76w4mFxJkA== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.3, cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - -dedent@^1.0.0: - version "1.5.3" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" - integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -ejs@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" - integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== - dependencies: - jake "^10.8.5" - -electron-to-chromium@^1.5.73: - version "1.5.88" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz#cdb6e2dda85e6521e8d7d3035ba391c8848e073a" - integrity sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escalade@^3.1.1, escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" - integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== - -eslint-plugin-prettier@^5.2.1: - version "5.2.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz#c4af01691a6fa9905207f0fbba0d7bea0902cce5" - integrity sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw== - dependencies: - prettier-linter-helpers "^1.0.0" - synckit "^0.9.1" - -eslint-plugin-tsdoc@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.4.0.tgz#b14104e96ceb8add2054bf39e0cfc12b9a9586e6" - integrity sha512-MT/8b4aKLdDClnS8mP3R/JNjg29i0Oyqd/0ym6NnQf+gfKbJJ4ZcSh2Bs1H0YiUMTBwww5JwXGTWot/RwyJ7aQ== - dependencies: - "@microsoft/tsdoc" "0.15.1" - "@microsoft/tsdoc-config" "0.17.1" - -eslint-scope@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442" - integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" - integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== - -eslint@^9.16.0: - version "9.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.19.0.tgz#ffa1d265fc4205e0f8464330d35f09e1d548b1bf" - integrity sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.19.0" - "@eslint/core" "^0.10.0" - "@eslint/eslintrc" "^3.2.0" - "@eslint/js" "9.19.0" - "@eslint/plugin-kit" "^0.2.5" - "@humanfs/node" "^0.16.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.1" - "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.6" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.2.0" - eslint-visitor-keys "^4.2.0" - espree "^10.3.0" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - json-stable-stringify-without-jsonify "^1.0.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - -espree@^10.0.1, espree@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" - integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== - dependencies: - acorn "^8.14.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.2.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.0.0, expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-uri@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" - integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== - -fastq@^1.6.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" - integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - -filelist@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - -flatted@^3.2.9: - version "3.3.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" - integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== - -fs-extra@^11.2.0: - version "11.3.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" - integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fsevents@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3, glob@^7.1.4, glob@^9.3.5: - version "9.3.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" - integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== - dependencies: - fs.realpath "^1.0.0" - minimatch "^8.0.2" - minipass "^4.2.4" - path-scurry "^1.6.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - -globals@^15.13.0: - version "15.14.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.14.0.tgz#b8fd3a8941ff3b4d38f3319d433b61bbb482e73f" - integrity sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -ignore@^5.2.0, ignore@^5.3.1, ignore@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" - integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-core-module@^2.16.0: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - 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" - -istanbul-lib-instrument@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" - integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== - 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" - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jake@^10.8.5: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" - integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== - dependencies: - async "^3.2.3" - chalk "^4.0.2" - filelist "^1.0.4" - minimatch "^3.1.2" - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - 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" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@^29.0.0, jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - -jju@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" - integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonschema@^1.4.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.5.0.tgz#f6aceb1ab9123563dd901d05f81f9d4883d3b7d8" - integrity sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw== - -jsonschema@~1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" - integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== - -keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -linkify-it@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" - integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== - dependencies: - uc.micro "^2.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -make-error@^1.1.1, make-error@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -markdown-it@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" - integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== - dependencies: - argparse "^2.0.1" - entities "^4.4.0" - linkify-it "^5.0.0" - mdurl "^2.0.0" - punycode.js "^2.3.1" - uc.micro "^2.1.0" - -mdurl@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" - integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4, micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.35: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^8.0.2: - version "8.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" - integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.4, minimatch@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minipass@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" - integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.6.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -picocolors@^1.0.0, picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pirates@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" - integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== - -pretty-format@^29.0.0, pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -punycode.js@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" - integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== - -punycode@^2.1.0, punycode@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" - integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== - -resolve@^1.20.0, resolve@~1.22.2: - version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -synckit@^0.9.1: - version "0.9.2" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" - integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== - dependencies: - "@pkgr/core" "^0.1.0" - tslib "^2.6.2" - -table@^6.8.2: - version "6.9.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5" - integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== - 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" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-api-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.0.tgz#b9d7d5f7ec9f736f4d0f09758b8607979044a900" - integrity sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ== - -ts-jest@^29.2.5: - version "29.2.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" - integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== - dependencies: - bs-logger "^0.2.6" - ejs "^3.1.10" - fast-json-stable-stringify "^2.1.0" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "^4.1.2" - make-error "^1.3.6" - semver "^7.6.3" - yargs-parser "^21.1.1" - -ts-node@^10.9.2: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tslib@^2.6.2: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -typedoc@^0.27.4: - version "0.27.6" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.27.6.tgz#7e8d067bd5386b7908afcb12c9054a83e8bb326b" - integrity sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw== - dependencies: - "@gerrit0/mini-shiki" "^1.24.0" - lunr "^2.3.9" - markdown-it "^14.1.0" - minimatch "^9.0.5" - yaml "^2.6.1" - -typescript-eslint@^8.18.0: - version "8.21.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.21.0.tgz#78bdb83a6d771f0312b128297d84a3111885fd08" - integrity sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw== - dependencies: - "@typescript-eslint/eslint-plugin" "8.21.0" - "@typescript-eslint/parser" "8.21.0" - "@typescript-eslint/utils" "8.21.0" - -typescript@~5.7.2: - version "5.7.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" - integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== - -uc.micro@^2.0.0, uc.micro@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" - integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -update-browserslist-db@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" - integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-to-istanbul@^9.0.1: - version "9.3.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" - integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yaml@1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yaml@^2.6.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" - integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +# 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 From 022d6358ce0f8ca53ea5070d66fcf4b88729d33a Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 19 Feb 2025 13:45:40 +0100 Subject: [PATCH 067/112] updating to Yarn 2 (v4.6.0) --- .github/workflows/test-cdk.yml | 21 +- .gitignore | 9 + .yarn/sdks/eslint/package.json | 27 + .yarnrc.yml | 1 + README.md | 14 +- package.json | 6 +- yarn.lock | 8051 +++++++++++++++++++------------- 7 files changed, 4913 insertions(+), 3216 deletions(-) create mode 100644 .yarn/sdks/eslint/package.json create mode 100644 .yarnrc.yml diff --git a/.github/workflows/test-cdk.yml b/.github/workflows/test-cdk.yml index a94ef29..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: yarn install --frozen-lockfile + cache: "yarn" + - run: yarn install --immutable - run: yarn run check - run: yarn run build - run: yarn test diff --git a/.gitignore b/.gitignore index a6c87aa..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 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 006bd5c..657fbfd 100644 --- a/README.md +++ b/README.md @@ -204,13 +204,21 @@ cd my-project cdk init app --language typescript ``` -Then you will need to install the CDK library including the `aws4embeddedlinux-ci` library: +Then you will need to install the CDK library including the `aws4embeddedlinux-ci` library either using `npm`: + +```bash +npm install aws4embeddedlinux/aws4embeddedlinux-ci +``` + +of `yarn': ```bash -yarn install yarn add github:aws4embeddedlinux/aws4embeddedlinux-ci +yarn install ``` +> If you are not familliar with Yarn, please refer to the [documentation](https://yarnpkg.com/getting-started). + Once added, you can start creatin your application using the library. For example, you can start by importing classes using: @@ -276,6 +284,8 @@ Once your pipelines completes successfully, the Yocto deploy directory generated ## 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: diff --git a/package.json b/package.json index 3f13dbf..bf40894 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "clean": "tsc --build --clean", "doc": "typedoc --sort source-order --readme README.md", "format": "eslint '**/*.{js,ts,json}' --quiet --fix", - "prepare": "yarn build", + "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", @@ -54,5 +55,6 @@ }, "overrides": { "glob": "^9.3.5" - } + }, + "packageManager": "yarn@4.6.0" } diff --git a/yarn.lock b/yarn.lock index bc38821..542ddf3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,3208 +1,4843 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@aws-cdk/asset-awscli-v1@^2.2.208": - version "2.2.220" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.220.tgz#2ab5a4006ed1e6a98adafc4f3379b59d42eedad9" - integrity sha512-2eXZnnIgwWmXc7eRh8mRKPp6yHTKiQrLziRX/oVSfp4M6Jn2no0QFKJoHWqziF5MDQa5TF8qhD4FGsls/1nYPg== - -"@aws-cdk/asset-kubectl-v20@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.3.tgz#80e09004be173995e91614e34d947da11dd9ff4d" - integrity sha512-cDG1w3ieM6eOT9mTefRuTypk95+oyD7P5X/wRltwmYxU7nZc3+076YEVS6vrjDKr3ADYbfn0lDKpfB1FBtO9CQ== - -"@aws-cdk/asset-node-proxy-agent-v6@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.0.tgz#6d3c7860354d4856a7e75375f2f0ecab313b4989" - integrity sha512-7bY3J8GCVxLupn/kNmpPc5VJz8grx+4RKfnnJiO1LG+uxkZfANZG3RMHhE+qQxxwkyQ9/MfPtTpf748UhR425A== - -"@aws-cdk/cloud-assembly-schema@^39.0.1": - version "39.2.5" - resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-39.2.5.tgz#c7c6a9866262e43e4d777934dcc3804191a586db" - integrity sha512-2065lXgoHT7XzrL5bm+jIutUNNBTDFBOSSgQNdHntTkl7Ljhyaithp2Ppayy1aLmShW12S1yJ+6JAGzE4M7EGg== - dependencies: - jsonschema "~1.4.1" - semver "^7.6.3" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/compat-data@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" - integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.7.tgz#0439347a183b97534d52811144d763a17f9d2b24" - integrity sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.5" - "@babel/helper-compilation-targets" "^7.26.5" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.7" - "@babel/parser" "^7.26.7" - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.26.7" - "@babel/types" "^7.26.7" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.26.5", "@babel/generator@^7.7.2": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" - integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== - dependencies: - "@babel/parser" "^7.26.5" - "@babel/types" "^7.26.5" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - -"@babel/helper-compilation-targets@^7.26.5": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" - integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== - dependencies: - "@babel/compat-data" "^7.26.5" - "@babel/helper-validator-option" "^7.25.9" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-module-imports@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" - integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/helper-module-transforms@^7.26.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" - integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== - dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.26.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" - integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== - -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== - -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - -"@babel/helper-validator-option@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" - integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== - -"@babel/helpers@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.7.tgz#fd1d2a7c431b6e39290277aacfd8367857c576a4" - integrity sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A== - dependencies: - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.7" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.5", "@babel/parser@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.7.tgz#e114cd099e5f7d17b05368678da0fb9f69b3385c" - integrity sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w== - dependencies: - "@babel/types" "^7.26.7" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" - integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" - integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" - integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/template@^7.25.9", "@babel/template@^7.3.3": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.7": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.7.tgz#99a0a136f6a75e7fb8b0a1ace421e0b25994b8bb" - integrity sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.5" - "@babel/parser" "^7.26.7" - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.7" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.5", "@babel/types@^7.26.7", "@babel/types@^7.3.3": - version "7.26.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.7.tgz#5e2b89c0768e874d4d061961f3a5a153d71dc17a" - integrity sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - -"@balena/dockerignore@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@balena/dockerignore/-/dockerignore-1.0.2.tgz#9ffe4726915251e8eb69f44ef3547e0da2c03e0d" - integrity sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q== - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" - integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": - version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== - -"@eslint/compat@^1.2.4": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@eslint/compat/-/compat-1.2.5.tgz#438f8bbe105341853469b2cf2d10b6321cadeb3a" - integrity sha512-5iuG/StT+7OfvhoBHPlmxkPA9om6aDUFgmD4+mWKAGsYt4vCe8rypneG03AuseyRHBmcCLXQtIH5S26tIoggLg== - -"@eslint/config-array@^0.19.0": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.1.tgz#734aaea2c40be22bbb1f2a9dac687c57a6a4c984" - integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== - dependencies: - "@eslint/object-schema" "^2.1.5" - debug "^4.3.1" - minimatch "^3.1.2" - -"@eslint/core@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.10.0.tgz#23727063c21b335f752dbb3a16450f6f9cbc9091" - integrity sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/eslintrc@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c" - integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@9.19.0", "@eslint/js@^9.16.0": - version "9.19.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.19.0.tgz#51dbb140ed6b49d05adc0b171c41e1a8713b7789" - integrity sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ== - -"@eslint/object-schema@^2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.5.tgz#8670a8f6258a2be5b2c620ff314a1d984c23eb2e" - integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== - -"@eslint/plugin-kit@^0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz#ee07372035539e7847ef834e3f5e7b79f09e3a81" - integrity sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A== - dependencies: - "@eslint/core" "^0.10.0" - levn "^0.4.1" - -"@gerrit0/mini-shiki@^1.24.0": - version "1.27.2" - resolved "https://registry.yarnpkg.com/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz#cf2a9fcb08a6581c78fc94821f0c854ec4b9f899" - integrity sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og== - dependencies: - "@shikijs/engine-oniguruma" "^1.27.2" - "@shikijs/types" "^1.27.2" - "@shikijs/vscode-textmate" "^10.0.1" - -"@humanfs/core@^0.19.1": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" - integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== - -"@humanfs/node@^0.16.6": - version "0.16.6" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" - integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== - dependencies: - "@humanfs/core" "^0.19.1" - "@humanwhocodes/retry" "^0.3.0" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/retry@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" - integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== - -"@humanwhocodes/retry@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b" - integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" - integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@microsoft/tsdoc-config@0.17.1": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz#e0f0b50628f4ad7fe121ca616beacfe6a25b9335" - integrity sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw== - dependencies: - "@microsoft/tsdoc" "0.15.1" - ajv "~8.12.0" - jju "~1.4.0" - resolve "~1.22.2" - -"@microsoft/tsdoc@0.15.1": - version "0.15.1" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz#d4f6937353bc4568292654efb0a0e0532adbcba2" - integrity sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@pkgr/core@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" - integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== - -"@shikijs/engine-oniguruma@^1.27.2": - version "1.29.1" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.1.tgz#118de735cb4e5a07d8792969342b988d2cfda01c" - integrity sha512-gSt2WhLNgEeLstcweQOSp+C+MhOpTsgdNXRqr3zP6M+BUBZ8Md9OU2BYwUYsALBxHza7hwaIWtFHjQ/aOOychw== - dependencies: - "@shikijs/types" "1.29.1" - "@shikijs/vscode-textmate" "^10.0.1" - -"@shikijs/types@1.29.1", "@shikijs/types@^1.27.2": - version "1.29.1" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.29.1.tgz#41f05dac7203f64ac0ac3c4b7dc75cb6b85f76f5" - integrity sha512-aBqAuhYRp5vSir3Pc9+QPu9WESBOjUo03ao0IHLC4TyTioSsp/SkbAZSrIH4ghYYC1T1KTEpRSBa83bas4RnPA== - dependencies: - "@shikijs/vscode-textmate" "^10.0.1" - "@types/hast" "^3.0.4" - -"@shikijs/vscode-textmate@^10.0.1": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz#d06d45b67ac5e9b0088e3f67ebd3f25c6c3d711a" - integrity sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sinonjs/commons@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/babel__core@^7.1.14": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" - integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== - dependencies: - "@babel/types" "^7.20.7" - -"@types/estree@^1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/hast@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" - integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== - dependencies: - "@types/unist" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.5.14": - version "29.5.14" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" - integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/node@*": - version "22.10.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.10.tgz#85fe89f8bf459dc57dfef1689bd5b52ad1af07e6" - integrity sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww== - dependencies: - undici-types "~6.20.0" - -"@types/node@20.14.8": - version "20.14.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.8.tgz#45c26a2a5de26c3534a9504530ddb3b27ce031ac" - integrity sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA== - dependencies: - undici-types "~5.26.4" - -"@types/stack-utils@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== - -"@types/unist@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" - integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^17.0.8": - version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@8.21.0", "@typescript-eslint/eslint-plugin@^8.18.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz#395014a75112ecdb81142b866ab6bb62e3be0f2a" - integrity sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.21.0" - "@typescript-eslint/type-utils" "8.21.0" - "@typescript-eslint/utils" "8.21.0" - "@typescript-eslint/visitor-keys" "8.21.0" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^2.0.0" - -"@typescript-eslint/parser@8.21.0", "@typescript-eslint/parser@^8.18.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.21.0.tgz#312c638aaba4f640d45bfde7c6795a9d75deb088" - integrity sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA== - dependencies: - "@typescript-eslint/scope-manager" "8.21.0" - "@typescript-eslint/types" "8.21.0" - "@typescript-eslint/typescript-estree" "8.21.0" - "@typescript-eslint/visitor-keys" "8.21.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@8.21.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz#d08d94e2a34b4ccdcc975543c25bb62917437500" - integrity sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA== - dependencies: - "@typescript-eslint/types" "8.21.0" - "@typescript-eslint/visitor-keys" "8.21.0" - -"@typescript-eslint/type-utils@8.21.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz#2e69d1a93cdbedc73fe694cd6ae4dfedd00430a0" - integrity sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ== - dependencies: - "@typescript-eslint/typescript-estree" "8.21.0" - "@typescript-eslint/utils" "8.21.0" - debug "^4.3.4" - ts-api-utils "^2.0.0" - -"@typescript-eslint/types@8.21.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.21.0.tgz#58f30aec8db8212fd886835dc5969cdf47cb29f5" - integrity sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A== - -"@typescript-eslint/typescript-estree@8.21.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz#5ce71acdbed3b97b959f6168afba5a03c88f69a9" - integrity sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg== - dependencies: - "@typescript-eslint/types" "8.21.0" - "@typescript-eslint/visitor-keys" "8.21.0" - 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 "^2.0.0" - -"@typescript-eslint/utils@8.21.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.21.0.tgz#bc4874fbc30feb3298b926e3b03d94570b3999c5" - integrity sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.21.0" - "@typescript-eslint/types" "8.21.0" - "@typescript-eslint/typescript-estree" "8.21.0" - -"@typescript-eslint/visitor-keys@8.21.0": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz#a89744c4cdc83b5c761eb5878befe6c33d1481b2" - integrity sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w== - dependencies: - "@typescript-eslint/types" "8.21.0" - eslint-visitor-keys "^4.2.0" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== - dependencies: - acorn "^8.11.0" - -acorn@^8.11.0, acorn@^8.14.0, acorn@^8.4.1: - version "8.14.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" - integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ajv@~8.12.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async@^3.2.3: - version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" - integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== - -aws-cdk-lib@2.176.0: - version "2.176.0" - resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.176.0.tgz#1ea69b54aef35ddd8f8e57a2059e5bd2f0ba42a3" - integrity sha512-6Gs2kBaq4elQ4fNAOiCgbD9oOLx/heb/Lp4OVE6Uf7FulYW0DikWJXxR5GWJslTJ4/sCf3UU91q415fc0bruLg== - 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.0.1" - "@balena/dockerignore" "^1.0.2" - case "1.6.3" - fs-extra "^11.2.0" - ignore "^5.3.2" - jsonschema "^1.4.1" - mime-types "^2.1.35" - minimatch "^3.1.2" - punycode "^2.3.1" - semver "^7.6.3" - table "^6.8.2" - yaml "1.10.2" - -aws-cdk@2.176.0: - version "2.176.0" - resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-2.176.0.tgz#46966fb466254470f14c42df75ec99fb76b571b8" - integrity sha512-yRjIXzK2ddznwuSjasWAViYBtBSQbEu6GHlylaC3GHsIUPhrK3KguqIuhdlxjMeiQ1Fvok8REDLCReZJdrSLLg== - optionalDependencies: - fsevents "2.3.2" - -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" - integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-import-attributes" "^7.24.7" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.24.0: - version "4.24.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" - integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== - dependencies: - caniuse-lite "^1.0.30001688" - electron-to-chromium "^1.5.73" - node-releases "^2.0.19" - update-browserslist-db "^1.1.1" - -bs-logger@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001688: - version "1.0.30001695" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz#39dfedd8f94851132795fdf9b79d29659ad9c4d4" - integrity sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw== - -case@1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" - integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== - -cdk-nag@^2.35.0: - version "2.35.0" - resolved "https://registry.yarnpkg.com/cdk-nag/-/cdk-nag-2.35.0.tgz#2c267ffa48c8567971752783c20a3fa8aea41283" - integrity sha512-jH2cff8abe6MF28N3qDOP97+vbcYZMjoFZutipD+rRtqm2uk7BoStayInUt+s9L15mKLZq6Z/8YELIzy+rDLIQ== - -chalk@^4.0.0, chalk@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cjs-module-lexer@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" - integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" - integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -constructs@^10.4.2: - version "10.4.2" - resolved "https://registry.yarnpkg.com/constructs/-/constructs-10.4.2.tgz#e875a78bef932cca12ea63965969873a25c1c132" - integrity sha512-wsNxBlAott2qg8Zv87q3eYZYgheb9lchtBfjHzzLHtXbttwSrHPs1NNQbBrmbb1YZvYg2+Vh0Dor76w4mFxJkA== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.3, cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - -dedent@^1.0.0: - version "1.5.3" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" - integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -ejs@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" - integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== - dependencies: - jake "^10.8.5" - -electron-to-chromium@^1.5.73: - version "1.5.88" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz#cdb6e2dda85e6521e8d7d3035ba391c8848e073a" - integrity sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escalade@^3.1.1, escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" - integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== - -eslint-plugin-prettier@^5.2.1: - version "5.2.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz#c4af01691a6fa9905207f0fbba0d7bea0902cce5" - integrity sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw== - dependencies: - prettier-linter-helpers "^1.0.0" - synckit "^0.9.1" - -eslint-plugin-tsdoc@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.4.0.tgz#b14104e96ceb8add2054bf39e0cfc12b9a9586e6" - integrity sha512-MT/8b4aKLdDClnS8mP3R/JNjg29i0Oyqd/0ym6NnQf+gfKbJJ4ZcSh2Bs1H0YiUMTBwww5JwXGTWot/RwyJ7aQ== - dependencies: - "@microsoft/tsdoc" "0.15.1" - "@microsoft/tsdoc-config" "0.17.1" - -eslint-scope@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442" - integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" - integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== - -eslint@^9.16.0: - version "9.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.19.0.tgz#ffa1d265fc4205e0f8464330d35f09e1d548b1bf" - integrity sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.19.0" - "@eslint/core" "^0.10.0" - "@eslint/eslintrc" "^3.2.0" - "@eslint/js" "9.19.0" - "@eslint/plugin-kit" "^0.2.5" - "@humanfs/node" "^0.16.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.1" - "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.6" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.2.0" - eslint-visitor-keys "^4.2.0" - espree "^10.3.0" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - json-stable-stringify-without-jsonify "^1.0.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - -espree@^10.0.1, espree@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" - integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== - dependencies: - acorn "^8.14.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.2.0" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.0.0, expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-uri@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" - integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== - -fastq@^1.6.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.18.0.tgz#d631d7e25faffea81887fe5ea8c9010e1b36fee0" - integrity sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - -filelist@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - -flatted@^3.2.9: - version "3.3.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" - integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== - -fs-extra@^11.2.0: - version "11.3.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" - integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fsevents@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3, glob@^7.1.4, glob@^9.3.5: - version "9.3.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" - integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== - dependencies: - fs.realpath "^1.0.0" - minimatch "^8.0.2" - minipass "^4.2.4" - path-scurry "^1.6.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - -globals@^15.13.0: - version "15.14.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.14.0.tgz#b8fd3a8941ff3b4d38f3319d433b61bbb482e73f" - integrity sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -ignore@^5.2.0, ignore@^5.3.1, ignore@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" - integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-core-module@^2.16.0: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - 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" - -istanbul-lib-instrument@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" - integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== - 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" - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jake@^10.8.5: - version "10.9.2" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" - integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== - dependencies: - async "^3.2.3" - chalk "^4.0.2" - filelist "^1.0.4" - minimatch "^3.1.2" - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - 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" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@^29.0.0, jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - -jju@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" - integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonschema@^1.4.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.5.0.tgz#f6aceb1ab9123563dd901d05f81f9d4883d3b7d8" - integrity sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw== - -jsonschema@~1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" - integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== - -keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -linkify-it@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" - integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== - dependencies: - uc.micro "^2.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -make-error@^1.1.1, make-error@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -markdown-it@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" - integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== - dependencies: - argparse "^2.0.1" - entities "^4.4.0" - linkify-it "^5.0.0" - mdurl "^2.0.0" - punycode.js "^2.3.1" - uc.micro "^2.1.0" - -mdurl@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" - integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4, micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.35: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^8.0.2: - version "8.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" - integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.4, minimatch@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minipass@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" - integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.6.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -picocolors@^1.0.0, picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pirates@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" - integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== - -pretty-format@^29.0.0, pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -punycode.js@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" - integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== - -punycode@^2.1.0, punycode@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" - integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== - -resolve@^1.20.0, resolve@~1.22.2: - version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -synckit@^0.9.1: - version "0.9.2" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" - integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== - dependencies: - "@pkgr/core" "^0.1.0" - tslib "^2.6.2" - -table@^6.8.2: - version "6.9.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5" - integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== - 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" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-api-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.0.tgz#b9d7d5f7ec9f736f4d0f09758b8607979044a900" - integrity sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ== - -ts-jest@^29.2.5: - version "29.2.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" - integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== - dependencies: - bs-logger "^0.2.6" - ejs "^3.1.10" - fast-json-stable-stringify "^2.1.0" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "^4.1.2" - make-error "^1.3.6" - semver "^7.6.3" - yargs-parser "^21.1.1" - -ts-node@^10.9.2: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tslib@^2.6.2: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -typedoc@^0.27.4: - version "0.27.6" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.27.6.tgz#7e8d067bd5386b7908afcb12c9054a83e8bb326b" - integrity sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw== - dependencies: - "@gerrit0/mini-shiki" "^1.24.0" - lunr "^2.3.9" - markdown-it "^14.1.0" - minimatch "^9.0.5" - yaml "^2.6.1" - -typescript-eslint@^8.18.0: - version "8.21.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.21.0.tgz#78bdb83a6d771f0312b128297d84a3111885fd08" - integrity sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw== - dependencies: - "@typescript-eslint/eslint-plugin" "8.21.0" - "@typescript-eslint/parser" "8.21.0" - "@typescript-eslint/utils" "8.21.0" - -typescript@~5.7.2: - version "5.7.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" - integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== - -uc.micro@^2.0.0, uc.micro@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" - integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -undici-types@~6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" - integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -update-browserslist-db@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" - integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-to-istanbul@^9.0.1: - version "9.3.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" - integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yaml@1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yaml@^2.6.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" - integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +# 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 From 7caef6773958b4539390470753866436458144c7 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 19 Feb 2025 14:20:03 +0100 Subject: [PATCH 068/112] adding package-lock for npm compatibility --- package-lock.json | 5128 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 5128 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f52d61d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5128 @@ +{ + "name": "aws4embeddedlinux-cdk-lib", + "version": "0.2.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "aws4embeddedlinux-cdk-lib", + "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", + "@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" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@aws-cdk/asset-awscli-v1": { + "version": "2.2.224", + "license": "Apache-2.0" + }, + "node_modules/@aws-cdk/asset-kubectl-v20": { + "version": "2.1.4", + "license": "Apache-2.0" + }, + "node_modules/@aws-cdk/asset-node-proxy-agent-v6": { + "version": "2.1.0", + "license": "Apache-2.0" + }, + "node_modules/@aws-cdk/cloud-assembly-schema": { + "version": "39.2.20", + "bundleDependencies": [ + "jsonschema", + "semver" + ], + "license": "Apache-2.0", + "dependencies": { + "jsonschema": "~1.4.1", + "semver": "^7.7.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@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.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", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.9" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@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.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.2.6", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.10.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.11.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.20.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.6", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.11.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@gerrit0/mini-shiki": { + "version": "1.27.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@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", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^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", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.15.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.17.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.15.1", + "ajv": "~8.12.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/types": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.14.8", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.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": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "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" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@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": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.24.1", + "@typescript-eslint/utils": "8.24.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.24.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@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": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "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.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.24.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "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", + "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.176.0", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "table", + "yaml", + "mime-types" + ], + "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.0.1", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^11.2.0", + "ignore": "^5.3.2", + "jsonschema": "^1.4.1", + "mime-types": "^2.1.35", + "minimatch": "^3.1.2", + "punycode": "^2.3.1", + "semver": "^7.6.3", + "table": "^6.8.2", + "yaml": "1.10.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.5.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001700", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "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.35.24", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "aws-cdk-lib": "^2.156.0", + "constructs": "^10.0.5" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/constructs": { + "version": "10.4.2", + "license": "Apache-2.0" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.102", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint": { + "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.11.0", + "@eslint/eslintrc": "^3.2.0", + "@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", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "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 + } + } + }, + "node_modules/eslint-plugin-tsdoc": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.15.1", + "@microsoft/tsdoc-config": "0.17.1" + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "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/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", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.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", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "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.19.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "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", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "9.3.5", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "8.0.4", + "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/globals": { + "version": "15.15.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "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/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", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "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-diff": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "dev": true, + "license": "MIT" + }, + "node_modules/make-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "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", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.5.1", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "dev": true, + "license": "MIT", + "dependencies": { + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "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", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "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/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.9.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/table": { + "version": "6.9.0", + "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" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", + "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/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-jest": { + "version": "29.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "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 + } + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedoc": { + "version": "0.27.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@gerrit0/mini-shiki": "^1.24.0", + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "yaml": "^2.6.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "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" + } + }, + "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.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@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" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "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.2", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} From 04dd3f54f5c56803a51f7bec33ef0fd465e973b3 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 19 Feb 2025 16:17:07 +0100 Subject: [PATCH 069/112] fixing renesas script --- source-repo/renesas/build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source-repo/renesas/build.sh b/source-repo/renesas/build.sh index d1710b8..4ff77d9 100644 --- a/source-repo/renesas/build.sh +++ b/source-repo/renesas/build.sh @@ -39,9 +39,9 @@ sh meta-rcar-gen3/docs/sample/copyscript/copy_proprietary_softwares.sh -f "${WOR 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 +#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 From 6af75702bac52ee664173dc9ad9b07869c313bb5 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Tue, 25 Feb 2025 10:41:42 +0100 Subject: [PATCH 070/112] doc issue --- README.md | 2 +- tsconfig.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 657fbfd..7bd1f39 100644 --- a/README.md +++ b/README.md @@ -213,7 +213,7 @@ npm install aws4embeddedlinux/aws4embeddedlinux-ci of `yarn': ```bash -yarn add github:aws4embeddedlinux/aws4embeddedlinux-ci +yarn add aws4embeddedlinux-cdk-lib@aws4embeddedlinux/aws4embeddedlinux-ci yarn install ``` diff --git a/tsconfig.json b/tsconfig.json index b8ce2fc..875befc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,5 +21,6 @@ "outDir": "./dist", "resolveJsonModule": true }, + "include": ["lib/**/*"], "exclude": ["node_modules", "cdk.out", "dist"] } From 6344984c8e1b3005ac219afc4ea4596e9390daea Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Tue, 25 Feb 2025 12:30:19 +0100 Subject: [PATCH 071/112] adjusting packge.json with files to include --- .gitignore | 1 + package.json | 1 + 2 files changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index a566ebf..78fa47f 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ cdk.context.json assets source-zip +aws4embeddedlinux-cdk-lib-*.tgz diff --git a/package.json b/package.json index bf40894..5e268a9 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.2.0", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts", + "files": ["/.lib"], "license": "MIT", "scripts": { "build": "tsc", From fb474d7204604527645fd6ad4170c9a7fc1c950c Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Tue, 25 Feb 2025 12:30:19 +0100 Subject: [PATCH 072/112] adjusting packge.json with files to include --- .gitignore | 1 + package.json | 1 + 2 files changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index a566ebf..78fa47f 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ cdk.context.json assets source-zip +aws4embeddedlinux-cdk-lib-*.tgz diff --git a/package.json b/package.json index bf40894..d6be1a6 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.2.0", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts", + "files": ["/.lib", "/dist", "/source-repo"], "license": "MIT", "scripts": { "build": "tsc", From df32fa3b5fb3db1e54e672e7f03d8dd4ff86b85e Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Tue, 25 Feb 2025 13:43:53 +0100 Subject: [PATCH 073/112] refactoring build process --- .gitignore | 4 +++- .npmignore | 2 ++ README.md | 2 +- package.json | 15 +++++---------- tsconfig.json | 1 - utils/build-assets.sh | 10 ---------- 6 files changed, 11 insertions(+), 23 deletions(-) create mode 100644 .npmignore delete mode 100755 utils/build-assets.sh diff --git a/.gitignore b/.gitignore index 78fa47f..a5d635c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,11 @@ !jest.config.js !.eslintrc.js !.prettierrc.js + +!lib/**/*.ts *.d.ts + node_modules -dist # yarn asset yarn-install.log diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..5fbba69 --- /dev/null +++ b/.npmignore @@ -0,0 +1,2 @@ +*.ts +*.snap \ No newline at end of file diff --git a/README.md b/README.md index b46ff9b..c688d7f 100644 --- a/README.md +++ b/README.md @@ -216,7 +216,7 @@ of `yarn': yarn add aws4embeddedlinux/aws4embeddedlinux-ci yarn add aws4embeddedlinux-cdk-lib@aws4embeddedlinux/aws4embeddedlinux-ci -yarn add aws4embeddedlinux-cdk-lib@adadouche/aws4embeddedlinux-ci#dev-adadouche --verbose +yarn add aws4embeddedlinux-cdk-lib@adadouche/aws4embeddedlinux-ci#dev-adadouche yarn install ``` diff --git a/package.json b/package.json index f4607f3..7b58e16 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,8 @@ { "name": "aws4embeddedlinux-cdk-lib", "version": "0.2.0", - "main": "dist/lib/index.js", - "types": "dist/lib/index.d.ts", - "files": ["/lib", "/dist", "/source-repo", "/utils"], + "main": "lib/index.js", + "types": "lib/index.d.ts", "license": "MIT", "scripts": { "build": "tsc", @@ -11,18 +10,14 @@ "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'", + "__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" + "preformat": "yarn clean" }, "dependencies": { "aws-cdk-lib": "2.176.0", diff --git a/tsconfig.json b/tsconfig.json index 875befc..b65547a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,6 @@ "experimentalDecorators": true, "strictPropertyInitialization": false, "typeRoots": ["./node_modules/@types"], - "outDir": "./dist", "resolveJsonModule": true }, "include": ["lib/**/*"], diff --git a/utils/build-assets.sh b/utils/build-assets.sh deleted file mode 100755 index 425cd67..0000000 --- a/utils/build-assets.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/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 From c63f26dc57f6e80a4903d33904bcf72d99890d3e Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Tue, 25 Feb 2025 13:43:53 +0100 Subject: [PATCH 074/112] refactoring build process --- .gitignore | 4 +++- .npmignore | 2 ++ README.md | 2 +- package.json | 13 ++++--------- tsconfig.json | 1 - utils/build-assets.sh | 10 ---------- 6 files changed, 10 insertions(+), 22 deletions(-) create mode 100644 .npmignore delete mode 100755 utils/build-assets.sh diff --git a/.gitignore b/.gitignore index 78fa47f..a5d635c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,11 @@ !jest.config.js !.eslintrc.js !.prettierrc.js + +!lib/**/*.ts *.d.ts + node_modules -dist # yarn asset yarn-install.log diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..5fbba69 --- /dev/null +++ b/.npmignore @@ -0,0 +1,2 @@ +*.ts +*.snap \ No newline at end of file diff --git a/README.md b/README.md index b46ff9b..c688d7f 100644 --- a/README.md +++ b/README.md @@ -216,7 +216,7 @@ of `yarn': yarn add aws4embeddedlinux/aws4embeddedlinux-ci yarn add aws4embeddedlinux-cdk-lib@aws4embeddedlinux/aws4embeddedlinux-ci -yarn add aws4embeddedlinux-cdk-lib@adadouche/aws4embeddedlinux-ci#dev-adadouche --verbose +yarn add aws4embeddedlinux-cdk-lib@adadouche/aws4embeddedlinux-ci#dev-adadouche yarn install ``` diff --git a/package.json b/package.json index f4607f3..7a1eb4b 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,8 @@ { "name": "aws4embeddedlinux-cdk-lib", "version": "0.2.0", - "main": "dist/lib/index.js", - "types": "dist/lib/index.d.ts", - "files": ["/lib", "/dist", "/source-repo", "/utils"], + "main": "lib/index.js", + "types": "lib/index.d.ts", "license": "MIT", "scripts": { "build": "tsc", @@ -12,17 +11,13 @@ "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": "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" + "preformat": "yarn clean" }, "dependencies": { "aws-cdk-lib": "2.176.0", diff --git a/tsconfig.json b/tsconfig.json index 875befc..b65547a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,6 @@ "experimentalDecorators": true, "strictPropertyInitialization": false, "typeRoots": ["./node_modules/@types"], - "outDir": "./dist", "resolveJsonModule": true }, "include": ["lib/**/*"], diff --git a/utils/build-assets.sh b/utils/build-assets.sh deleted file mode 100755 index 425cd67..0000000 --- a/utils/build-assets.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/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 From 4deeb9aa4ddbe0c9edd467f6ab0ef63b83e2728d Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Tue, 25 Feb 2025 16:56:39 +0100 Subject: [PATCH 075/112] refactoring build process --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 7a1eb4b..18dce30 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,6 @@ "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", From b0e2ad00340641023229bbb39094918effbe717c Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Tue, 25 Feb 2025 17:15:52 +0100 Subject: [PATCH 076/112] refactoring build process --- .gitignore | 1 + tsconfig.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a5d635c..5e2cad7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ !.prettierrc.js !lib/**/*.ts +!test/**/*.ts *.d.ts node_modules diff --git a/tsconfig.json b/tsconfig.json index b65547a..a4365bf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,6 +20,6 @@ "typeRoots": ["./node_modules/@types"], "resolveJsonModule": true }, - "include": ["lib/**/*"], + "include": ["./lib/**/*", "./test/**/*"], "exclude": ["node_modules", "cdk.out", "dist"] } From 83fb32688a168f30f95117870a9ec3a023bc83b9 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 26 Feb 2025 10:57:25 +0100 Subject: [PATCH 077/112] adding vscode settings --- .vscode/settings.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0afa7b4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "eslint.alwaysShowStatus": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "explorer.autoReveal": false +} From 4a55d015e5b5830627349d4fba0d0edb2a5918aa Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 26 Feb 2025 10:58:46 +0100 Subject: [PATCH 078/112] revisiting eslint / jest config to accomodate build change --- .editorconfig | 3 +++ .gitignore | 1 + .npmignore | 6 +++--- eslint.config.mjs | 30 ++++++++++++++++-------------- jest.config.js | 9 --------- package.json | 5 +++-- tsconfig.eslint.json | 7 +++++++ tsconfig.json | 6 ++++-- 8 files changed, 37 insertions(+), 30 deletions(-) create mode 100644 tsconfig.eslint.json diff --git a/.editorconfig b/.editorconfig index 402505f..9f09849 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,3 +7,6 @@ root = true [*] end_of_line = lf insert_final_newline = true +charset = utf-8 +indent_style = space +tab_width = 2 diff --git a/.gitignore b/.gitignore index 5e2cad7..589979c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ !test/**/*.ts *.d.ts +dist node_modules # yarn asset diff --git a/.npmignore b/.npmignore index f8bd3c3..f1253b5 100644 --- a/.npmignore +++ b/.npmignore @@ -1,6 +1,6 @@ -/.yarn -/.github -/test +.yarn +.github +test .editorconfig .gitattributes diff --git a/eslint.config.mjs b/eslint.config.mjs index a9f6154..86e6d67 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,11 +1,12 @@ import typescriptEslintEslintPlugin from "@typescript-eslint/eslint-plugin"; +import simpleImportSort from "eslint-plugin-simple-import-sort"; 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 eslintjs from "@eslint/js"; +import eslintts from "typescript-eslint"; import { FlatCompat } from "@eslint/eslintrc"; const __filename = fileURLToPath(import.meta.url); @@ -16,14 +17,22 @@ const gitignorePath = path.resolve(__dirname, ".gitignore"); const compat = new FlatCompat({ baseDirectory: __dirname, - recommendedConfig: eslint.configs.recommended, - allConfig: eslint.configs.all, + recommendedConfig: eslintjs.configs.recommended, + allConfig: eslintjs.configs.all, }); export default [ + ...compat.extends( + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended", + ), + ...eslintts.configs.recommended, { + ...eslintjs.configs.recommended, plugins: { "@typescript-eslint": typescriptEslintEslintPlugin, + "simple-import-sort": simpleImportSort, tsdoc, }, @@ -39,7 +48,7 @@ export default [ parserOptions: { sourceType: "module", - project: "./tsconfig.json", + project: "./tsconfig.eslint.json", }, }, @@ -61,8 +70,8 @@ export default [ "prettier/prettier": [ "error", { - singleQuote: true, - trailingComma: "es5", + singleQuote: false, + trailingComma: "all", }, ], }, @@ -77,13 +86,6 @@ export default [ "/test/**", "/tmp/**", ], - ...eslint.configs.recommended, }, includeIgnoreFile(gitignorePath), - ...compat.extends( - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended", - ), - ...tseslint.configs.recommended, ]; diff --git a/jest.config.js b/jest.config.js index 000683e..2f696c9 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,13 +1,4 @@ /* 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"]; diff --git a/package.json b/package.json index 18dce30..1438090 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "aws4embeddedlinux-cdk-lib", "version": "0.2.0", - "main": "lib/index.js", - "types": "lib/index.d.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", "license": "MIT", "scripts": { "build": "tsc", @@ -36,6 +36,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-tsdoc": "^0.4.0", + "eslint-plugin-simple-import-sort": "^12.1.1", "globals": "^15.13.0", "jest": "^29.7.0", "prettier": "^3.4.2", diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 0000000..09a9b02 --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "rootDir": "." + }, + "include": ["./lib/**/*", "./test/**/*"] +} diff --git a/tsconfig.json b/tsconfig.json index a4365bf..7d203cd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,8 +18,10 @@ "experimentalDecorators": true, "strictPropertyInitialization": false, "typeRoots": ["./node_modules/@types"], - "resolveJsonModule": true + "resolveJsonModule": true, + "rootDir": "./lib", + "outDir": "./dist" }, - "include": ["./lib/**/*", "./test/**/*"], + "include": ["./lib/**/*", "../test/**/*"], "exclude": ["node_modules", "cdk.out", "dist"] } From a557c17e9050e6887980afbc282d33a5681e13d1 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 26 Feb 2025 10:59:36 +0100 Subject: [PATCH 079/112] addressing typedoc issue with incomplete link --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7bd1f39..e6ff5a5 100644 --- a/README.md +++ b/README.md @@ -254,7 +254,7 @@ const projectPipeline = new EmbeddedLinuxCodePipelineStack(app, "demo-project", }); ``` -Refer to the [API Documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci) and the [sample](github.com/aws4embeddedlinux/aws4embeddedlinux-ci-examples) for more details. +Refer to the [API Documentation](https://aws4embeddedlinux.github.io/aws4embeddedlinux-ci) and the [sample](https://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: @@ -275,7 +275,7 @@ This will create an Ubuntu based container for building the Yocto images. > [!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). +> 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](https://github.com/aws4embeddedlinux/aws4embeddedlinux-ci-examples). > Once your pipelines completes successfully, the Yocto deploy directory generated content will be pushed into a S3 bucket. From 1bc4d9ae697d09a0f95967f5d5b1acd298eff31d Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 26 Feb 2025 11:00:42 +0100 Subject: [PATCH 080/112] removing unused code --- lib/index.ts | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index e897a4a..2707f01 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,23 +1,8 @@ -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. */ From 6fa6adff99938d7734fb0e66457f75974f09f382 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 26 Feb 2025 11:02:02 +0100 Subject: [PATCH 081/112] minor update due to package.json change --- yarn.lock | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/yarn.lock b/yarn.lock index 542ddf3..32ab2d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1518,6 +1518,7 @@ __metadata: eslint: "npm:^9.16.0" eslint-config-prettier: "npm:^9.1.0" eslint-plugin-prettier: "npm:^5.2.1" + eslint-plugin-simple-import-sort: "npm:^12.1.1" eslint-plugin-tsdoc: "npm:^0.4.0" globals: "npm:^15.13.0" jest: "npm:^29.7.0" @@ -2065,6 +2066,15 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-simple-import-sort@npm:^12.1.1": + version: 12.1.1 + resolution: "eslint-plugin-simple-import-sort@npm:12.1.1" + peerDependencies: + eslint: ">=5.0.0" + checksum: 10c0/0ad1907ad9ddbadd1db655db0a9d0b77076e274b793a77b982c8525d808d868e6ecfce24f3a411e8a1fa551077387f9ebb38c00956073970ebd7ee6a029ce2b3 + languageName: node + linkType: hard + "eslint-plugin-tsdoc@npm:^0.4.0": version: 0.4.0 resolution: "eslint-plugin-tsdoc@npm:0.4.0" From 847dec74f2c68dd83c45853f6fd55a8483950b40 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 26 Feb 2025 11:18:33 +0100 Subject: [PATCH 082/112] adding exclusing in the npmignore --- .npmignore | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.npmignore b/.npmignore index f1253b5..93cd3d8 100644 --- a/.npmignore +++ b/.npmignore @@ -1,5 +1,6 @@ .yarn .github +.vscode test .editorconfig @@ -8,3 +9,10 @@ test eslint.config.mjs jest.config.js typedoc.json +tsconfig.*.json +package-lock.json +yarn.lock + +CODE_OF_CONDUCT.md +CONTRIBUTING.md +SECURITY.md \ No newline at end of file From 0a40f56ced68052485506cd90c3c543e76fb0ad0 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 26 Feb 2025 11:18:33 +0100 Subject: [PATCH 083/112] adding exclusing in the npmignore --- .npmignore | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.npmignore b/.npmignore index f1253b5..c42d5b9 100644 --- a/.npmignore +++ b/.npmignore @@ -1,5 +1,6 @@ .yarn .github +.vscode test .editorconfig @@ -8,3 +9,10 @@ test eslint.config.mjs jest.config.js typedoc.json +tsconfig.*.json +package-lock.json +yarn.lock + +CODE_OF_CONDUCT.md +CONTRIBUTING.md +SECURITY.md From 70c2555486db5b8a4457c56a695991abcc6ea5e7 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 26 Feb 2025 15:45:33 +0100 Subject: [PATCH 084/112] fixing type for environment variables in code pipelines --- lib/codepipeline-embedded-linux.ts | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/codepipeline-embedded-linux.ts b/lib/codepipeline-embedded-linux.ts index b27fdcb..99f5841 100644 --- a/lib/codepipeline-embedded-linux.ts +++ b/lib/codepipeline-embedded-linux.ts @@ -49,7 +49,7 @@ export interface EmbeddedLinuxCodePipelineProps extends cdk.StackProps { readonly buildPolicyAdditions?: iam.PolicyStatement[]; /** Additional build environment variables to the build project. */ readonly environmentVariables?: { - string: codebuild.BuildEnvironmentVariable; + [key: string]: codebuild.BuildEnvironmentVariable; }; /** The encryption key use across*/ readonly encryptionKey: kms.Key; diff --git a/package.json b/package.json index 1438090..9bc5113 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,8 @@ "eslint": "^9.16.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-tsdoc": "^0.4.0", "eslint-plugin-simple-import-sort": "^12.1.1", + "eslint-plugin-tsdoc": "^0.4.0", "globals": "^15.13.0", "jest": "^29.7.0", "prettier": "^3.4.2", From 93ca82eace50176b6322df96549007ae764bbc64 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 26 Mar 2025 15:33:03 +0100 Subject: [PATCH 085/112] adding jest test and fixing output location for pipelines --- lib/codepipeline-embedded-linux.ts | 12 +- .../codebuild-embedded-linux.test.ts.snap | 1656 +++++++++++++++++ ...ine-embedded-linux-base-image.test.ts.snap | 274 ++- .../codepipeline-embedded-linux.test.ts.snap | 644 +++---- .../codepipeline-resources.test.ts.snap | 46 +- test/buildspec/build.buildspec.yml | 29 + test/codebuild-embedded-linux-nag.test.ts | 157 ++ test/codebuild-embedded-linux.test.ts | 389 ++++ ...line-embedded-linux-base-image-nag.test.ts | 83 +- ...pipeline-embedded-linux-base-image.test.ts | 179 +- test/codepipeline-embedded-linux-nag.test.ts | 157 +- test/codepipeline-embedded-linux.test.ts | 318 +++- test/codepipeline-resources-nag.test.ts | 26 +- test/codepipeline-resources.test.ts | 150 +- 14 files changed, 3272 insertions(+), 848 deletions(-) create mode 100644 test/__snapshots__/codebuild-embedded-linux.test.ts.snap create mode 100644 test/buildspec/build.buildspec.yml create mode 100644 test/codebuild-embedded-linux-nag.test.ts create mode 100644 test/codebuild-embedded-linux.test.ts diff --git a/lib/codepipeline-embedded-linux.ts b/lib/codepipeline-embedded-linux.ts index 99f5841..c3bdbc2 100644 --- a/lib/codepipeline-embedded-linux.ts +++ b/lib/codepipeline-embedded-linux.ts @@ -272,12 +272,12 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { project, }); - const artifactAction: codepipeline_actions.S3DeployAction = + const outputAction: codepipeline_actions.S3DeployAction = new codepipeline_actions.S3DeployAction({ - actionName: "Artifact", + actionName: "Output", input: buildActionOutputArtifact, - bucket: props.pipelineArtifactBucket, - objectKey: `${props.pipelineArtifactPrefix}/${sourceRepoAsset.s3ObjectKey}`, + bucket: props.pipelineOutputBucket, + objectKey: `${props.pipelineOutputPrefix}`, }); /** Here we create the logic to check for presence of ECR image on the CodeCodePipeline automatic triggering upon resource creation, @@ -352,8 +352,8 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { actions: [buildAction], }, { - stageName: "Artifact", - actions: [artifactAction], + stageName: "Output", + actions: [outputAction], }, ], }, diff --git a/test/__snapshots__/codebuild-embedded-linux.test.ts.snap b/test/__snapshots__/codebuild-embedded-linux.test.ts.snap new file mode 100644 index 0000000..8d811aa --- /dev/null +++ b/test/__snapshots__/codebuild-embedded-linux.test.ts.snap @@ -0,0 +1,1656 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`EmbeddedLinuxCodeBuildProjectStack Custom 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": { + "EmbeddedLinuxCodeBuildProject2101BD97": { + "DependsOn": [ + "EmbeddedLinuxCodeBuildProjectPolicyDocumentCDFD1ED5", + ], + "Properties": { + "Artifacts": { + "Type": "NO_ARTIFACTS", + }, + "Cache": { + "Type": "NO_CACHE", + }, + "EncryptionKey": { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", + }, + "Environment": { + "ComputeType": "BUILD_GENERAL1_XLARGE", + "Image": { + "Fn::Join": [ + "", + [ + { + "Fn::Select": [ + 4, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", + }, + ], + }, + ], + }, + ".dkr.ecr.", + { + "Fn::Select": [ + 3, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", + }, + ], + }, + ], + }, + ".", + { + "Ref": "AWS::URLSuffix", + }, + "/", + { + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", + }, + ":latest", + ], + ], + }, + "ImagePullCredentialsType": "SERVICE_ROLE", + "PrivilegedMode": true, + "Type": "LINUX_CONTAINER", + }, + "FileSystemLocations": [ + { + "Identifier": "nfs", + "Location": { + "Fn::Join": [ + "", + [ + { + "Ref": "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F", + }, + ".efs.eu-central-1.amazonaws.com:/", + ], + ], + }, + "MountPoint": "/nfs", + "Type": "EFS", + }, + ], + "LogsConfig": { + "CloudWatchLogs": { + "GroupName": { + "Ref": "EmbeddedLinuxCodeBuildProjectLogs790B1140", + }, + "Status": "ENABLED", + }, + }, + "Name": "test-stack", + "ServiceRole": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectRole692E9BCD", + "Arn", + ], + }, + "Source": { + "BuildSpec": "{ + "version": "0.2", + "phases": { + "build": { + "commands": [ + "echo \\"DUMMY BUILDSPEC - can not be empty\\"" + ] + } + }, + "artifacts": { + "files": [ + "**/*" + ], + "base-directory": "." + } +}", + "Type": "NO_SOURCE", + }, + "TimeoutInMinutes": 240, + "VpcConfig": { + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectSecurityGroupB289294B", + "GroupId", + ], + }, + ], + "Subnets": [ + { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", + }, + { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", + }, + ], + "VpcId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", + }, + }, + }, + "Type": "AWS::CodeBuild::Project", + }, + "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F": { + "DeletionPolicy": "Delete", + "Properties": { + "Encrypted": true, + "FileSystemTags": [ + { + "Key": "Name", + "Value": "test-stack/EmbeddedLinuxCodeBuildProjectFilesystem", + }, + ], + }, + "Type": "AWS::EFS::FileSystem", + "UpdateReplacePolicy": "Delete", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsMountTarget1BB9724D2": { + "Properties": { + "FileSystemId": { + "Ref": "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsMountTarget270BB2C65": { + "Properties": { + "FileSystemId": { + "Ref": "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65": { + "Properties": { + "GroupDescription": "test-stack/EmbeddedLinuxCodeBuildProjectFilesystem/EfsSecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1", + }, + ], + "Tags": [ + { + "Key": "Name", + "Value": "test-stack/EmbeddedLinuxCodeBuildProjectFilesystem", + }, + ], + "VpcId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", + }, + }, + "Type": "AWS::EC2::SecurityGroup", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroupfromteststackEmbeddedLinuxCodeBuildProjectSecurityGroup58F8D73B20499408861B": { + "Properties": { + "Description": "from teststackEmbeddedLinuxCodeBuildProjectSecurityGroup58F8D73B:2049", + "FromPort": 2049, + "GroupId": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65", + "GroupId", + ], + }, + "IpProtocol": "tcp", + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectSecurityGroupB289294B", + "GroupId", + ], + }, + "ToPort": 2049, + }, + "Type": "AWS::EC2::SecurityGroupIngress", + }, + "EmbeddedLinuxCodeBuildProjectLogs790B1140": { + "DeletionPolicy": "Delete", + "Properties": { + "LogGroupName": "test-stack-EmbeddedLinuxCodeBuildProjectLogs", + "RetentionInDays": 365, + }, + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + }, + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49": { + "DependsOn": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartServiceRole886C2BCC", + ], + "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": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", + }, + "', filter={'tagStatus': 'TAGGED'}) + for i in response['imageDetails']: + if 'latest' 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": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartServiceRole886C2BCC", + "Arn", + ], + }, + "Runtime": "python3.10", + }, + "Type": "AWS::Lambda::Function", + }, + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartLogRetentionC530B5EE": { + "Properties": { + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/lambda/", + { + "Ref": "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49", + }, + ], + ], + }, + "RetentionInDays": 365, + "ServiceToken": { + "Fn::GetAtt": [ + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", + "Arn", + ], + }, + }, + "Type": "Custom::LogRetention", + }, + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartServiceRole886C2BCC": { + "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", + }, + "EmbeddedLinuxCodeBuildProjectOnPipelineStartRuleA197C004": { + "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": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49", + "Arn", + ], + }, + "Id": "Target0", + }, + ], + }, + "Type": "AWS::Events::Rule", + }, + "EmbeddedLinuxCodeBuildProjectOnPipelineStartRuleAllowEventRuleteststackEmbeddedLinuxCodeBuildProjectOSImageCheckOnStartDE4F09A20DAF4342": { + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49", + "Arn", + ], + }, + "Principal": "events.amazonaws.com", + "SourceArn": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectOnPipelineStartRuleA197C004", + "Arn", + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "EmbeddedLinuxCodeBuildProjectPolicyDocumentCDFD1ED5": { + "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": "EmbeddedLinuxCodeBuildProjectPolicyDocumentCDFD1ED5", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodeBuildProjectRole692E9BCD", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodeBuildProjectRole692E9BCD": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codebuild.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/AWSCodeBuildAdminAccess", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "EmbeddedLinuxCodeBuildProjectRoleDefaultPolicyFE7F690E": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "ecr:BatchCheckLayerAvailability", + "ecr:GetDownloadUrlForLayer", + "ecr:BatchGetImage", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", + }, + }, + { + "Action": "ecr:GetAuthorizationToken", + "Effect": "Allow", + "Resource": "*", + }, + { + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents", + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectLogs790B1140", + "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": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", + }, + ], + ], + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":ec2:", + { + "Ref": "AWS::Region", + }, + ":", + { + "Ref": "AWS::AccountId", + }, + ":subnet/", + { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", + }, + ], + ], + }, + ], + }, + }, + "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": "EmbeddedLinuxCodeBuildProject2101BD97", + }, + ], + ], + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":logs:eu-central-1:111111111111:log-group:/aws/codebuild/", + { + "Ref": "EmbeddedLinuxCodeBuildProject2101BD97", + }, + ":*", + ], + ], + }, + ], + }, + { + "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": "EmbeddedLinuxCodeBuildProject2101BD97", + }, + "-*", + ], + ], + }, + }, + { + "Action": [ + "kms:Decrypt", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", + }, + }, + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Resource": "*", + }, + { + "Action": [ + "ec2:DescribeSecurityGroups", + "codestar-connections:GetConnection", + "codestar-connections:GetConnectionToken", + "codeconnections:GetConnectionToken", + "codeconnections:GetConnection", + "codeconnections:ListConnection", + "codeconnections:UseConnection", + "codebuild:ListConnectedOAuthAccounts", + "codebuild:ListRepositories", + "codebuild:PersistOAuthToken", + "codebuild:ImportSourceCredentials", + ], + "Effect": "Allow", + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodeBuildProjectRoleDefaultPolicyFE7F690E", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodeBuildProjectRole692E9BCD", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodeBuildProjectSecurityGroupB289294B": { + "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": "test-common:ExportsOutputFnGetAtttestvpc8985080ECidrBlockEB7C13CD", + }, + "Description": "NFS Mount Port", + "FromPort": 2049, + "IpProtocol": "tcp", + "ToPort": 2049, + }, + ], + "VpcId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", + }, + }, + "Type": "AWS::EC2::SecurityGroup", + }, + "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.", + }, + ], + }, + }, +} +`; + +exports[`EmbeddedLinuxCodeBuildProjectStack 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": { + "EmbeddedLinuxCodeBuildProject2101BD97": { + "DependsOn": [ + "EmbeddedLinuxCodeBuildProjectPolicyDocumentCDFD1ED5", + ], + "Properties": { + "Artifacts": { + "Type": "NO_ARTIFACTS", + }, + "Cache": { + "Type": "NO_CACHE", + }, + "EncryptionKey": { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", + }, + "Environment": { + "ComputeType": "BUILD_GENERAL1_XLARGE", + "Image": { + "Fn::Join": [ + "", + [ + { + "Fn::Select": [ + 4, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", + }, + ], + }, + ], + }, + ".dkr.ecr.", + { + "Fn::Select": [ + 3, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", + }, + ], + }, + ], + }, + ".", + { + "Ref": "AWS::URLSuffix", + }, + "/", + { + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", + }, + ":latest", + ], + ], + }, + "ImagePullCredentialsType": "SERVICE_ROLE", + "PrivilegedMode": true, + "Type": "LINUX_CONTAINER", + }, + "FileSystemLocations": [ + { + "Identifier": "nfs", + "Location": { + "Fn::Join": [ + "", + [ + { + "Ref": "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F", + }, + ".efs.eu-central-1.amazonaws.com:/", + ], + ], + }, + "MountPoint": "/nfs", + "Type": "EFS", + }, + ], + "LogsConfig": { + "CloudWatchLogs": { + "GroupName": { + "Ref": "EmbeddedLinuxCodeBuildProjectLogs790B1140", + }, + "Status": "ENABLED", + }, + }, + "Name": "test-stack", + "ServiceRole": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectRole692E9BCD", + "Arn", + ], + }, + "Source": { + "BuildSpec": "{ + "version": "0.2", + "phases": { + "build": { + "commands": [ + "echo \\"DUMMY BUILDSPEC - can not be empty\\"" + ] + } + }, + "artifacts": { + "files": [ + "**/*" + ], + "base-directory": "." + } +}", + "Type": "NO_SOURCE", + }, + "TimeoutInMinutes": 240, + "VpcConfig": { + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectSecurityGroupB289294B", + "GroupId", + ], + }, + ], + "Subnets": [ + { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", + }, + { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", + }, + ], + "VpcId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", + }, + }, + }, + "Type": "AWS::CodeBuild::Project", + }, + "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F": { + "DeletionPolicy": "Delete", + "Properties": { + "Encrypted": true, + "FileSystemTags": [ + { + "Key": "Name", + "Value": "test-stack/EmbeddedLinuxCodeBuildProjectFilesystem", + }, + ], + }, + "Type": "AWS::EFS::FileSystem", + "UpdateReplacePolicy": "Delete", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsMountTarget1BB9724D2": { + "Properties": { + "FileSystemId": { + "Ref": "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsMountTarget270BB2C65": { + "Properties": { + "FileSystemId": { + "Ref": "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65": { + "Properties": { + "GroupDescription": "test-stack/EmbeddedLinuxCodeBuildProjectFilesystem/EfsSecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1", + }, + ], + "Tags": [ + { + "Key": "Name", + "Value": "test-stack/EmbeddedLinuxCodeBuildProjectFilesystem", + }, + ], + "VpcId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", + }, + }, + "Type": "AWS::EC2::SecurityGroup", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroupfromteststackEmbeddedLinuxCodeBuildProjectSecurityGroup58F8D73B20499408861B": { + "Properties": { + "Description": "from teststackEmbeddedLinuxCodeBuildProjectSecurityGroup58F8D73B:2049", + "FromPort": 2049, + "GroupId": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65", + "GroupId", + ], + }, + "IpProtocol": "tcp", + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectSecurityGroupB289294B", + "GroupId", + ], + }, + "ToPort": 2049, + }, + "Type": "AWS::EC2::SecurityGroupIngress", + }, + "EmbeddedLinuxCodeBuildProjectLogs790B1140": { + "DeletionPolicy": "Delete", + "Properties": { + "LogGroupName": "test-stack-EmbeddedLinuxCodeBuildProjectLogs", + "RetentionInDays": 365, + }, + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + }, + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49": { + "DependsOn": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartServiceRole886C2BCC", + ], + "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": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", + }, + "', filter={'tagStatus': 'TAGGED'}) + for i in response['imageDetails']: + if 'latest' 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": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartServiceRole886C2BCC", + "Arn", + ], + }, + "Runtime": "python3.10", + }, + "Type": "AWS::Lambda::Function", + }, + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartLogRetentionC530B5EE": { + "Properties": { + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/lambda/", + { + "Ref": "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49", + }, + ], + ], + }, + "RetentionInDays": 365, + "ServiceToken": { + "Fn::GetAtt": [ + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", + "Arn", + ], + }, + }, + "Type": "Custom::LogRetention", + }, + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartServiceRole886C2BCC": { + "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", + }, + "EmbeddedLinuxCodeBuildProjectOnPipelineStartRuleA197C004": { + "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": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49", + "Arn", + ], + }, + "Id": "Target0", + }, + ], + }, + "Type": "AWS::Events::Rule", + }, + "EmbeddedLinuxCodeBuildProjectOnPipelineStartRuleAllowEventRuleteststackEmbeddedLinuxCodeBuildProjectOSImageCheckOnStartDE4F09A20DAF4342": { + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49", + "Arn", + ], + }, + "Principal": "events.amazonaws.com", + "SourceArn": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectOnPipelineStartRuleA197C004", + "Arn", + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "EmbeddedLinuxCodeBuildProjectPolicyDocumentCDFD1ED5": { + "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": "EmbeddedLinuxCodeBuildProjectPolicyDocumentCDFD1ED5", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodeBuildProjectRole692E9BCD", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodeBuildProjectRole692E9BCD": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codebuild.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/AWSCodeBuildAdminAccess", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "EmbeddedLinuxCodeBuildProjectRoleDefaultPolicyFE7F690E": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "ecr:BatchCheckLayerAvailability", + "ecr:GetDownloadUrlForLayer", + "ecr:BatchGetImage", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", + }, + }, + { + "Action": "ecr:GetAuthorizationToken", + "Effect": "Allow", + "Resource": "*", + }, + { + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents", + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectLogs790B1140", + "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": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", + }, + ], + ], + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":ec2:", + { + "Ref": "AWS::Region", + }, + ":", + { + "Ref": "AWS::AccountId", + }, + ":subnet/", + { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", + }, + ], + ], + }, + ], + }, + }, + "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": "EmbeddedLinuxCodeBuildProject2101BD97", + }, + ], + ], + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":logs:eu-central-1:111111111111:log-group:/aws/codebuild/", + { + "Ref": "EmbeddedLinuxCodeBuildProject2101BD97", + }, + ":*", + ], + ], + }, + ], + }, + { + "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": "EmbeddedLinuxCodeBuildProject2101BD97", + }, + "-*", + ], + ], + }, + }, + { + "Action": [ + "kms:Decrypt", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", + }, + }, + { + "Action": [ + "ec2:DescribeSecurityGroups", + "codestar-connections:GetConnection", + "codestar-connections:GetConnectionToken", + "codeconnections:GetConnectionToken", + "codeconnections:GetConnection", + "codeconnections:ListConnection", + "codeconnections:UseConnection", + "codebuild:ListConnectedOAuthAccounts", + "codebuild:ListRepositories", + "codebuild:PersistOAuthToken", + "codebuild:ImportSourceCredentials", + ], + "Effect": "Allow", + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodeBuildProjectRoleDefaultPolicyFE7F690E", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodeBuildProjectRole692E9BCD", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodeBuildProjectSecurityGroupB289294B": { + "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": "test-common:ExportsOutputFnGetAtttestvpc8985080ECidrBlockEB7C13CD", + }, + "Description": "NFS Mount Port", + "FromPort": 2049, + "IpProtocol": "tcp", + "ToPort": 2049, + }, + ], + "VpcId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", + }, + }, + "Type": "AWS::EC2::SecurityGroup", + }, + "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-embedded-linux-base-image.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap index 4c808c7..e4acead 100644 --- a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap @@ -11,21 +11,21 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` [ "aws ecr list-images --repository-name "", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", }, - "" --query "imageIds[?imageTag=='MyTestStack']"", + "" --query "imageIds[?imageTag=='test-stack']"", ], ], }, }, "ECRBaseImageTag": { "Description": "The ECR Image Tag where the base image will be pushed", - "Value": "MyTestStack", + "Value": "test-stack", }, "ECRRepositoryName": { "Description": "The ECR Repository name where the base image will be pushed", "Value": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", }, }, "SourceURI": { @@ -36,7 +36,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` [ "s3://", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", }, "/base-image/arbitrary-file.ext", ], @@ -67,7 +67,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Properties": { "DestinationBucketKeyPrefix": "base-image", "DestinationBucketName": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", }, "Extract": false, "OutputObjectKeys": true, @@ -178,14 +178,14 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, "/*", ], @@ -193,19 +193,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, ], "Version": "2012-10-17", }, @@ -221,7 +208,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "CodePipelineBuildBaseImageBuildLogs48BFE4D7": { "DeletionPolicy": "Delete", "Properties": { - "LogGroupName": "MyTestStack-CodePipelineBuildBaseImageBuildLogs", + "LogGroupName": "test-stack-CodePipelineBuildBaseImageBuildLogs", "RetentionInDays": 365, }, "Type": "AWS::Logs::LogGroup", @@ -237,18 +224,12 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` ], "Properties": { "ArtifactStore": { - "EncryptionKey": { - "Id": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - "Type": "KMS", - }, "Location": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesArtifactBucketFF61EB98FA6EAAC1", + "Fn::ImportValue": "test-common:ExportsOutputReftestartF0FFB4BEEC699EE6", }, "Type": "S3", }, - "Name": "MyTestStack", + "Name": "test-stack", "PipelineType": "V1", "RestartExecutionOnUpdate": true, "RoleArn": { @@ -270,7 +251,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Configuration": { "PollForSourceChanges": false, "S3Bucket": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", }, "S3ObjectKey": "base-image/arbitrary-file.ext", }, @@ -456,83 +437,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, "Type": "AWS::IAM::Policy", }, - "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", @@ -580,14 +484,14 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, "/*", ], @@ -595,19 +499,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": "sts:AssumeRole", "Effect": "Allow", @@ -691,14 +582,14 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, "/base-image/arbitrary-file.ext", ], @@ -706,16 +597,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": [ "s3:DeleteObject*", @@ -729,14 +610,14 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, "/*", ], @@ -744,18 +625,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - "kms:Decrypt", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, ], "Version": "2012-10-17", }, @@ -768,6 +637,83 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, "Type": "AWS::IAM::Policy", }, + "CodePipelineBuildBaseImageCodePipelineteststackCodePipelineBuildBaseImageCodePipelineBEEAC58ESourceEventRulebaseimage1ccdf1583059080a3911192a20ae50cc6b3bfa57d56d0b5b4d3866f920b3ad20zipE860D013": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], + "Properties": { + "EventPattern": { + "detail": { + "eventName": [ + "CompleteMultipartUpload", + "CopyObject", + "PutObject", + ], + "requestParameters": { + "bucketName": [ + { + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", + }, + ], + "key": [ + "base-image/arbitrary-file.ext", + ], + }, + "resources": { + "ARN": [ + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", + }, + "/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", + }, "CodePipelineBuildBaseImageProject69590E59": { "DependsOn": [ "CodePipelineBuildBaseImageBucketDeploymentAwsCliLayerF8B77510", @@ -781,7 +727,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Type": "NO_CACHE", }, "EncryptionKey": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", }, "Environment": { "ComputeType": "BUILD_GENERAL1_MEDIUM", @@ -800,7 +746,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Fn::Split": [ ":", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, ], }, @@ -814,7 +760,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Fn::Split": [ ":", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, ], }, @@ -826,7 +772,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, "/", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", }, ], ], @@ -845,7 +791,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` { "Name": "IMAGE_TAG", "Type": "PLAINTEXT", - "Value": "MyTestStack", + "Value": "test-stack", }, ], "Image": "aws/codebuild/standard:7.0", @@ -861,7 +807,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Status": "ENABLED", }, }, - "Name": "MyTestStack", + "Name": "test-stack", "ServiceRole": { "Fn::GetAtt": [ "CodePipelineBuildBaseImageProjectRole12B97AA7", @@ -993,7 +939,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", }, }, { @@ -1008,7 +954,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, }, { @@ -1025,14 +971,14 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, "/*", ], @@ -1040,16 +986,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, ], "Version": "2012-10-17", }, diff --git a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap index 22deb32..376c99d 100644 --- a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap @@ -11,9 +11,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` [ "s3://", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesArtifactBucketFF61EB98FA6EAAC1", + "Fn::ImportValue": "test-common:ExportsOutputReftestartF0FFB4BEEC699EE6", }, - "/poky/arbitrary-file.ext", + "/custom/arbitrary-file.ext", ], ], }, @@ -26,9 +26,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` [ "s3://", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesOutputBucketA2144F25070A0F1C", + "Fn::ImportValue": "test-common:ExportsOutputReftestoutA50725182A5BCA18", }, - "/poky", + "/custom", ], ], }, @@ -41,9 +41,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` [ "s3://", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", }, - "/poky/arbitrary-file.ext", + "/custom/arbitrary-file.ext", ], ], }, @@ -100,18 +100,12 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` ], "Properties": { "ArtifactStore": { - "EncryptionKey": { - "Id": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - "Type": "KMS", - }, "Location": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesArtifactBucketFF61EB98FA6EAAC1", + "Fn::ImportValue": "test-common:ExportsOutputReftestartF0FFB4BEEC699EE6", }, "Type": "S3", }, - "Name": "MyTestStack", + "Name": "test-stack", "PipelineType": "V1", "RestartExecutionOnUpdate": true, "RoleArn": { @@ -133,9 +127,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Configuration": { "PollForSourceChanges": false, "S3Bucket": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", }, - "S3ObjectKey": "poky/arbitrary-file.ext", + "S3ObjectKey": "custom/arbitrary-file.ext", }, "Name": "Source", "OutputArtifacts": [ @@ -201,162 +195,32 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "Configuration": { "BucketName": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesArtifactBucketFF61EB98FA6EAAC1", + "Fn::ImportValue": "test-common:ExportsOutputReftestoutA50725182A5BCA18", }, "Extract": "true", - "ObjectKey": "poky/arbitrary-file.ext", + "ObjectKey": "custom", }, "InputArtifacts": [ { "Name": "Artifact_Build_Build", }, ], - "Name": "Artifact", + "Name": "Output", "RoleArn": { "Fn::GetAtt": [ - "EmbeddedLinuxCodePipelineArtifactCodePipelineActionRole97F56214", + "EmbeddedLinuxCodePipelineOutputCodePipelineActionRole999D254E", "Arn", ], }, "RunOrder": 1, }, ], - "Name": "Artifact", + "Name": "Output", }, ], }, "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": { @@ -370,9 +234,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "EmbeddedLinuxCodePipelineBucketDeploymentCustomResourceBA39990C": { "DeletionPolicy": "Delete", "Properties": { - "DestinationBucketKeyPrefix": "poky", + "DestinationBucketKeyPrefix": "custom", "DestinationBucketName": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", }, "Extract": false, "OutputObjectKeys": true, @@ -483,14 +347,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, "/*", ], @@ -498,19 +362,6 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, ], "Version": "2012-10-17", }, @@ -606,7 +457,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "SecurityGroupIngress": [ { "CidrIp": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesVpc54FB4A02CidrBlock1B329233", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestvpc8985080ECidrBlockEB7C13CD", }, "Description": "NFS Mount Port", "FromPort": 2049, @@ -615,7 +466,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], "VpcId": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpc54FB4A0241E4C5E5", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", }, }, "Type": "AWS::EC2::SecurityGroup", @@ -647,7 +498,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Action": "ecr:DescribeImages", "Effect": "Allow", "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, }, ], @@ -733,7 +584,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "FileSystemTags": [ { "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxCodePipelineFileSystem", + "Value": "test-stack/EmbeddedLinuxCodePipelineFileSystem", }, ], }, @@ -754,7 +605,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], "SubnetId": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet1Subnet8DD627A684935C4B", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", }, }, "Type": "AWS::EFS::MountTarget", @@ -773,33 +624,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], "SubnetId": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet2SubnetC1071C9093652F10", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxCodePipelineFileSystemEfsMountTarget3FAD334C7": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxCodePipelineFileSystemB969CAF1", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroup35971CF1", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet3SubnetCA196C90FDAFF9BF", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", }, }, "Type": "AWS::EFS::MountTarget", }, "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroup35971CF1": { "Properties": { - "GroupDescription": "MyTestStack/EmbeddedLinuxCodePipelineFileSystem/EfsSecurityGroup", + "GroupDescription": "test-stack/EmbeddedLinuxCodePipelineFileSystem/EfsSecurityGroup", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -810,18 +642,18 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxCodePipelineFileSystem", + "Value": "test-stack/EmbeddedLinuxCodePipelineFileSystem", }, ], "VpcId": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpc54FB4A0241E4C5E5", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", }, }, "Type": "AWS::EC2::SecurityGroup", }, - "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroupfromMyTestStackEmbeddedLinuxCodePipelineBuildProjectSecurityGroupEA21757F2049FC93D5D2": { + "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroupfromteststackEmbeddedLinuxCodePipelineBuildProjectSecurityGroup418A122320491D06894E": { "Properties": { - "Description": "from MyTestStackEmbeddedLinuxCodePipelineBuildProjectSecurityGroupEA21757F:2049", + "Description": "from teststackEmbeddedLinuxCodePipelineBuildProjectSecurityGroup418A1223:2049", "FromPort": 2049, "GroupId": { "Fn::GetAtt": [ @@ -840,84 +672,6 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "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", @@ -939,11 +693,11 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` print("Received event: " + json.dumps(event, indent=2)) response = ecr_client.describe_images(repositoryName='", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", }, "', filter={'tagStatus': 'TAGGED'}) for i in response['imageDetails']: - if 'MyBaseImageStack' in i['ecrRepositoryImageTags']: + if 'latest' in i['ecrRepositoryImageTags']: break else: print('OS image not found. Stopping execution.') @@ -1057,7 +811,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "Type": "AWS::Events::Rule", }, - "EmbeddedLinuxCodePipelineOnCodePipelineStartRuleAllowEventRuleMyTestStackEmbeddedLinuxCodePipelineOSImageCheckOnStartADCB57EA531B1926": { + "EmbeddedLinuxCodePipelineOnCodePipelineStartRuleAllowEventRuleteststackEmbeddedLinuxCodePipelineOSImageCheckOnStart43D18F0A7FAE588F": { "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { @@ -1076,6 +830,114 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "Type": "AWS::Lambda::Permission", }, + "EmbeddedLinuxCodePipelineOutputCodePipelineActionRole999D254E": { + "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", + }, + "EmbeddedLinuxCodePipelineOutputCodePipelineActionRoleDefaultPolicy75D08DD8": { + "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": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", + }, + "/*", + ], + ], + }, + ], + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodePipelineOutputCodePipelineActionRoleDefaultPolicy75D08DD8", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodePipelineOutputCodePipelineActionRole999D254E", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, "EmbeddedLinuxCodePipelineProjectF55E3B36": { "DependsOn": [ "EmbeddedLinuxCodePipelineBucketDeploymentAwsCliLayerAA1BBC13", @@ -1090,7 +952,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Type": "NO_CACHE", }, "EncryptionKey": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", }, "Environment": { "ComputeType": "BUILD_GENERAL1_XLARGE", @@ -1108,19 +970,19 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` { "Name": "PIPELINE_PROJECT_NAME", "Type": "PLAINTEXT", - "Value": "MyTestStack", + "Value": "test-stack", }, { "Name": "PIPELINE_OUTPUT_BUCKET", "Type": "PLAINTEXT", "Value": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesOutputBucketA2144F25070A0F1C", + "Fn::ImportValue": "test-common:ExportsOutputReftestoutA50725182A5BCA18", }, }, { "Name": "PIPELINE_OUTPUT_BUCKET_PREFIX", "Type": "PLAINTEXT", - "Value": "poky", + "Value": "custom", }, { "Name": "VM_IMPORT_ROLE", @@ -1141,7 +1003,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Fn::Split": [ ":", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, ], }, @@ -1155,7 +1017,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Fn::Split": [ ":", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, ], }, @@ -1167,9 +1029,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "/", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", }, - ":MyBaseImageStack", + ":latest", ], ], }, @@ -1203,7 +1065,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Status": "ENABLED", }, }, - "Name": "MyTestStack", + "Name": "test-stack", "ServiceRole": { "Fn::GetAtt": [ "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", @@ -1226,17 +1088,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` ], "Subnets": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet1Subnet8DD627A684935C4B", - }, - { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet2SubnetC1071C9093652F10", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", }, { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet3SubnetCA196C90FDAFF9BF", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", }, ], "VpcId": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpc54FB4A0241E4C5E5", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", }, }, }, @@ -1245,7 +1104,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "EmbeddedLinuxCodePipelineProjectLogsBA5DB55C": { "DeletionPolicy": "Delete", "Properties": { - "LogGroupName": "MyTestStack-EmbeddedLinuxCodePipelineProjectLogs", + "LogGroupName": "test-stack-EmbeddedLinuxCodePipelineProjectLogs", "RetentionInDays": 365, }, "Type": "AWS::Logs::LogGroup", @@ -1300,7 +1159,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, }, { @@ -1345,30 +1204,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ":subnet/", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet1Subnet8DD627A684935C4B", - }, - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":subnet/", - { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet2SubnetC1071C9093652F10", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", }, ], ], @@ -1391,7 +1227,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ":subnet/", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet3SubnetCA196C90FDAFF9BF", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", }, ], ], @@ -1497,7 +1333,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", }, }, { @@ -1516,14 +1352,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", }, "/*", ], @@ -1531,19 +1367,6 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": [ "ec2:CreateImage", @@ -1576,14 +1399,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", }, "/*", ], @@ -1638,14 +1461,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, "/*", ], @@ -1735,14 +1558,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, "/*", ], @@ -1750,19 +1573,6 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": "sts:AssumeRole", "Effect": "Allow", @@ -1788,7 +1598,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": { "Fn::GetAtt": [ - "EmbeddedLinuxCodePipelineArtifactCodePipelineActionRole97F56214", + "EmbeddedLinuxCodePipelineOutputCodePipelineActionRole999D254E", "Arn", ], }, @@ -1858,31 +1668,21 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, - "/poky/arbitrary-file.ext", + "/custom/arbitrary-file.ext", ], ], }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": [ "s3:DeleteObject*", @@ -1896,14 +1696,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, "/*", ], @@ -1911,18 +1711,6 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - "kms:Decrypt", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, ], "Version": "2012-10-17", }, @@ -1967,14 +1755,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", }, "/*", ], @@ -1990,7 +1778,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Condition": { "StringEquals": { "ec2:ResourceTag/CreatedBy": [ - "MyTestStack", + "test-stack", ], }, }, @@ -2016,7 +1804,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", }, }, ], @@ -2025,7 +1813,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "PolicyName": "vmImportPolicy", }, ], - "RoleName": "MyTestStack-vm-mport", + "RoleName": "test-stack-vm-mport", }, "Type": "AWS::IAM::Role", }, @@ -2062,6 +1850,84 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "Type": "AWS::Events::Rule", }, + "EmbeddedLinuxCodePipelineteststackEmbeddedLinuxCodePipelineE603BC4FSourceEventRulecustom23834a673736e04b0b5d6b7ff0d2481039b6661f0b52b80c5ef1f4296a0f0fbezip38762D1B": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "EventPattern": { + "detail": { + "eventName": [ + "CompleteMultipartUpload", + "CopyObject", + "PutObject", + ], + "requestParameters": { + "bucketName": [ + { + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", + }, + ], + "key": [ + "custom/arbitrary-file.ext", + ], + }, + "resources": { + "ARN": [ + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", + }, + "/custom/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", + }, "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A": { "DependsOn": [ "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB", diff --git a/test/__snapshots__/codepipeline-resources.test.ts.snap b/test/__snapshots__/codepipeline-resources.test.ts.snap index 78df388..c531c39 100644 --- a/test/__snapshots__/codepipeline-resources.test.ts.snap +++ b/test/__snapshots__/codepipeline-resources.test.ts.snap @@ -723,7 +723,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "PipelineResourcesVPCFlowLogGroupCCF3042F": { "DeletionPolicy": "Delete", "Properties": { - "LogGroupName": "MyTestStack-PipelineResourcesVPCFlowLogGroup", + "LogGroupName": "test-stack-PipelineResourcesVPCFlowLogGroup", "RetentionInDays": 365, }, "Type": "AWS::Logs::LogGroup", @@ -748,7 +748,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVPCFlowLogs", + "Value": "test-stack/PipelineResourcesVPCFlowLogs", }, ], "TrafficType": "ALL", @@ -772,7 +772,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVPCFlowLogs", + "Value": "test-stack/PipelineResourcesVPCFlowLogs", }, ], }, @@ -827,7 +827,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc", + "Value": "test-stack/PipelineResourcesVpc", }, ], }, @@ -838,7 +838,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc", + "Value": "test-stack/PipelineResourcesVpc", }, ], }, @@ -861,7 +861,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet1", + "Value": "test-stack/PipelineResourcesVpc/PrivateSubnet1", }, ], "VpcId": { @@ -897,7 +897,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet1", + "Value": "test-stack/PipelineResourcesVpc/PrivateSubnet1", }, ], "VpcId": { @@ -934,7 +934,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet2", + "Value": "test-stack/PipelineResourcesVpc/PrivateSubnet2", }, ], "VpcId": { @@ -959,7 +959,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet2", + "Value": "test-stack/PipelineResourcesVpc/PrivateSubnet2", }, ], "VpcId": { @@ -985,7 +985,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet3", + "Value": "test-stack/PipelineResourcesVpc/PrivateSubnet3", }, ], "VpcId": { @@ -1021,7 +1021,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet3", + "Value": "test-stack/PipelineResourcesVpc/PrivateSubnet3", }, ], "VpcId": { @@ -1051,7 +1051,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet1", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet1", }, ], }, @@ -1075,7 +1075,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet1", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet1", }, ], }, @@ -1086,7 +1086,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet1", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet1", }, ], "VpcId": { @@ -1122,7 +1122,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet1", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet1", }, ], "VpcId": { @@ -1152,7 +1152,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet2", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet2", }, ], }, @@ -1176,7 +1176,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet2", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet2", }, ], }, @@ -1187,7 +1187,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet2", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet2", }, ], "VpcId": { @@ -1223,7 +1223,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet2", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet2", }, ], "VpcId": { @@ -1253,7 +1253,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet3", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet3", }, ], }, @@ -1277,7 +1277,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet3", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet3", }, ], }, @@ -1299,7 +1299,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet3", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet3", }, ], "VpcId": { @@ -1324,7 +1324,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet3", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet3", }, ], "VpcId": { diff --git a/test/buildspec/build.buildspec.yml b/test/buildspec/build.buildspec.yml new file mode 100644 index 0000000..25ef8e1 --- /dev/null +++ b/test/buildspec/build.buildspec.yml @@ -0,0 +1,29 @@ +version: 0.2 +run-as: yoctouser + +env: + shell: bash + # HOME is set to /root even when running as a non-root user. + variables: + HOME: "/home/yoctouser" + +phases: + pre_build: + run-as: root + commands: + - echo "Pre build started - [$(date '+%F %H:%M:%S')]" + - echo "Pre build completed - [$(date '+%F %H:%M:%S')]" + build: + commands: + - echo "Build started - [$(date '+%F %H:%M:%S')]" + - echo "Build completed - [$(date '+%F %H:%M:%S')]" + post_build: + commands: + - echo "Post build statred - [$(date '+%F %H:%M:%S')]" + - echo "" > /tmp/out.log + - echo "Post build completed - [$(date '+%F %H:%M:%S')]" + +artifacts: + discard-paths: true + files: + - /tmp/out.log diff --git a/test/codebuild-embedded-linux-nag.test.ts b/test/codebuild-embedded-linux-nag.test.ts new file mode 100644 index 0000000..22a92ff --- /dev/null +++ b/test/codebuild-embedded-linux-nag.test.ts @@ -0,0 +1,157 @@ +import { describe, expect, test, beforeAll } from '@jest/globals'; +import { AwsSolutionsChecks, NagSuppressions } from "cdk-nag"; +import { Annotations, Match } from "aws-cdk-lib/assertions"; + +import * as cdk from "aws-cdk-lib"; +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 { + EmbeddedLinuxCodeBuildProjectProps, + EmbeddedLinuxCodeBuildProjectStack, +} from "../lib"; +import { DEFAULT_ENV } from "./util"; + +const base_path = `EmbeddedLinuxCodeBuild`; + +function addNagSuppressions(_stack: EmbeddedLinuxCodeBuildProjectStack, _props: EmbeddedLinuxCodeBuildProjectProps) { + 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}/${base_path}ProjectSecurityGroup/Resource`, + [ + { + id: "AwsSolutions-EC23", + reason: + "CidrBlock parameter referencing an intrinsic function", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + _stack, + `/${_stack.stackName}/${base_path}Project/Resource`, + [ + { + id: "AwsSolutions-CB5", + reason: + "PipelineImage parameter referencing an intrinsic function", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + _stack, + `/${_stack.stackName}/${base_path}Project/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}/LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8a/ServiceRole/DefaultPolicy/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + _stack, + `/${_stack.stackName}/${base_path}ProjectOSImageCheckOnStart/Resource`, + [ + { + id: "AwsSolutions-L1", + reason: "There is no latest PYTHON version to set.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + _stack, + `/${_stack.stackName}/${base_path}Project/PolicyDocument/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); +} + +describe("EmbeddedLinuxCodeBuildProjectStack cdk-nag AwsSolutions Pack", () => { + const resource_prefix = "test"; + + let app: cdk.App; + let stack: EmbeddedLinuxCodeBuildProjectStack; + let props: EmbeddedLinuxCodeBuildProjectProps; + let common: cdk.Stack; + + beforeAll(() => { + // GIVEN + app = new cdk.App(); + + common = new cdk.Stack(app, `${resource_prefix}-common`, { + env: DEFAULT_ENV + }); + + // Create required resources for testing + const vpc = new ec2.Vpc(common, `${resource_prefix}-vpc`, { + maxAzs: 2 + }); + const ecrRepository = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); + + // Create the pipeline stack & props + props = { + env: DEFAULT_ENV, + ecrRepository: ecrRepository, + encryptionKey: encryptionKey, + ecrRepositoryImageTag: "PipelineImage", + vpc: vpc, + }; + + stack = new EmbeddedLinuxCodeBuildProjectStack(app, `${resource_prefix}-stack`, props); + + addNagSuppressions(stack, 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/codebuild-embedded-linux.test.ts b/test/codebuild-embedded-linux.test.ts new file mode 100644 index 0000000..33fbfc9 --- /dev/null +++ b/test/codebuild-embedded-linux.test.ts @@ -0,0 +1,389 @@ +import { beforeEach, describe, expect, test } from '@jest/globals'; +import { Match, Template } from "aws-cdk-lib/assertions"; + +import * as cdk from "aws-cdk-lib"; +import * as ecr from "aws-cdk-lib/aws-ecr"; +import * as ec2 from "aws-cdk-lib/aws-ec2"; +import * as kms from "aws-cdk-lib/aws-kms"; +import * as iam from "aws-cdk-lib/aws-iam"; +import { + EmbeddedLinuxCodeBuildProjectStack, + EmbeddedLinuxCodeBuildProjectProps +} from "../lib"; +import { DEFAULT_ENV, normalizedTemplateFromStack } from "./util"; + +describe('EmbeddedLinuxCodeBuildProjectStack', () => { + const resource_prefix = "test"; + + let app: cdk.App; + let stack: EmbeddedLinuxCodeBuildProjectStack; + let props: EmbeddedLinuxCodeBuildProjectProps; + let template: Template; + let common: cdk.Stack; + + beforeEach(() => { + app = new cdk.App(); + + common = new cdk.Stack(app, `${resource_prefix}-common`, { + env: DEFAULT_ENV + }); + + // Create required props + const vpc = new ec2.Vpc(common, `${resource_prefix}-vpc`, { + maxAzs: 2 + }); + const ecrRepository = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); + + // Create the pipeline stack & props + props = { + env: DEFAULT_ENV, + ecrRepository: ecrRepository, + ecrRepositoryImageTag: 'latest', + vpc: vpc, + encryptionKey: encryptionKey + }; + + stack = new EmbeddedLinuxCodeBuildProjectStack(app, `${resource_prefix}-stack`, props); + + template = Template.fromStack(stack); + }); + + test('Creates EFS filesystem with security group', () => { + template.hasResourceProperties('AWS::EFS::FileSystem', { + FileSystemTags: [ + { + Key: 'Name', + Value: `${stack.stackName}/EmbeddedLinuxCodeBuildProjectFilesystem` + } + ], + Encrypted: true + }); + + template.hasResourceProperties('AWS::EC2::SecurityGroup', { + SecurityGroupIngress: Match.arrayWith([Match.objectLike( + { + CidrIp: { + "Fn::ImportValue": Match.stringLikeRegexp(`${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replace('-', '')}*`) + }, + FromPort: 2049, + IpProtocol: 'tcp', + ToPort: 2049 + }, + )]) + }); + }); + + test('creates CodeBuild project', () => { + template.hasResourceProperties('AWS::CodeBuild::Project', { + Environment: { + ComputeType: 'BUILD_GENERAL1_XLARGE', + Image: { + "Fn::Join": [ + "", + [ + { + "Fn::Select": [ + 4, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": Match.stringLikeRegexp(`${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace('-', '')}`), + }, + ], + }, + ], + }, + ".dkr.ecr.", + { + "Fn::Select": [ + 3, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": Match.stringLikeRegexp(`${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace('-', '')}`), + }, + ], + }, + ], + }, + ".", + { + "Ref": "AWS::URLSuffix", + }, + "/", + { + "Fn::ImportValue": Match.stringLikeRegexp(`${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replace('-', '')}`), + }, + ":latest", + ], + ], + }, + PrivilegedMode: true, + Type: 'LINUX_CONTAINER' + }, + TimeoutInMinutes: 240 + }); + }); + + test('creates Lambda function for pipeline check', () => { + template.hasResourceProperties('AWS::Lambda::Function', { + Handler: 'index.handler', + Runtime: 'python3.10' + }); + }); + + test('creates EventBridge rule', () => { + template.hasResourceProperties('AWS::Events::Rule', { + EventPattern: { + 'detail-type': ['CodePipeline Pipeline Execution State Change'], + source: ['aws.codepipeline'], + detail: { + state: ['STARTED'], + 'execution-trigger': { + 'trigger-type': ['CreatePipeline'] + } + } + } + }); + }); + + test('adds required policies to CodeBuild role', () => { + template.hasResourceProperties('AWS::IAM::Policy', { + PolicyDocument: { + Statement: Match.arrayWith([Match.objectLike( + { + Action: [ + 'ec2:DescribeSecurityGroups', + 'codestar-connections:GetConnection', + 'codestar-connections:GetConnectionToken', + 'codeconnections:GetConnectionToken', + 'codeconnections:GetConnection', + 'codeconnections:ListConnection', + 'codeconnections:UseConnection', + 'codebuild:ListConnectedOAuthAccounts', + 'codebuild:ListRepositories', + 'codebuild:PersistOAuthToken', + 'codebuild:ImportSourceCredentials' + ], + Effect: 'Allow', + Resource: '*' + }, + )]) + } + }); + }); + + test('creates CloudWatch log group', () => { + template.hasResourceProperties('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(); + }); +}); + + +describe('EmbeddedLinuxCodeBuildProjectStack Custom', () => { + const resource_prefix = "test"; + + let app: cdk.App; + let stack: EmbeddedLinuxCodeBuildProjectStack; + let props: EmbeddedLinuxCodeBuildProjectProps; + let template: Template; + let templateCustom: Template; + let common: cdk.Stack; + + beforeEach(() => { + app = new cdk.App(); + + common = new cdk.Stack(app, `${resource_prefix}-common`, { + env: DEFAULT_ENV + }); + + // Create required props + const vpc = new ec2.Vpc(common, `${resource_prefix}-vpc`, { + maxAzs: 2 + }); + const ecrRepository = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); + const customPolicy = new iam.PolicyStatement({ + actions: ['s3:GetObject'], + resources: ['*'] + }); + + // Create the pipeline stack & props + props = { + env: DEFAULT_ENV, + ecrRepository: ecrRepository, + ecrRepositoryImageTag: 'latest', + vpc: vpc, + encryptionKey: encryptionKey, + buildPolicyAdditions: [customPolicy], + }; + + stack = new EmbeddedLinuxCodeBuildProjectStack(app, `${resource_prefix}-stack`, props); + + template = Template.fromStack(stack); + }); + + test('Creates EFS filesystem with security group', () => { + template.hasResourceProperties('AWS::EFS::FileSystem', { + FileSystemTags: [ + { + Key: 'Name', + Value: `${stack.stackName}/EmbeddedLinuxCodeBuildProjectFilesystem` + } + ], + Encrypted: true + }); + + template.hasResourceProperties('AWS::EC2::SecurityGroup', { + SecurityGroupIngress: Match.arrayWith([Match.objectLike( + { + CidrIp: { + "Fn::ImportValue": Match.stringLikeRegexp(`${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replace('-', '')}*`) + }, + FromPort: 2049, + IpProtocol: 'tcp', + ToPort: 2049 + }, + )]) + }); + }); + + test('creates CodeBuild project', () => { + template.hasResourceProperties('AWS::CodeBuild::Project', { + Environment: { + ComputeType: 'BUILD_GENERAL1_XLARGE', + Image: { + "Fn::Join": [ + "", + [ + { + "Fn::Select": [ + 4, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": Match.stringLikeRegexp(`${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace('-', '')}`), + }, + ], + }, + ], + }, + ".dkr.ecr.", + { + "Fn::Select": [ + 3, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": Match.stringLikeRegexp(`${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace('-', '')}`), + }, + ], + }, + ], + }, + ".", + { + "Ref": "AWS::URLSuffix", + }, + "/", + { + "Fn::ImportValue": Match.stringLikeRegexp(`${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replace('-', '')}`), + }, + ":latest", + ], + ], + }, + PrivilegedMode: true, + Type: 'LINUX_CONTAINER' + }, + TimeoutInMinutes: 240 + }); + }); + + test('creates Lambda function for pipeline check', () => { + template.hasResourceProperties('AWS::Lambda::Function', { + Handler: 'index.handler', + Runtime: 'python3.10' + }); + }); + + test('creates EventBridge rule', () => { + template.hasResourceProperties('AWS::Events::Rule', { + EventPattern: { + 'detail-type': ['CodePipeline Pipeline Execution State Change'], + source: ['aws.codepipeline'], + detail: { + state: ['STARTED'], + 'execution-trigger': { + 'trigger-type': ['CreatePipeline'] + } + } + } + }); + }); + + test('adds required policies to CodeBuild role', () => { + template.hasResourceProperties('AWS::IAM::Policy', { + PolicyDocument: { + Statement: Match.arrayWith([Match.objectLike( + { + Action: [ + 'ec2:DescribeSecurityGroups', + 'codestar-connections:GetConnection', + 'codestar-connections:GetConnectionToken', + 'codeconnections:GetConnectionToken', + 'codeconnections:GetConnection', + 'codeconnections:ListConnection', + 'codeconnections:UseConnection', + 'codebuild:ListConnectedOAuthAccounts', + 'codebuild:ListRepositories', + 'codebuild:PersistOAuthToken', + 'codebuild:ImportSourceCredentials' + ], + Effect: 'Allow', + Resource: '*' + }, + )]) + } + }); + }); + + test('creates CloudWatch log group', () => { + template.hasResourceProperties('AWS::Logs::LogGroup', { + RetentionInDays: 365 + }); + }); + + test('adds custom policy statements when provided', () => { + template.hasResourceProperties('AWS::IAM::Policy', { + PolicyName: Match.stringLikeRegexp(`EmbeddedLinuxCodeBuildProjectRoleDefaultPolicy*`), + PolicyDocument: { + Statement: Match.arrayWith([Match.objectLike( + { + Action: 's3:GetObject', + Effect: 'Allow', + Resource: '*' + }) + ]) + } + }); + }); + + 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-base-image-nag.test.ts b/test/codepipeline-embedded-linux-base-image-nag.test.ts index a2b2e66..b098634 100644 --- a/test/codepipeline-embedded-linux-base-image-nag.test.ts +++ b/test/codepipeline-embedded-linux-base-image-nag.test.ts @@ -1,19 +1,23 @@ -import * as cdk from "aws-cdk-lib"; -import { Annotations, Match } from "aws-cdk-lib/assertions"; +import { describe, expect, test, beforeAll } from '@jest/globals'; import { AwsSolutionsChecks, NagSuppressions } from "cdk-nag"; +import { Annotations, Match } from "aws-cdk-lib/assertions"; + +import * as cdk from "aws-cdk-lib"; 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"; +} from "../lib"; import { DEFAULT_ENV } from "./util"; -function addNagSuppressions(stack: cdk.Stack) { +const base_path = `CodePipelineBuildBaseImage`; + +function addNagSuppressions(_stack: EmbeddedLinuxCodePipelineBaseImageStack, _props: EmbeddedLinuxCodePipelineBaseImageProps) { NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Resource`, + _stack, + `/${_stack.stackName}/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Resource`, [ { id: "AwsSolutions-L1", @@ -22,19 +26,19 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/CodePipelineBuildBaseImageBucketDeploymentRole/Resource`, + _stack, + `/${_stack.stackName}/${base_path}BucketDeploymentRole/Resource`, [ { id: "AwsSolutions-IAM5", reason: - "Because CodePipelineBuildBaseImageBucketDeploymentRole/Resource is needed here.", + `Because ${base_path}BucketDeploymentRole/Resource is needed here.`, }, ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/CodePipelineBuildBaseImageBucketDeploymentRole/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}BucketDeploymentRole/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -44,8 +48,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/CodePipelineBuildBaseImageProject/Role/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}Project/Role/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -55,8 +59,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/CodePipelineBuildBaseImageCodePipeline/Role/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}CodePipeline/Role/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -66,8 +70,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/CodePipelineBuildBaseImageCodePipeline/Source/Source/CodePipelineActionRole/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}CodePipeline/Source/Source/CodePipelineActionRole/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -79,46 +83,37 @@ function addNagSuppressions(stack: cdk.Stack) { } describe("EmbeddedLinuxCodePipelineBaseImageStack cdk-nag AwsSolutions Pack", () => { - const app: cdk.App = new cdk.App(); - let stack: cdk.Stack; + const resource_prefix = "test"; + + let app: cdk.App; + let stack: EmbeddedLinuxCodePipelineBaseImageStack; + let props: EmbeddedLinuxCodePipelineBaseImageProps; + let common: cdk.Stack; beforeAll(() => { // GIVEN - const baseStack = new cdk.Stack(app, "BaseStack", { env: DEFAULT_ENV }); + app = new cdk.App(); - const encryptionKey = new kms.Key(baseStack, "EncryptionKey", { - removalPolicy: cdk.RemovalPolicy.DESTROY, - enableKeyRotation: true, + common = new cdk.Stack(app, `${resource_prefix}-common`, { + env: DEFAULT_ENV }); - 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 = { + // Create required resources for testing + const pipelineSourceBucket = new s3.Bucket(common, `${resource_prefix}-src`, { versioned: true, },); + const pipelineArtifactBucket = new s3.Bucket(common, `${resource_prefix}-art`, {},); + const ecrRepository = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); + + props = { env: DEFAULT_ENV, pipelineSourceBucket: pipelineSourceBucket, pipelineArtifactBucket: pipelineArtifactBucket, ecrRepository: ecrRepository, encryptionKey: encryptionKey, }; + stack = new EmbeddedLinuxCodePipelineBaseImageStack(app, `${resource_prefix}-stack`, props); - stack = new EmbeddedLinuxCodePipelineBaseImageStack( - app, - "MyTestStack", - props, - ); - - addNagSuppressions(stack); + addNagSuppressions(stack, props); // WHEN cdk.Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); diff --git a/test/codepipeline-embedded-linux-base-image.test.ts b/test/codepipeline-embedded-linux-base-image.test.ts index 9679efa..3e1c281 100644 --- a/test/codepipeline-embedded-linux-base-image.test.ts +++ b/test/codepipeline-embedded-linux-base-image.test.ts @@ -1,59 +1,150 @@ -import * as cdk from "aws-cdk-lib"; -import * as assertions from "aws-cdk-lib/assertions"; -import { PipelineResourcesProps, PipelineResourcesStack } from "../lib"; +import { beforeEach, describe, expect, test } from '@jest/globals'; +import { Match, Template } from 'aws-cdk-lib/assertions'; + +import * as cdk from 'aws-cdk-lib'; +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 { EmbeddedLinuxCodePipelineBaseImageProps, - EmbeddedLinuxCodePipelineBaseImageStack, + 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', () => { + const resource_prefix = "test"; -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, - }; + let stack: EmbeddedLinuxCodePipelineBaseImageStack; + let props: EmbeddedLinuxCodePipelineBaseImageProps; + let template: Template; + let common: cdk.Stack; - beforeAll(() => { - // GIVEN + beforeEach(() => { 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); + common = new cdk.Stack(app, `${resource_prefix}-common`, { + env: DEFAULT_ENV + }); + + // Create required resources for testing + const sourceBucket = new s3.Bucket(common, `${resource_prefix}-src`); + const artifactBucket = new s3.Bucket(common, `${resource_prefix}-art`); + const ecrRepo = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); + + // Create the pipeline stack & props + props = { + env: DEFAULT_ENV, + pipelineSourceBucket: sourceBucket, + pipelineArtifactBucket: artifactBucket, + ecrRepository: ecrRepo, + encryptionKey: encryptionKey, + }; + stack = new EmbeddedLinuxCodePipelineBaseImageStack(app, `${resource_prefix}-stack`, props); + + // Create template from stack + template = Template.fromStack(stack); + }); + + test('Pipeline is created with correct stages', () => { + template.hasResourceProperties('AWS::CodePipeline::Pipeline', { + Stages: [ + { + Name: 'Source', + Actions: [ + { + Name: 'Source', + ActionTypeId: { + Category: 'Source', + Owner: 'AWS', + Provider: 'S3', + Version: '1' + } + } + ] + }, + { + Name: 'Build', + Actions: [ + { + Name: 'Build', + ActionTypeId: { + Category: 'Build', + Owner: 'AWS', + Provider: 'CodeBuild', + Version: '1' + } + } + ] + } + ] + }); + }); + + test('CodeBuild project is created with correct configuration', () => { + template.hasResourceProperties('AWS::CodeBuild::Project', { + Environment: { + ComputeType: 'BUILD_GENERAL1_MEDIUM', + Image: 'aws/codebuild/standard:7.0', + PrivilegedMode: true, + Type: 'LINUX_CONTAINER' + } + }); + }); + + test('EventBridge rule is created for weekly pipeline execution', () => { + template.hasResourceProperties('AWS::Events::Rule', { + ScheduleExpression: 'cron(0 6 ? * Monday *)', + State: 'ENABLED', + Targets: [ + { + Arn: { + 'Fn::Join': [ + '', + [ + 'arn:', + { + Ref: 'AWS::Partition' + }, + `:codepipeline:${props.env?.region}:${props.env?.account}:`, + { + 'Ref': Match.stringLikeRegexp("CodePipelineBuildBaseImageCodePipeline*") + } + ] + ] + } + } + ] + }); + }); + + test('CloudWatch log group is created with correct retention', () => { + template.hasResourceProperties('AWS::Logs::LogGroup', { + RetentionInDays: 365 + }); + }); + + test('Required outputs are created', () => { + template.hasOutput('ECRRepositoryName', {}); + template.hasOutput('ECRBaseImageTag', {}); + template.hasOutput('ECRBaseImageCheckCommand', {}); + template.hasOutput('SourceURI', {}); }); - 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('IAM role for bucket deployment has correct permissions', () => { + template.hasResourceProperties('AWS::IAM::Role', { + AssumeRolePolicyDocument: { + Statement: [ + { + Action: 'sts:AssumeRole', + Effect: 'Allow', + Principal: { + Service: 'lambda.amazonaws.com' + } + } + ] + } }); }); diff --git a/test/codepipeline-embedded-linux-nag.test.ts b/test/codepipeline-embedded-linux-nag.test.ts index 065e74c..ec94b48 100644 --- a/test/codepipeline-embedded-linux-nag.test.ts +++ b/test/codepipeline-embedded-linux-nag.test.ts @@ -1,41 +1,50 @@ +import { describe, expect, test, beforeAll } from '@jest/globals'; +import { AwsSolutionsChecks, NagSuppressions } from "cdk-nag"; +import { Annotations, Match } from "aws-cdk-lib/assertions"; + 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 { + ProjectType, + EmbeddedLinuxCodePipelineStack, + EmbeddedLinuxCodePipelineProps +} 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.", - }, - ]); +const base_path = `EmbeddedLinuxCodePipeline`; + +function addNagSuppressions(_stack: EmbeddedLinuxCodePipelineStack, _props: EmbeddedLinuxCodePipelineProps) { + 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`, + _stack, + `/${_stack.stackName}/${base_path}BucketDeploymentRole/Resource`, [ { id: "AwsSolutions-IAM5", reason: - "/aws/lambda/EmbeddedLinuxCodePipeline-CustomCDKBucketDeployment* is needed here.", + "/aws/lambda/${base_path}-CustomCDKBucketDeployment* is needed here.", }, ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Resource`, + _stack, + `/${_stack.stackName}/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Resource`, [ { id: "AwsSolutions-L1", @@ -44,8 +53,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipelineProject/PolicyDocument/Resource`, + _stack, + `/${_stack.stackName}/${base_path}Project/PolicyDocument/Resource`, [ { id: "AwsSolutions-IAM5", @@ -55,8 +64,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipelineProject/Role/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}Project/Role/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -66,8 +75,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipelineBucketDeploymentRole/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}BucketDeploymentRole/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -77,8 +86,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipeline/Role/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}/Role/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -88,8 +97,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipeline/Artifact/Artifact/CodePipelineActionRole/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}/Source/Source/CodePipelineActionRole/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -99,8 +108,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipeline/Source/Source/CodePipelineActionRole/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}/Build/Build/CodePipelineActionRole/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -110,8 +119,19 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8a/ServiceRole/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}/Output/Output/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", @@ -121,8 +141,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipelineOSImageCheckOnStart/Resource`, + _stack, + `/${_stack.stackName}/${base_path}OSImageCheckOnStart/Resource`, [ { id: "AwsSolutions-L1", @@ -131,8 +151,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipelineVMImportRole/Resource`, + _stack, + `/${_stack.stackName}/${base_path}VMImportRole/Resource`, [ { id: "AwsSolutions-IAM5", @@ -142,10 +162,13 @@ function addNagSuppressions(stack: cdk.Stack) { regex: `/Resource::arn:aws:ec2:${DEFAULT_ENV.region}::snapshot/\\*$/g`, }, { - regex: `/Resource::/\\*$/g`, + regex: `/Resource::<${_props.pipelineOutputBucket.node.id.replace('-', '')}A5072518.Arn>/\\*$/g`, }, { - regex: `/Resource::BaseStack:ExportsOutputFnGetAttOutputBucket7114EB27Arn67D5716D/\\*$/g`, + regex: `/Resource::${_stack.stackName}:ExportsOutputFnGetAtt${_props.pipelineOutputBucket.node.id.replace('-', '').toLowerCase()}A5072518ArnD3542377/\\*$/g`, + }, + { + regex: `/Resource::test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377/\\*$/g`, }, { regex: `/Resource::\\*$/g`, @@ -157,37 +180,34 @@ function addNagSuppressions(stack: cdk.Stack) { } describe("EmbeddedLinuxCodePipelineStack cdk-nag AwsSolutions Pack", () => { - const app: cdk.App = new cdk.App(); - let stack: cdk.Stack; + const resource_prefix = "test"; + + let app: cdk.App; + let stack: EmbeddedLinuxCodePipelineStack; + let props: EmbeddedLinuxCodePipelineProps; + let common: cdk.Stack; beforeAll(() => { // GIVEN - const baseStack = new cdk.Stack(app, "BaseStack", { env: DEFAULT_ENV }); + app = new cdk.App(); - // GIVEN - const encryptionKey = new kms.Key(baseStack, "EncryptionKey", { - removalPolicy: cdk.RemovalPolicy.DESTROY, - enableKeyRotation: true, + common = new cdk.Stack(app, `${resource_prefix}-common`, { + env: DEFAULT_ENV }); - 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, + + // GIVEN + + // Create required resources for testing + const pipelineSourceBucket = new s3.Bucket(common, `${resource_prefix}-src`, { versioned: true, },); + const pipelineArtifactBucket = new s3.Bucket(common, `${resource_prefix}-art`, {},); + const pipelineOutputBucket = new s3.Bucket(common, `${resource_prefix}-out`, {},); + const ecrRepository = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); + const vpc = new ec2.Vpc(common, `${resource_prefix}-vpc`, { + maxAzs: 2 }); - const ecrRepository = new ecr.Repository(baseStack, "EcrRepository", {}); - const vpc = new ec2.Vpc(baseStack, "Vpc", {}); - stack = new EmbeddedLinuxCodePipelineStack(app, "MyTestStack", { + props = { env: DEFAULT_ENV, pipelineSourceBucket: pipelineSourceBucket, pipelineArtifactBucket: pipelineArtifactBucket, @@ -198,9 +218,10 @@ describe("EmbeddedLinuxCodePipelineStack cdk-nag AwsSolutions Pack", () => { vpc: vpc, pipelineArtifactPrefix: `${ProjectType.PokyAmi}`, encryptionKey: encryptionKey, - }); + }; + stack = new EmbeddedLinuxCodePipelineStack(app, `${resource_prefix}-stack`, props); - addNagSuppressions(stack); + addNagSuppressions(stack, props); // WHEN cdk.Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); diff --git a/test/codepipeline-embedded-linux.test.ts b/test/codepipeline-embedded-linux.test.ts index 0497075..fce0059 100644 --- a/test/codepipeline-embedded-linux.test.ts +++ b/test/codepipeline-embedded-linux.test.ts @@ -1,84 +1,67 @@ +import * as path from "path"; + +import { beforeEach, describe, expect, test } from '@jest/globals'; +import { Match, Template } from 'aws-cdk-lib/assertions'; + 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 * 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 kms from "aws-cdk-lib/aws-kms"; import { EmbeddedLinuxCodePipelineProps, EmbeddedLinuxCodePipelineStack, + ProjectType, } from "../lib"; import { DEFAULT_ENV, normalizedTemplateFromStack } from "./util"; -// TODO -// - add test with PipelineResourcesProps values for various buckets -// - add test for other outouts +describe('EmbeddedLinuxCodePipelineStack', () => { + const resource_prefix = "test"; -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 + let stack: EmbeddedLinuxCodePipelineStack; + let props: EmbeddedLinuxCodePipelineProps; + let template: Template; + let common: cdk.Stack; + + beforeEach(() => { 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 = { + + common = new cdk.Stack(app, `${resource_prefix}-common`, { + env: DEFAULT_ENV + }); + + // Create required resources for testing + const vpc = new ec2.Vpc(common, `${resource_prefix}-vpc`, { + maxAzs: 2 + }); + const sourceBucket = new s3.Bucket(common, `${resource_prefix}-src`); + const artifactBucket = new s3.Bucket(common, `${resource_prefix}-art`); + const outputBucket = new s3.Bucket(common, `${resource_prefix}-out`); + const ecrRepository = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); + + // Create the pipeline stack & props + props = { 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, + pipelineSourceBucket: sourceBucket, + pipelineArtifactBucket: artifactBucket, + pipelineOutputBucket: outputBucket, + ecrRepository: ecrRepository, + ecrRepositoryImageTag: 'latest', + projectType: ProjectType.Custom, + vpc: vpc, + encryptionKey: encryptionKey, + sourceCustomPath: path.join(__dirname, "buildspec") }; + stack = new EmbeddedLinuxCodePipelineStack(app, `${resource_prefix}-stack`, props); - stack = new EmbeddedLinuxCodePipelineStack( - app, - "MyTestStack", - embeddedLinuxCodePipelineProps, - ); - template = assertions.Template.fromStack(stack); + // Create template from stack + template = Template.fromStack(stack); }); - test("Has Resources", () => { + + test("Has Correct Resources Count", () => { template.resourceCountIs("AWS::CodePipeline::Pipeline", 1); template.resourceCountIs("AWS::CodeBuild::Project", 1); // AWS::Events::Rule: @@ -87,6 +70,209 @@ describe("EmbeddedLinuxCodePipelineStack", () => { // - the weekly refresh template.resourceCountIs("AWS::Events::Rule", 3); template.resourceCountIs("AWS::Logs::LogGroup", 1); + }); + + test('Creates CodePipeline with correct stages', () => { + template.hasResourceProperties('AWS::CodePipeline::Pipeline', { + Stages: [ + { + Name: 'Source', + Actions: [ + { + Name: 'Source', + ActionTypeId: { + Category: 'Source', + Owner: 'AWS', + Provider: 'S3', + Version: '1' + } + } + ] + }, + { + Name: 'Build', + Actions: [ + { + Name: 'Build', + ActionTypeId: { + Category: 'Build', + Owner: 'AWS', + Provider: 'CodeBuild', + Version: '1' + } + } + ] + }, + { + Name: 'Output', + Actions: [ + { + Name: 'Output', + ActionTypeId: { + Category: 'Deploy', + Owner: 'AWS', + Provider: 'S3', + Version: '1' + } + } + ] + } + ] + }); + }); + + test('Creates CodeBuild project with correct configuration', () => { + template.hasResourceProperties('AWS::CodeBuild::Project', { + Environment: { + ComputeType: 'BUILD_GENERAL1_XLARGE', + Image: { + 'Fn::Join': [ + '', + [ + { + 'Fn::Select': [ + 4, + { + 'Fn::Split': [ + ':', + { + "Fn::ImportValue": Match.stringLikeRegexp(`${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace('-', '')}*`) + } + ] + } + ] + }, + '.dkr.ecr.', + { + "Fn::Select": [ + 3, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": Match.stringLikeRegexp(`${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace('-', '')}*`), + }, + ], + }, + ], + }, + '.', + { + 'Ref': 'AWS::URLSuffix' + }, + '/', + { + "Fn::ImportValue": Match.stringLikeRegexp(`${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replace('-', '')}*`), + }, + ":latest", + ] + ] + }, + PrivilegedMode: true, + Type: 'LINUX_CONTAINER' + } + }); + }); + + test('Creates EventBridge rule for weekly pipeline execution', () => { + template.hasResourceProperties('AWS::Events::Rule', { + ScheduleExpression: 'cron(0 6 ? * Tuesday *)', + State: 'ENABLED', + Targets: [ + { + Arn: { + 'Fn::Join': [ + '', + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + `:codepipeline:${props.env?.region}:${props.env?.account}:`, + { + 'Ref': Match.stringLikeRegexp("EmbeddedLinuxCodePipeline*") + } + ] + ] + }, + Id: 'Target0', + RoleArn: { + 'Fn::GetAtt': [ + Match.stringLikeRegexp("EmbeddedLinuxCodePipelineEventsRole*"), + 'Arn' + ] + } + } + ] + }); + }); + + test('Creates EFS filesystem with security group', () => { + template.hasResourceProperties('AWS::EFS::FileSystem', { + FileSystemTags: [ + { + Key: 'Name', + Value: `${stack.stackName}/EmbeddedLinuxCodePipelineFileSystem` + } + ], + Encrypted: true + }); + + template.hasResourceProperties('AWS::EC2::SecurityGroup', { + SecurityGroupIngress: Match.arrayWith([Match.objectLike( + { + CidrIp: { + "Fn::ImportValue": Match.stringLikeRegexp(`${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replace('-', '')}*`) + }, + FromPort: 2049, + IpProtocol: 'tcp', + ToPort: 2049 + }, + )]) + }); + }); + + test('Creates required IAM roles and policies', () => { + // Test VM import role + template.hasResourceProperties('AWS::IAM::Role', { + RoleName: `${stack.stackName}-vm-mport`, + AssumeRolePolicyDocument: { + Statement: [ + { + Action: 'sts:AssumeRole', + Effect: 'Allow', + Principal: { + Service: 'vmie.amazonaws.com' + } + } + ] + } + }); + + // Test CodeBuild service role policies + template.hasResourceProperties('AWS::IAM::Policy', { + PolicyDocument: { + Statement: Match.arrayWith([Match.objectLike( + { + Action: [ + 'ec2:CreateImage', + 'ec2:CreateTags', + 'ec2:DescribeImages', + 'ec2:DescribeSnapshots', + 'ec2:DescribeImportSnapshotTasks', + 'ec2:DescribeTags', + 'ec2:CancelImportTask' + ], + Effect: 'Allow', + Resource: '*' + }, + )]) + }, + }); + }); + + test("Logs Have Minimum Retention Period", () => { + template.resourceCountIs("AWS::Logs::LogGroup", 1); template.allResourcesProperties("AWS::Logs::LogGroup", { RetentionInDays: 365, }); diff --git a/test/codepipeline-resources-nag.test.ts b/test/codepipeline-resources-nag.test.ts index 310bee9..5cd8929 100644 --- a/test/codepipeline-resources-nag.test.ts +++ b/test/codepipeline-resources-nag.test.ts @@ -1,22 +1,32 @@ -import * as cdk from "aws-cdk-lib"; - -import { Annotations, Match } from "aws-cdk-lib/assertions"; +import { describe, expect, test, beforeAll } from '@jest/globals'; import { AwsSolutionsChecks } from "cdk-nag"; +import { Annotations, Match } from "aws-cdk-lib/assertions"; + +import * as cdk from "aws-cdk-lib"; +import { + PipelineResourcesProps, + PipelineResourcesStack +} from "../lib"; 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; + const resource_prefix = "test"; + + let app: cdk.App; + let stack: PipelineResourcesStack; + let props: PipelineResourcesProps; beforeAll(() => { // GIVEN - const props = { + app = new cdk.App(); + + props = { env: DEFAULT_ENV, resource_prefix: `${DEFAULT_ENV.account}-${DEFAULT_ENV.region}`, }; - stack = new PipelineResourcesStack(app, "MyTestStack", props); + stack = new PipelineResourcesStack(app, `${resource_prefix}-stack`, props); // WHEN cdk.Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); diff --git a/test/codepipeline-resources.test.ts b/test/codepipeline-resources.test.ts index 391e12c..cc13566 100644 --- a/test/codepipeline-resources.test.ts +++ b/test/codepipeline-resources.test.ts @@ -1,56 +1,144 @@ +import { beforeEach, describe, expect, it, test } from '@jest/globals'; +import { Match, Template } from 'aws-cdk-lib/assertions'; + import * as cdk from "aws-cdk-lib"; -import * as assertions from "aws-cdk-lib/assertions"; -import { PipelineResourcesProps, PipelineResourcesStack } from "../lib"; +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 +const resource_prefix = "test"; +Object.prototype.toString = function () { + return JSON.stringify(this); +}; describe("PipelineResourcesStack", () => { - let stack: cdk.Stack, app: cdk.App, template: assertions.Template; - const props: PipelineResourcesProps = { - resource_prefix: "test", - env: DEFAULT_ENV, - }; - beforeAll(() => { - // GIVEN + const resource_prefix = "test"; + + let app: cdk.App; + let stack: PipelineResourcesStack; + let props: PipelineResourcesProps; + let template: Template; + + beforeEach(() => { app = new cdk.App(); - stack = new PipelineResourcesStack(app, "MyTestStack", props); - template = assertions.Template.fromStack(stack); + + props = { + resource_prefix: resource_prefix, + env: DEFAULT_ENV, + }; + + stack = new PipelineResourcesStack(app, `${resource_prefix}-stack`, props); + template = Template.fromStack(stack); + }); + + test("creates VPC with correct CIDR", () => { + template.hasResourceProperties("AWS::EC2::VPC", { + CidrBlock: "10.0.0.0/16", + }); + }); + + test("creates ECR repository", () => { + template.hasResourceProperties("AWS::ECR::Repository", { + RepositoryName: `${resource_prefix}-${DEFAULT_ENV.account}-${DEFAULT_ENV.region}-repo` + }); + }); + + test("creates KMS key with rotation enabled", () => { + template.hasResourceProperties("AWS::KMS::Key", { + EnableKeyRotation: true, + }); }); 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(); + it.each(bucketSuffixes)(`Has S3 Bucket with versioning enabled`, (bucketSuffix) => { + const bucketName = `${resource_prefix}-${DEFAULT_ENV.account}-${DEFAULT_ENV.region}-${bucketSuffix}`; template.hasResourceProperties("AWS::S3::Bucket", { BucketName: bucketName, + VersioningConfiguration: { + Status: "Enabled", + }, }); }); - 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("creates VPC flow logs", () => { + template.hasResourceProperties("AWS::EC2::FlowLog", { + ResourceType: "VPC", + TrafficType: "ALL", + }); + + template.hasResourceProperties("AWS::Logs::LogGroup", { + RetentionInDays: 365, + }); }); - test("Logs Have Retention Period", () => { + test("creates buckets and ECR repo with custom names when provided", () => { + const customName: string = `${resource_prefix}-${DEFAULT_ENV.account}-${DEFAULT_ENV.region}-custom-xxxxxxxxxxxxxx`; + const appWithCustomNames = new cdk.App(); + const stackWithCustomNames = new PipelineResourcesStack( + appWithCustomNames, + `${resource_prefix}-stack-custom`, + { + resource_prefix: resource_prefix, + ecrRepositoryName: customName, + pipelineArtifactBucketName: customName, + pipelineSourceBucketName: customName, + pipelineOutputBucketName: customName, + loggingBucketName: customName, + } + ); + const templateWithCustomNames = Template.fromStack(stackWithCustomNames); + + templateWithCustomNames.hasResourceProperties("AWS::ECR::Repository", { + RepositoryName: customName, + }); + + templateWithCustomNames.hasResourceProperties("AWS::S3::Bucket", { + BucketName: customName, + }); + + templateWithCustomNames.resourceCountIs("AWS::S3::Bucket", 4); + }); + + test("Logs Have Minimum Retention Period", () => { template.resourceCountIs("AWS::Logs::LogGroup", 1); template.allResourcesProperties("AWS::Logs::LogGroup", { RetentionInDays: 365, }); }); + test("creates required outputs", () => { + template.hasOutput("LoggingBucket", {}); + template.hasOutput("SourceBucket", {}); + template.hasOutput("ArtifactBucket", {}); + template.hasOutput("OutputBucket", {}); + }); + + test("enforces SSL on all buckets", () => { + const buckets = template.findResources("AWS::S3::Bucket"); + template.resourceCountIs("AWS::S3::BucketPolicy", Object.keys(buckets).length); + + template.hasResourceProperties("AWS::S3::BucketPolicy", { + PolicyDocument: { + Statement: Match.arrayWith([Match.objectLike( + { + Action: "s3:*", + Condition: { + Bool: { + "aws:SecureTransport": "false", + }, + }, + Effect: "Deny", + Principal: { + AWS: "*", + }, + }, + )]) + }, + }); + }); + test("Snapshot", () => { /* We must change some randomly generated file names used in the S3 asset construct. */ const templateWithConstKeys = normalizedTemplateFromStack(stack); From 59b68674b41df381a5d9f2d9291c874f464b32c5 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 26 Mar 2025 15:33:03 +0100 Subject: [PATCH 086/112] adding jest test and fixing output location for pipelines --- eslint.config.mjs | 13 + lib/codepipeline-embedded-linux.ts | 12 +- .../codebuild-embedded-linux.test.ts.snap | 1656 +++++++++++++++++ ...ine-embedded-linux-base-image.test.ts.snap | 274 ++- .../codepipeline-embedded-linux.test.ts.snap | 644 +++---- .../codepipeline-resources.test.ts.snap | 46 +- test/buildspec/build.buildspec.yml | 29 + test/codebuild-embedded-linux-nag.test.ts | 162 ++ test/codebuild-embedded-linux.test.ts | 413 ++++ ...line-embedded-linux-base-image-nag.test.ts | 81 +- ...pipeline-embedded-linux-base-image.test.ts | 173 +- test/codepipeline-embedded-linux-nag.test.ts | 143 +- test/codepipeline-embedded-linux.test.ts | 323 +++- test/codepipeline-resources-nag.test.ts | 22 +- test/codepipeline-resources.test.ts | 164 +- 15 files changed, 3333 insertions(+), 822 deletions(-) create mode 100644 test/__snapshots__/codebuild-embedded-linux.test.ts.snap create mode 100644 test/buildspec/build.buildspec.yml create mode 100644 test/codebuild-embedded-linux-nag.test.ts create mode 100644 test/codebuild-embedded-linux.test.ts diff --git a/eslint.config.mjs b/eslint.config.mjs index 86e6d67..c266dc2 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -74,6 +74,19 @@ export default [ trailingComma: "all", }, ], + + "@typescript-eslint/no-unused-vars": [ + "error", + { + args: "all", + argsIgnorePattern: "^_", + caughtErrors: "all", + caughtErrorsIgnorePattern: "^_", + destructuredArrayIgnorePattern: "^_", + varsIgnorePattern: "^_", + ignoreRestSiblings: true, + }, + ], }, ignores: [ "jest.config.js", diff --git a/lib/codepipeline-embedded-linux.ts b/lib/codepipeline-embedded-linux.ts index 99f5841..c3bdbc2 100644 --- a/lib/codepipeline-embedded-linux.ts +++ b/lib/codepipeline-embedded-linux.ts @@ -272,12 +272,12 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { project, }); - const artifactAction: codepipeline_actions.S3DeployAction = + const outputAction: codepipeline_actions.S3DeployAction = new codepipeline_actions.S3DeployAction({ - actionName: "Artifact", + actionName: "Output", input: buildActionOutputArtifact, - bucket: props.pipelineArtifactBucket, - objectKey: `${props.pipelineArtifactPrefix}/${sourceRepoAsset.s3ObjectKey}`, + bucket: props.pipelineOutputBucket, + objectKey: `${props.pipelineOutputPrefix}`, }); /** Here we create the logic to check for presence of ECR image on the CodeCodePipeline automatic triggering upon resource creation, @@ -352,8 +352,8 @@ export class EmbeddedLinuxCodePipelineStack extends cdk.Stack { actions: [buildAction], }, { - stageName: "Artifact", - actions: [artifactAction], + stageName: "Output", + actions: [outputAction], }, ], }, diff --git a/test/__snapshots__/codebuild-embedded-linux.test.ts.snap b/test/__snapshots__/codebuild-embedded-linux.test.ts.snap new file mode 100644 index 0000000..8d811aa --- /dev/null +++ b/test/__snapshots__/codebuild-embedded-linux.test.ts.snap @@ -0,0 +1,1656 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`EmbeddedLinuxCodeBuildProjectStack Custom 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": { + "EmbeddedLinuxCodeBuildProject2101BD97": { + "DependsOn": [ + "EmbeddedLinuxCodeBuildProjectPolicyDocumentCDFD1ED5", + ], + "Properties": { + "Artifacts": { + "Type": "NO_ARTIFACTS", + }, + "Cache": { + "Type": "NO_CACHE", + }, + "EncryptionKey": { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", + }, + "Environment": { + "ComputeType": "BUILD_GENERAL1_XLARGE", + "Image": { + "Fn::Join": [ + "", + [ + { + "Fn::Select": [ + 4, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", + }, + ], + }, + ], + }, + ".dkr.ecr.", + { + "Fn::Select": [ + 3, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", + }, + ], + }, + ], + }, + ".", + { + "Ref": "AWS::URLSuffix", + }, + "/", + { + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", + }, + ":latest", + ], + ], + }, + "ImagePullCredentialsType": "SERVICE_ROLE", + "PrivilegedMode": true, + "Type": "LINUX_CONTAINER", + }, + "FileSystemLocations": [ + { + "Identifier": "nfs", + "Location": { + "Fn::Join": [ + "", + [ + { + "Ref": "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F", + }, + ".efs.eu-central-1.amazonaws.com:/", + ], + ], + }, + "MountPoint": "/nfs", + "Type": "EFS", + }, + ], + "LogsConfig": { + "CloudWatchLogs": { + "GroupName": { + "Ref": "EmbeddedLinuxCodeBuildProjectLogs790B1140", + }, + "Status": "ENABLED", + }, + }, + "Name": "test-stack", + "ServiceRole": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectRole692E9BCD", + "Arn", + ], + }, + "Source": { + "BuildSpec": "{ + "version": "0.2", + "phases": { + "build": { + "commands": [ + "echo \\"DUMMY BUILDSPEC - can not be empty\\"" + ] + } + }, + "artifacts": { + "files": [ + "**/*" + ], + "base-directory": "." + } +}", + "Type": "NO_SOURCE", + }, + "TimeoutInMinutes": 240, + "VpcConfig": { + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectSecurityGroupB289294B", + "GroupId", + ], + }, + ], + "Subnets": [ + { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", + }, + { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", + }, + ], + "VpcId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", + }, + }, + }, + "Type": "AWS::CodeBuild::Project", + }, + "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F": { + "DeletionPolicy": "Delete", + "Properties": { + "Encrypted": true, + "FileSystemTags": [ + { + "Key": "Name", + "Value": "test-stack/EmbeddedLinuxCodeBuildProjectFilesystem", + }, + ], + }, + "Type": "AWS::EFS::FileSystem", + "UpdateReplacePolicy": "Delete", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsMountTarget1BB9724D2": { + "Properties": { + "FileSystemId": { + "Ref": "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsMountTarget270BB2C65": { + "Properties": { + "FileSystemId": { + "Ref": "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65": { + "Properties": { + "GroupDescription": "test-stack/EmbeddedLinuxCodeBuildProjectFilesystem/EfsSecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1", + }, + ], + "Tags": [ + { + "Key": "Name", + "Value": "test-stack/EmbeddedLinuxCodeBuildProjectFilesystem", + }, + ], + "VpcId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", + }, + }, + "Type": "AWS::EC2::SecurityGroup", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroupfromteststackEmbeddedLinuxCodeBuildProjectSecurityGroup58F8D73B20499408861B": { + "Properties": { + "Description": "from teststackEmbeddedLinuxCodeBuildProjectSecurityGroup58F8D73B:2049", + "FromPort": 2049, + "GroupId": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65", + "GroupId", + ], + }, + "IpProtocol": "tcp", + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectSecurityGroupB289294B", + "GroupId", + ], + }, + "ToPort": 2049, + }, + "Type": "AWS::EC2::SecurityGroupIngress", + }, + "EmbeddedLinuxCodeBuildProjectLogs790B1140": { + "DeletionPolicy": "Delete", + "Properties": { + "LogGroupName": "test-stack-EmbeddedLinuxCodeBuildProjectLogs", + "RetentionInDays": 365, + }, + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + }, + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49": { + "DependsOn": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartServiceRole886C2BCC", + ], + "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": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", + }, + "', filter={'tagStatus': 'TAGGED'}) + for i in response['imageDetails']: + if 'latest' 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": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartServiceRole886C2BCC", + "Arn", + ], + }, + "Runtime": "python3.10", + }, + "Type": "AWS::Lambda::Function", + }, + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartLogRetentionC530B5EE": { + "Properties": { + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/lambda/", + { + "Ref": "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49", + }, + ], + ], + }, + "RetentionInDays": 365, + "ServiceToken": { + "Fn::GetAtt": [ + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", + "Arn", + ], + }, + }, + "Type": "Custom::LogRetention", + }, + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartServiceRole886C2BCC": { + "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", + }, + "EmbeddedLinuxCodeBuildProjectOnPipelineStartRuleA197C004": { + "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": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49", + "Arn", + ], + }, + "Id": "Target0", + }, + ], + }, + "Type": "AWS::Events::Rule", + }, + "EmbeddedLinuxCodeBuildProjectOnPipelineStartRuleAllowEventRuleteststackEmbeddedLinuxCodeBuildProjectOSImageCheckOnStartDE4F09A20DAF4342": { + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49", + "Arn", + ], + }, + "Principal": "events.amazonaws.com", + "SourceArn": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectOnPipelineStartRuleA197C004", + "Arn", + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "EmbeddedLinuxCodeBuildProjectPolicyDocumentCDFD1ED5": { + "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": "EmbeddedLinuxCodeBuildProjectPolicyDocumentCDFD1ED5", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodeBuildProjectRole692E9BCD", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodeBuildProjectRole692E9BCD": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codebuild.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/AWSCodeBuildAdminAccess", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "EmbeddedLinuxCodeBuildProjectRoleDefaultPolicyFE7F690E": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "ecr:BatchCheckLayerAvailability", + "ecr:GetDownloadUrlForLayer", + "ecr:BatchGetImage", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", + }, + }, + { + "Action": "ecr:GetAuthorizationToken", + "Effect": "Allow", + "Resource": "*", + }, + { + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents", + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectLogs790B1140", + "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": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", + }, + ], + ], + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":ec2:", + { + "Ref": "AWS::Region", + }, + ":", + { + "Ref": "AWS::AccountId", + }, + ":subnet/", + { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", + }, + ], + ], + }, + ], + }, + }, + "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": "EmbeddedLinuxCodeBuildProject2101BD97", + }, + ], + ], + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":logs:eu-central-1:111111111111:log-group:/aws/codebuild/", + { + "Ref": "EmbeddedLinuxCodeBuildProject2101BD97", + }, + ":*", + ], + ], + }, + ], + }, + { + "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": "EmbeddedLinuxCodeBuildProject2101BD97", + }, + "-*", + ], + ], + }, + }, + { + "Action": [ + "kms:Decrypt", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", + }, + }, + { + "Action": "s3:GetObject", + "Effect": "Allow", + "Resource": "*", + }, + { + "Action": [ + "ec2:DescribeSecurityGroups", + "codestar-connections:GetConnection", + "codestar-connections:GetConnectionToken", + "codeconnections:GetConnectionToken", + "codeconnections:GetConnection", + "codeconnections:ListConnection", + "codeconnections:UseConnection", + "codebuild:ListConnectedOAuthAccounts", + "codebuild:ListRepositories", + "codebuild:PersistOAuthToken", + "codebuild:ImportSourceCredentials", + ], + "Effect": "Allow", + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodeBuildProjectRoleDefaultPolicyFE7F690E", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodeBuildProjectRole692E9BCD", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodeBuildProjectSecurityGroupB289294B": { + "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": "test-common:ExportsOutputFnGetAtttestvpc8985080ECidrBlockEB7C13CD", + }, + "Description": "NFS Mount Port", + "FromPort": 2049, + "IpProtocol": "tcp", + "ToPort": 2049, + }, + ], + "VpcId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", + }, + }, + "Type": "AWS::EC2::SecurityGroup", + }, + "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.", + }, + ], + }, + }, +} +`; + +exports[`EmbeddedLinuxCodeBuildProjectStack 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": { + "EmbeddedLinuxCodeBuildProject2101BD97": { + "DependsOn": [ + "EmbeddedLinuxCodeBuildProjectPolicyDocumentCDFD1ED5", + ], + "Properties": { + "Artifacts": { + "Type": "NO_ARTIFACTS", + }, + "Cache": { + "Type": "NO_CACHE", + }, + "EncryptionKey": { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", + }, + "Environment": { + "ComputeType": "BUILD_GENERAL1_XLARGE", + "Image": { + "Fn::Join": [ + "", + [ + { + "Fn::Select": [ + 4, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", + }, + ], + }, + ], + }, + ".dkr.ecr.", + { + "Fn::Select": [ + 3, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", + }, + ], + }, + ], + }, + ".", + { + "Ref": "AWS::URLSuffix", + }, + "/", + { + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", + }, + ":latest", + ], + ], + }, + "ImagePullCredentialsType": "SERVICE_ROLE", + "PrivilegedMode": true, + "Type": "LINUX_CONTAINER", + }, + "FileSystemLocations": [ + { + "Identifier": "nfs", + "Location": { + "Fn::Join": [ + "", + [ + { + "Ref": "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F", + }, + ".efs.eu-central-1.amazonaws.com:/", + ], + ], + }, + "MountPoint": "/nfs", + "Type": "EFS", + }, + ], + "LogsConfig": { + "CloudWatchLogs": { + "GroupName": { + "Ref": "EmbeddedLinuxCodeBuildProjectLogs790B1140", + }, + "Status": "ENABLED", + }, + }, + "Name": "test-stack", + "ServiceRole": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectRole692E9BCD", + "Arn", + ], + }, + "Source": { + "BuildSpec": "{ + "version": "0.2", + "phases": { + "build": { + "commands": [ + "echo \\"DUMMY BUILDSPEC - can not be empty\\"" + ] + } + }, + "artifacts": { + "files": [ + "**/*" + ], + "base-directory": "." + } +}", + "Type": "NO_SOURCE", + }, + "TimeoutInMinutes": 240, + "VpcConfig": { + "SecurityGroupIds": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectSecurityGroupB289294B", + "GroupId", + ], + }, + ], + "Subnets": [ + { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", + }, + { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", + }, + ], + "VpcId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", + }, + }, + }, + "Type": "AWS::CodeBuild::Project", + }, + "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F": { + "DeletionPolicy": "Delete", + "Properties": { + "Encrypted": true, + "FileSystemTags": [ + { + "Key": "Name", + "Value": "test-stack/EmbeddedLinuxCodeBuildProjectFilesystem", + }, + ], + }, + "Type": "AWS::EFS::FileSystem", + "UpdateReplacePolicy": "Delete", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsMountTarget1BB9724D2": { + "Properties": { + "FileSystemId": { + "Ref": "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsMountTarget270BB2C65": { + "Properties": { + "FileSystemId": { + "Ref": "EmbeddedLinuxCodeBuildProjectFilesystem54E4C11F", + }, + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65", + "GroupId", + ], + }, + ], + "SubnetId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", + }, + }, + "Type": "AWS::EFS::MountTarget", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65": { + "Properties": { + "GroupDescription": "test-stack/EmbeddedLinuxCodeBuildProjectFilesystem/EfsSecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1", + }, + ], + "Tags": [ + { + "Key": "Name", + "Value": "test-stack/EmbeddedLinuxCodeBuildProjectFilesystem", + }, + ], + "VpcId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", + }, + }, + "Type": "AWS::EC2::SecurityGroup", + }, + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroupfromteststackEmbeddedLinuxCodeBuildProjectSecurityGroup58F8D73B20499408861B": { + "Properties": { + "Description": "from teststackEmbeddedLinuxCodeBuildProjectSecurityGroup58F8D73B:2049", + "FromPort": 2049, + "GroupId": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectFilesystemEfsSecurityGroup64B52E65", + "GroupId", + ], + }, + "IpProtocol": "tcp", + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectSecurityGroupB289294B", + "GroupId", + ], + }, + "ToPort": 2049, + }, + "Type": "AWS::EC2::SecurityGroupIngress", + }, + "EmbeddedLinuxCodeBuildProjectLogs790B1140": { + "DeletionPolicy": "Delete", + "Properties": { + "LogGroupName": "test-stack-EmbeddedLinuxCodeBuildProjectLogs", + "RetentionInDays": 365, + }, + "Type": "AWS::Logs::LogGroup", + "UpdateReplacePolicy": "Delete", + }, + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49": { + "DependsOn": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartServiceRole886C2BCC", + ], + "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": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", + }, + "', filter={'tagStatus': 'TAGGED'}) + for i in response['imageDetails']: + if 'latest' 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": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartServiceRole886C2BCC", + "Arn", + ], + }, + "Runtime": "python3.10", + }, + "Type": "AWS::Lambda::Function", + }, + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartLogRetentionC530B5EE": { + "Properties": { + "LogGroupName": { + "Fn::Join": [ + "", + [ + "/aws/lambda/", + { + "Ref": "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49", + }, + ], + ], + }, + "RetentionInDays": 365, + "ServiceToken": { + "Fn::GetAtt": [ + "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A", + "Arn", + ], + }, + }, + "Type": "Custom::LogRetention", + }, + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartServiceRole886C2BCC": { + "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", + }, + "EmbeddedLinuxCodeBuildProjectOnPipelineStartRuleA197C004": { + "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": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49", + "Arn", + ], + }, + "Id": "Target0", + }, + ], + }, + "Type": "AWS::Events::Rule", + }, + "EmbeddedLinuxCodeBuildProjectOnPipelineStartRuleAllowEventRuleteststackEmbeddedLinuxCodeBuildProjectOSImageCheckOnStartDE4F09A20DAF4342": { + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectOSImageCheckOnStartA4649D49", + "Arn", + ], + }, + "Principal": "events.amazonaws.com", + "SourceArn": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectOnPipelineStartRuleA197C004", + "Arn", + ], + }, + }, + "Type": "AWS::Lambda::Permission", + }, + "EmbeddedLinuxCodeBuildProjectPolicyDocumentCDFD1ED5": { + "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": "EmbeddedLinuxCodeBuildProjectPolicyDocumentCDFD1ED5", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodeBuildProjectRole692E9BCD", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodeBuildProjectRole692E9BCD": { + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "codebuild.amazonaws.com", + }, + }, + ], + "Version": "2012-10-17", + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":iam::aws:policy/AWSCodeBuildAdminAccess", + ], + ], + }, + ], + }, + "Type": "AWS::IAM::Role", + }, + "EmbeddedLinuxCodeBuildProjectRoleDefaultPolicyFE7F690E": { + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "ecr:BatchCheckLayerAvailability", + "ecr:GetDownloadUrlForLayer", + "ecr:BatchGetImage", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", + }, + }, + { + "Action": "ecr:GetAuthorizationToken", + "Effect": "Allow", + "Resource": "*", + }, + { + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents", + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "EmbeddedLinuxCodeBuildProjectLogs790B1140", + "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": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", + }, + ], + ], + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":ec2:", + { + "Ref": "AWS::Region", + }, + ":", + { + "Ref": "AWS::AccountId", + }, + ":subnet/", + { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", + }, + ], + ], + }, + ], + }, + }, + "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": "EmbeddedLinuxCodeBuildProject2101BD97", + }, + ], + ], + }, + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition", + }, + ":logs:eu-central-1:111111111111:log-group:/aws/codebuild/", + { + "Ref": "EmbeddedLinuxCodeBuildProject2101BD97", + }, + ":*", + ], + ], + }, + ], + }, + { + "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": "EmbeddedLinuxCodeBuildProject2101BD97", + }, + "-*", + ], + ], + }, + }, + { + "Action": [ + "kms:Decrypt", + "kms:Encrypt", + "kms:ReEncrypt*", + "kms:GenerateDataKey*", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", + }, + }, + { + "Action": [ + "ec2:DescribeSecurityGroups", + "codestar-connections:GetConnection", + "codestar-connections:GetConnectionToken", + "codeconnections:GetConnectionToken", + "codeconnections:GetConnection", + "codeconnections:ListConnection", + "codeconnections:UseConnection", + "codebuild:ListConnectedOAuthAccounts", + "codebuild:ListRepositories", + "codebuild:PersistOAuthToken", + "codebuild:ImportSourceCredentials", + ], + "Effect": "Allow", + "Resource": "*", + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodeBuildProjectRoleDefaultPolicyFE7F690E", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodeBuildProjectRole692E9BCD", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, + "EmbeddedLinuxCodeBuildProjectSecurityGroupB289294B": { + "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": "test-common:ExportsOutputFnGetAtttestvpc8985080ECidrBlockEB7C13CD", + }, + "Description": "NFS Mount Port", + "FromPort": 2049, + "IpProtocol": "tcp", + "ToPort": 2049, + }, + ], + "VpcId": { + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", + }, + }, + "Type": "AWS::EC2::SecurityGroup", + }, + "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-embedded-linux-base-image.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap index 4c808c7..e4acead 100644 --- a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap @@ -11,21 +11,21 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` [ "aws ecr list-images --repository-name "", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", }, - "" --query "imageIds[?imageTag=='MyTestStack']"", + "" --query "imageIds[?imageTag=='test-stack']"", ], ], }, }, "ECRBaseImageTag": { "Description": "The ECR Image Tag where the base image will be pushed", - "Value": "MyTestStack", + "Value": "test-stack", }, "ECRRepositoryName": { "Description": "The ECR Repository name where the base image will be pushed", "Value": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", }, }, "SourceURI": { @@ -36,7 +36,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` [ "s3://", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", }, "/base-image/arbitrary-file.ext", ], @@ -67,7 +67,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Properties": { "DestinationBucketKeyPrefix": "base-image", "DestinationBucketName": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", }, "Extract": false, "OutputObjectKeys": true, @@ -178,14 +178,14 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, "/*", ], @@ -193,19 +193,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, ], "Version": "2012-10-17", }, @@ -221,7 +208,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "CodePipelineBuildBaseImageBuildLogs48BFE4D7": { "DeletionPolicy": "Delete", "Properties": { - "LogGroupName": "MyTestStack-CodePipelineBuildBaseImageBuildLogs", + "LogGroupName": "test-stack-CodePipelineBuildBaseImageBuildLogs", "RetentionInDays": 365, }, "Type": "AWS::Logs::LogGroup", @@ -237,18 +224,12 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` ], "Properties": { "ArtifactStore": { - "EncryptionKey": { - "Id": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - "Type": "KMS", - }, "Location": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesArtifactBucketFF61EB98FA6EAAC1", + "Fn::ImportValue": "test-common:ExportsOutputReftestartF0FFB4BEEC699EE6", }, "Type": "S3", }, - "Name": "MyTestStack", + "Name": "test-stack", "PipelineType": "V1", "RestartExecutionOnUpdate": true, "RoleArn": { @@ -270,7 +251,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Configuration": { "PollForSourceChanges": false, "S3Bucket": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", }, "S3ObjectKey": "base-image/arbitrary-file.ext", }, @@ -456,83 +437,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, "Type": "AWS::IAM::Policy", }, - "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", @@ -580,14 +484,14 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, "/*", ], @@ -595,19 +499,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": "sts:AssumeRole", "Effect": "Allow", @@ -691,14 +582,14 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, "/base-image/arbitrary-file.ext", ], @@ -706,16 +597,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": [ "s3:DeleteObject*", @@ -729,14 +610,14 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, "/*", ], @@ -744,18 +625,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - "kms:Decrypt", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, ], "Version": "2012-10-17", }, @@ -768,6 +637,83 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, "Type": "AWS::IAM::Policy", }, + "CodePipelineBuildBaseImageCodePipelineteststackCodePipelineBuildBaseImageCodePipelineBEEAC58ESourceEventRulebaseimage1ccdf1583059080a3911192a20ae50cc6b3bfa57d56d0b5b4d3866f920b3ad20zipE860D013": { + "DependsOn": [ + "CodePipelineBuildBaseImageProject69590E59", + "CodePipelineBuildBaseImageProjectRoleDefaultPolicy6F99FFCC", + "CodePipelineBuildBaseImageProjectRole12B97AA7", + ], + "Properties": { + "EventPattern": { + "detail": { + "eventName": [ + "CompleteMultipartUpload", + "CopyObject", + "PutObject", + ], + "requestParameters": { + "bucketName": [ + { + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", + }, + ], + "key": [ + "base-image/arbitrary-file.ext", + ], + }, + "resources": { + "ARN": [ + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", + }, + "/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", + }, "CodePipelineBuildBaseImageProject69590E59": { "DependsOn": [ "CodePipelineBuildBaseImageBucketDeploymentAwsCliLayerF8B77510", @@ -781,7 +727,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Type": "NO_CACHE", }, "EncryptionKey": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", }, "Environment": { "ComputeType": "BUILD_GENERAL1_MEDIUM", @@ -800,7 +746,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Fn::Split": [ ":", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, ], }, @@ -814,7 +760,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Fn::Split": [ ":", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, ], }, @@ -826,7 +772,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, "/", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", }, ], ], @@ -845,7 +791,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` { "Name": "IMAGE_TAG", "Type": "PLAINTEXT", - "Value": "MyTestStack", + "Value": "test-stack", }, ], "Image": "aws/codebuild/standard:7.0", @@ -861,7 +807,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Status": "ENABLED", }, }, - "Name": "MyTestStack", + "Name": "test-stack", "ServiceRole": { "Fn::GetAtt": [ "CodePipelineBuildBaseImageProjectRole12B97AA7", @@ -993,7 +939,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", }, }, { @@ -1008,7 +954,7 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, }, { @@ -1025,14 +971,14 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, "/*", ], @@ -1040,16 +986,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, ], "Version": "2012-10-17", }, diff --git a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap index 22deb32..376c99d 100644 --- a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap @@ -11,9 +11,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` [ "s3://", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesArtifactBucketFF61EB98FA6EAAC1", + "Fn::ImportValue": "test-common:ExportsOutputReftestartF0FFB4BEEC699EE6", }, - "/poky/arbitrary-file.ext", + "/custom/arbitrary-file.ext", ], ], }, @@ -26,9 +26,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` [ "s3://", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesOutputBucketA2144F25070A0F1C", + "Fn::ImportValue": "test-common:ExportsOutputReftestoutA50725182A5BCA18", }, - "/poky", + "/custom", ], ], }, @@ -41,9 +41,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` [ "s3://", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", }, - "/poky/arbitrary-file.ext", + "/custom/arbitrary-file.ext", ], ], }, @@ -100,18 +100,12 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` ], "Properties": { "ArtifactStore": { - "EncryptionKey": { - "Id": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - "Type": "KMS", - }, "Location": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesArtifactBucketFF61EB98FA6EAAC1", + "Fn::ImportValue": "test-common:ExportsOutputReftestartF0FFB4BEEC699EE6", }, "Type": "S3", }, - "Name": "MyTestStack", + "Name": "test-stack", "PipelineType": "V1", "RestartExecutionOnUpdate": true, "RoleArn": { @@ -133,9 +127,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Configuration": { "PollForSourceChanges": false, "S3Bucket": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", }, - "S3ObjectKey": "poky/arbitrary-file.ext", + "S3ObjectKey": "custom/arbitrary-file.ext", }, "Name": "Source", "OutputArtifacts": [ @@ -201,162 +195,32 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "Configuration": { "BucketName": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesArtifactBucketFF61EB98FA6EAAC1", + "Fn::ImportValue": "test-common:ExportsOutputReftestoutA50725182A5BCA18", }, "Extract": "true", - "ObjectKey": "poky/arbitrary-file.ext", + "ObjectKey": "custom", }, "InputArtifacts": [ { "Name": "Artifact_Build_Build", }, ], - "Name": "Artifact", + "Name": "Output", "RoleArn": { "Fn::GetAtt": [ - "EmbeddedLinuxCodePipelineArtifactCodePipelineActionRole97F56214", + "EmbeddedLinuxCodePipelineOutputCodePipelineActionRole999D254E", "Arn", ], }, "RunOrder": 1, }, ], - "Name": "Artifact", + "Name": "Output", }, ], }, "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": { @@ -370,9 +234,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "EmbeddedLinuxCodePipelineBucketDeploymentCustomResourceBA39990C": { "DeletionPolicy": "Delete", "Properties": { - "DestinationBucketKeyPrefix": "poky", + "DestinationBucketKeyPrefix": "custom", "DestinationBucketName": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesSourceBucket1FA488F54AA73B60", + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", }, "Extract": false, "OutputObjectKeys": true, @@ -483,14 +347,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, "/*", ], @@ -498,19 +362,6 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, ], "Version": "2012-10-17", }, @@ -606,7 +457,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "SecurityGroupIngress": [ { "CidrIp": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesVpc54FB4A02CidrBlock1B329233", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestvpc8985080ECidrBlockEB7C13CD", }, "Description": "NFS Mount Port", "FromPort": 2049, @@ -615,7 +466,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], "VpcId": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpc54FB4A0241E4C5E5", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", }, }, "Type": "AWS::EC2::SecurityGroup", @@ -647,7 +498,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Action": "ecr:DescribeImages", "Effect": "Allow", "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, }, ], @@ -733,7 +584,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "FileSystemTags": [ { "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxCodePipelineFileSystem", + "Value": "test-stack/EmbeddedLinuxCodePipelineFileSystem", }, ], }, @@ -754,7 +605,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], "SubnetId": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet1Subnet8DD627A684935C4B", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", }, }, "Type": "AWS::EFS::MountTarget", @@ -773,33 +624,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], "SubnetId": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet2SubnetC1071C9093652F10", - }, - }, - "Type": "AWS::EFS::MountTarget", - }, - "EmbeddedLinuxCodePipelineFileSystemEfsMountTarget3FAD334C7": { - "Properties": { - "FileSystemId": { - "Ref": "EmbeddedLinuxCodePipelineFileSystemB969CAF1", - }, - "SecurityGroups": [ - { - "Fn::GetAtt": [ - "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroup35971CF1", - "GroupId", - ], - }, - ], - "SubnetId": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet3SubnetCA196C90FDAFF9BF", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", }, }, "Type": "AWS::EFS::MountTarget", }, "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroup35971CF1": { "Properties": { - "GroupDescription": "MyTestStack/EmbeddedLinuxCodePipelineFileSystem/EfsSecurityGroup", + "GroupDescription": "test-stack/EmbeddedLinuxCodePipelineFileSystem/EfsSecurityGroup", "SecurityGroupEgress": [ { "CidrIp": "0.0.0.0/0", @@ -810,18 +642,18 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/EmbeddedLinuxCodePipelineFileSystem", + "Value": "test-stack/EmbeddedLinuxCodePipelineFileSystem", }, ], "VpcId": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpc54FB4A0241E4C5E5", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", }, }, "Type": "AWS::EC2::SecurityGroup", }, - "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroupfromMyTestStackEmbeddedLinuxCodePipelineBuildProjectSecurityGroupEA21757F2049FC93D5D2": { + "EmbeddedLinuxCodePipelineFileSystemEfsSecurityGroupfromteststackEmbeddedLinuxCodePipelineBuildProjectSecurityGroup418A122320491D06894E": { "Properties": { - "Description": "from MyTestStackEmbeddedLinuxCodePipelineBuildProjectSecurityGroupEA21757F:2049", + "Description": "from teststackEmbeddedLinuxCodePipelineBuildProjectSecurityGroup418A1223:2049", "FromPort": 2049, "GroupId": { "Fn::GetAtt": [ @@ -840,84 +672,6 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "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", @@ -939,11 +693,11 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` print("Received event: " + json.dumps(event, indent=2)) response = ecr_client.describe_images(repositoryName='", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", }, "', filter={'tagStatus': 'TAGGED'}) for i in response['imageDetails']: - if 'MyBaseImageStack' in i['ecrRepositoryImageTags']: + if 'latest' in i['ecrRepositoryImageTags']: break else: print('OS image not found. Stopping execution.') @@ -1057,7 +811,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "Type": "AWS::Events::Rule", }, - "EmbeddedLinuxCodePipelineOnCodePipelineStartRuleAllowEventRuleMyTestStackEmbeddedLinuxCodePipelineOSImageCheckOnStartADCB57EA531B1926": { + "EmbeddedLinuxCodePipelineOnCodePipelineStartRuleAllowEventRuleteststackEmbeddedLinuxCodePipelineOSImageCheckOnStart43D18F0A7FAE588F": { "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { @@ -1076,6 +830,114 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "Type": "AWS::Lambda::Permission", }, + "EmbeddedLinuxCodePipelineOutputCodePipelineActionRole999D254E": { + "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", + }, + "EmbeddedLinuxCodePipelineOutputCodePipelineActionRoleDefaultPolicy75D08DD8": { + "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": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", + }, + "/*", + ], + ], + }, + ], + }, + { + "Action": [ + "s3:GetObject*", + "s3:GetBucket*", + "s3:List*", + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", + }, + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", + }, + "/*", + ], + ], + }, + ], + }, + ], + "Version": "2012-10-17", + }, + "PolicyName": "EmbeddedLinuxCodePipelineOutputCodePipelineActionRoleDefaultPolicy75D08DD8", + "Roles": [ + { + "Ref": "EmbeddedLinuxCodePipelineOutputCodePipelineActionRole999D254E", + }, + ], + }, + "Type": "AWS::IAM::Policy", + }, "EmbeddedLinuxCodePipelineProjectF55E3B36": { "DependsOn": [ "EmbeddedLinuxCodePipelineBucketDeploymentAwsCliLayerAA1BBC13", @@ -1090,7 +952,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Type": "NO_CACHE", }, "EncryptionKey": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", }, "Environment": { "ComputeType": "BUILD_GENERAL1_XLARGE", @@ -1108,19 +970,19 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` { "Name": "PIPELINE_PROJECT_NAME", "Type": "PLAINTEXT", - "Value": "MyTestStack", + "Value": "test-stack", }, { "Name": "PIPELINE_OUTPUT_BUCKET", "Type": "PLAINTEXT", "Value": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesOutputBucketA2144F25070A0F1C", + "Fn::ImportValue": "test-common:ExportsOutputReftestoutA50725182A5BCA18", }, }, { "Name": "PIPELINE_OUTPUT_BUCKET_PREFIX", "Type": "PLAINTEXT", - "Value": "poky", + "Value": "custom", }, { "Name": "VM_IMPORT_ROLE", @@ -1141,7 +1003,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Fn::Split": [ ":", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, ], }, @@ -1155,7 +1017,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Fn::Split": [ ":", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, ], }, @@ -1167,9 +1029,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "/", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesECRRepositoryA0DB7EB625EEF25E", + "Fn::ImportValue": "test-common:ExportsOutputReftestecr18D9BBA8F49E3A2C", }, - ":MyBaseImageStack", + ":latest", ], ], }, @@ -1203,7 +1065,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Status": "ENABLED", }, }, - "Name": "MyTestStack", + "Name": "test-stack", "ServiceRole": { "Fn::GetAtt": [ "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", @@ -1226,17 +1088,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` ], "Subnets": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet1Subnet8DD627A684935C4B", - }, - { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet2SubnetC1071C9093652F10", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", }, { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet3SubnetCA196C90FDAFF9BF", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", }, ], "VpcId": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpc54FB4A0241E4C5E5", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpc8985080E5120E245", }, }, }, @@ -1245,7 +1104,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "EmbeddedLinuxCodePipelineProjectLogsBA5DB55C": { "DeletionPolicy": "Delete", "Properties": { - "LogGroupName": "MyTestStack-EmbeddedLinuxCodePipelineProjectLogs", + "LogGroupName": "test-stack-EmbeddedLinuxCodePipelineProjectLogs", "RetentionInDays": 365, }, "Type": "AWS::Logs::LogGroup", @@ -1300,7 +1159,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesECRRepositoryA0DB7EB6Arn5EC8487E", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestecr18D9BBA8Arn6B304346", }, }, { @@ -1345,30 +1204,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ":subnet/", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet1Subnet8DD627A684935C4B", - }, - ], - ], - }, - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":ec2:", - { - "Ref": "AWS::Region", - }, - ":", - { - "Ref": "AWS::AccountId", - }, - ":subnet/", - { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet2SubnetC1071C9093652F10", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet1Subnet865FB50A19DF49CF", }, ], ], @@ -1391,7 +1227,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ":subnet/", { - "Fn::ImportValue": "MyResourceStack:ExportsOutputRefPipelineResourcesVpcPrivateSubnet3SubnetCA196C90FDAFF9BF", + "Fn::ImportValue": "test-common:ExportsOutputReftestvpcPrivateSubnet2Subnet23D3396F45FDAD97", }, ], ], @@ -1497,7 +1333,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", }, }, { @@ -1516,14 +1352,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", }, "/*", ], @@ -1531,19 +1367,6 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": [ "ec2:CreateImage", @@ -1576,14 +1399,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", }, "/*", ], @@ -1638,14 +1461,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, "/*", ], @@ -1735,14 +1558,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, "/*", ], @@ -1750,19 +1573,6 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": "sts:AssumeRole", "Effect": "Allow", @@ -1788,7 +1598,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": { "Fn::GetAtt": [ - "EmbeddedLinuxCodePipelineArtifactCodePipelineActionRole97F56214", + "EmbeddedLinuxCodePipelineOutputCodePipelineActionRole999D254E", "Arn", ], }, @@ -1858,31 +1668,21 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesSourceBucket1FA488F5Arn3CF62A69", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", }, - "/poky/arbitrary-file.ext", + "/custom/arbitrary-file.ext", ], ], }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": [ "s3:DeleteObject*", @@ -1896,14 +1696,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactBucketFF61EB98Arn7A6F2306", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestartF0FFB4BEArnE74A2E94", }, "/*", ], @@ -1911,18 +1711,6 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Encrypt", - "kms:ReEncrypt*", - "kms:GenerateDataKey*", - "kms:Decrypt", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, ], "Version": "2012-10-17", }, @@ -1967,14 +1755,14 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Resource": [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", }, { "Fn::Join": [ "", [ { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesOutputBucketA2144F25ArnBAEF4928", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377", }, "/*", ], @@ -1990,7 +1778,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Condition": { "StringEquals": { "ec2:ResourceTag/CreatedBy": [ - "MyTestStack", + "test-stack", ], }, }, @@ -2016,7 +1804,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` ], "Effect": "Allow", "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestkey784D0285Arn58FA9A21", }, }, ], @@ -2025,7 +1813,7 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "PolicyName": "vmImportPolicy", }, ], - "RoleName": "MyTestStack-vm-mport", + "RoleName": "test-stack-vm-mport", }, "Type": "AWS::IAM::Role", }, @@ -2062,6 +1850,84 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` }, "Type": "AWS::Events::Rule", }, + "EmbeddedLinuxCodePipelineteststackEmbeddedLinuxCodePipelineE603BC4FSourceEventRulecustom23834a673736e04b0b5d6b7ff0d2481039b6661f0b52b80c5ef1f4296a0f0fbezip38762D1B": { + "DependsOn": [ + "EmbeddedLinuxCodePipelineProjectPolicyDocument1FA633EB", + "EmbeddedLinuxCodePipelineProjectF55E3B36", + "EmbeddedLinuxCodePipelineProjectRoleDefaultPolicyC205FC16", + "EmbeddedLinuxCodePipelineProjectRoleFD913DB7", + ], + "Properties": { + "EventPattern": { + "detail": { + "eventName": [ + "CompleteMultipartUpload", + "CopyObject", + "PutObject", + ], + "requestParameters": { + "bucketName": [ + { + "Fn::ImportValue": "test-common:ExportsOutputReftestsrc6C860343FD6A5870", + }, + ], + "key": [ + "custom/arbitrary-file.ext", + ], + }, + "resources": { + "ARN": [ + { + "Fn::Join": [ + "", + [ + { + "Fn::ImportValue": "test-common:ExportsOutputFnGetAtttestsrc6C860343Arn869D5331", + }, + "/custom/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", + }, "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aFD4BFC8A": { "DependsOn": [ "LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8aServiceRoleDefaultPolicyADDA7DEB", diff --git a/test/__snapshots__/codepipeline-resources.test.ts.snap b/test/__snapshots__/codepipeline-resources.test.ts.snap index 78df388..c531c39 100644 --- a/test/__snapshots__/codepipeline-resources.test.ts.snap +++ b/test/__snapshots__/codepipeline-resources.test.ts.snap @@ -723,7 +723,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "PipelineResourcesVPCFlowLogGroupCCF3042F": { "DeletionPolicy": "Delete", "Properties": { - "LogGroupName": "MyTestStack-PipelineResourcesVPCFlowLogGroup", + "LogGroupName": "test-stack-PipelineResourcesVPCFlowLogGroup", "RetentionInDays": 365, }, "Type": "AWS::Logs::LogGroup", @@ -748,7 +748,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVPCFlowLogs", + "Value": "test-stack/PipelineResourcesVPCFlowLogs", }, ], "TrafficType": "ALL", @@ -772,7 +772,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVPCFlowLogs", + "Value": "test-stack/PipelineResourcesVPCFlowLogs", }, ], }, @@ -827,7 +827,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc", + "Value": "test-stack/PipelineResourcesVpc", }, ], }, @@ -838,7 +838,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc", + "Value": "test-stack/PipelineResourcesVpc", }, ], }, @@ -861,7 +861,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet1", + "Value": "test-stack/PipelineResourcesVpc/PrivateSubnet1", }, ], "VpcId": { @@ -897,7 +897,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet1", + "Value": "test-stack/PipelineResourcesVpc/PrivateSubnet1", }, ], "VpcId": { @@ -934,7 +934,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet2", + "Value": "test-stack/PipelineResourcesVpc/PrivateSubnet2", }, ], "VpcId": { @@ -959,7 +959,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet2", + "Value": "test-stack/PipelineResourcesVpc/PrivateSubnet2", }, ], "VpcId": { @@ -985,7 +985,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet3", + "Value": "test-stack/PipelineResourcesVpc/PrivateSubnet3", }, ], "VpcId": { @@ -1021,7 +1021,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PrivateSubnet3", + "Value": "test-stack/PipelineResourcesVpc/PrivateSubnet3", }, ], "VpcId": { @@ -1051,7 +1051,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet1", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet1", }, ], }, @@ -1075,7 +1075,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet1", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet1", }, ], }, @@ -1086,7 +1086,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet1", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet1", }, ], "VpcId": { @@ -1122,7 +1122,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet1", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet1", }, ], "VpcId": { @@ -1152,7 +1152,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet2", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet2", }, ], }, @@ -1176,7 +1176,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet2", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet2", }, ], }, @@ -1187,7 +1187,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet2", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet2", }, ], "VpcId": { @@ -1223,7 +1223,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet2", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet2", }, ], "VpcId": { @@ -1253,7 +1253,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet3", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet3", }, ], }, @@ -1277,7 +1277,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet3", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet3", }, ], }, @@ -1299,7 +1299,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` "Tags": [ { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet3", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet3", }, ], "VpcId": { @@ -1324,7 +1324,7 @@ exports[`PipelineResourcesStack Snapshot 1`] = ` }, { "Key": "Name", - "Value": "MyTestStack/PipelineResourcesVpc/PublicSubnet3", + "Value": "test-stack/PipelineResourcesVpc/PublicSubnet3", }, ], "VpcId": { diff --git a/test/buildspec/build.buildspec.yml b/test/buildspec/build.buildspec.yml new file mode 100644 index 0000000..25ef8e1 --- /dev/null +++ b/test/buildspec/build.buildspec.yml @@ -0,0 +1,29 @@ +version: 0.2 +run-as: yoctouser + +env: + shell: bash + # HOME is set to /root even when running as a non-root user. + variables: + HOME: "/home/yoctouser" + +phases: + pre_build: + run-as: root + commands: + - echo "Pre build started - [$(date '+%F %H:%M:%S')]" + - echo "Pre build completed - [$(date '+%F %H:%M:%S')]" + build: + commands: + - echo "Build started - [$(date '+%F %H:%M:%S')]" + - echo "Build completed - [$(date '+%F %H:%M:%S')]" + post_build: + commands: + - echo "Post build statred - [$(date '+%F %H:%M:%S')]" + - echo "" > /tmp/out.log + - echo "Post build completed - [$(date '+%F %H:%M:%S')]" + +artifacts: + discard-paths: true + files: + - /tmp/out.log diff --git a/test/codebuild-embedded-linux-nag.test.ts b/test/codebuild-embedded-linux-nag.test.ts new file mode 100644 index 0000000..9966a2c --- /dev/null +++ b/test/codebuild-embedded-linux-nag.test.ts @@ -0,0 +1,162 @@ +import { describe, expect, test, beforeAll } from "@jest/globals"; +import { AwsSolutionsChecks, NagSuppressions } from "cdk-nag"; +import { Annotations, Match } from "aws-cdk-lib/assertions"; + +import * as cdk from "aws-cdk-lib"; +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 { + EmbeddedLinuxCodeBuildProjectProps, + EmbeddedLinuxCodeBuildProjectStack, +} from "../lib"; +import { DEFAULT_ENV } from "./util"; + +const base_path = `EmbeddedLinuxCodeBuild`; + +function addNagSuppressions( + _stack: EmbeddedLinuxCodeBuildProjectStack, + _props: EmbeddedLinuxCodeBuildProjectProps, +) { + 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}/${base_path}ProjectSecurityGroup/Resource`, + [ + { + id: "AwsSolutions-EC23", + reason: "CidrBlock parameter referencing an intrinsic function", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + _stack, + `/${_stack.stackName}/${base_path}Project/Resource`, + [ + { + id: "AwsSolutions-CB5", + reason: "PipelineImage parameter referencing an intrinsic function", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + _stack, + `/${_stack.stackName}/${base_path}Project/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}/LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8a/ServiceRole/DefaultPolicy/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + _stack, + `/${_stack.stackName}/${base_path}ProjectOSImageCheckOnStart/Resource`, + [ + { + id: "AwsSolutions-L1", + reason: "There is no latest PYTHON version to set.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + _stack, + `/${_stack.stackName}/${base_path}Project/PolicyDocument/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); +} + +describe("EmbeddedLinuxCodeBuildProjectStack cdk-nag AwsSolutions Pack", () => { + const resource_prefix = "test"; + + let app: cdk.App; + let stack: EmbeddedLinuxCodeBuildProjectStack; + let props: EmbeddedLinuxCodeBuildProjectProps; + let common: cdk.Stack; + + beforeAll(() => { + // GIVEN + app = new cdk.App(); + + common = new cdk.Stack(app, `${resource_prefix}-common`, { + env: DEFAULT_ENV, + }); + + // Create required resources for testing + const vpc = new ec2.Vpc(common, `${resource_prefix}-vpc`, { + maxAzs: 2, + }); + const ecrRepository = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); + + // Create the pipeline stack & props + props = { + env: DEFAULT_ENV, + ecrRepository: ecrRepository, + encryptionKey: encryptionKey, + ecrRepositoryImageTag: "PipelineImage", + vpc: vpc, + }; + + stack = new EmbeddedLinuxCodeBuildProjectStack( + app, + `${resource_prefix}-stack`, + props, + ); + + addNagSuppressions(stack, 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/codebuild-embedded-linux.test.ts b/test/codebuild-embedded-linux.test.ts new file mode 100644 index 0000000..3ab1508 --- /dev/null +++ b/test/codebuild-embedded-linux.test.ts @@ -0,0 +1,413 @@ +import { beforeEach, describe, expect, test } from "@jest/globals"; +import { Match, Template } from "aws-cdk-lib/assertions"; + +import * as cdk from "aws-cdk-lib"; +import * as ecr from "aws-cdk-lib/aws-ecr"; +import * as ec2 from "aws-cdk-lib/aws-ec2"; +import * as kms from "aws-cdk-lib/aws-kms"; +import * as iam from "aws-cdk-lib/aws-iam"; +import { + EmbeddedLinuxCodeBuildProjectStack, + EmbeddedLinuxCodeBuildProjectProps, +} from "../lib"; +import { DEFAULT_ENV, normalizedTemplateFromStack } from "./util"; + +describe("EmbeddedLinuxCodeBuildProjectStack", () => { + const resource_prefix = "test"; + + let app: cdk.App; + let stack: EmbeddedLinuxCodeBuildProjectStack; + let props: EmbeddedLinuxCodeBuildProjectProps; + let template: Template; + let common: cdk.Stack; + + beforeEach(() => { + app = new cdk.App(); + + common = new cdk.Stack(app, `${resource_prefix}-common`, { + env: DEFAULT_ENV, + }); + + // Create required props + const vpc = new ec2.Vpc(common, `${resource_prefix}-vpc`, { + maxAzs: 2, + }); + const ecrRepository = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); + + // Create the pipeline stack & props + props = { + env: DEFAULT_ENV, + ecrRepository: ecrRepository, + ecrRepositoryImageTag: "latest", + vpc: vpc, + encryptionKey: encryptionKey, + }; + + stack = new EmbeddedLinuxCodeBuildProjectStack( + app, + `${resource_prefix}-stack`, + props, + ); + + template = Template.fromStack(stack); + }); + + test("Creates EFS filesystem with security group", () => { + template.hasResourceProperties("AWS::EFS::FileSystem", { + FileSystemTags: [ + { + Key: "Name", + Value: `${stack.stackName}/EmbeddedLinuxCodeBuildProjectFilesystem`, + }, + ], + Encrypted: true, + }); + + template.hasResourceProperties("AWS::EC2::SecurityGroup", { + SecurityGroupIngress: Match.arrayWith([ + Match.objectLike({ + CidrIp: { + "Fn::ImportValue": Match.stringLikeRegexp( + `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replace("-", "")}*`, + ), + }, + FromPort: 2049, + IpProtocol: "tcp", + ToPort: 2049, + }), + ]), + }); + }); + + test("creates CodeBuild project", () => { + template.hasResourceProperties("AWS::CodeBuild::Project", { + Environment: { + ComputeType: "BUILD_GENERAL1_XLARGE", + Image: { + "Fn::Join": [ + "", + [ + { + "Fn::Select": [ + 4, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": Match.stringLikeRegexp( + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace("-", "")}`, + ), + }, + ], + }, + ], + }, + ".dkr.ecr.", + { + "Fn::Select": [ + 3, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": Match.stringLikeRegexp( + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace("-", "")}`, + ), + }, + ], + }, + ], + }, + ".", + { + Ref: "AWS::URLSuffix", + }, + "/", + { + "Fn::ImportValue": Match.stringLikeRegexp( + `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replace("-", "")}`, + ), + }, + ":latest", + ], + ], + }, + PrivilegedMode: true, + Type: "LINUX_CONTAINER", + }, + TimeoutInMinutes: 240, + }); + }); + + test("creates Lambda function for pipeline check", () => { + template.hasResourceProperties("AWS::Lambda::Function", { + Handler: "index.handler", + Runtime: "python3.10", + }); + }); + + test("creates EventBridge rule", () => { + template.hasResourceProperties("AWS::Events::Rule", { + EventPattern: { + "detail-type": ["CodePipeline Pipeline Execution State Change"], + source: ["aws.codepipeline"], + detail: { + state: ["STARTED"], + "execution-trigger": { + "trigger-type": ["CreatePipeline"], + }, + }, + }, + }); + }); + + test("adds required policies to CodeBuild role", () => { + template.hasResourceProperties("AWS::IAM::Policy", { + PolicyDocument: { + Statement: Match.arrayWith([ + Match.objectLike({ + Action: [ + "ec2:DescribeSecurityGroups", + "codestar-connections:GetConnection", + "codestar-connections:GetConnectionToken", + "codeconnections:GetConnectionToken", + "codeconnections:GetConnection", + "codeconnections:ListConnection", + "codeconnections:UseConnection", + "codebuild:ListConnectedOAuthAccounts", + "codebuild:ListRepositories", + "codebuild:PersistOAuthToken", + "codebuild:ImportSourceCredentials", + ], + Effect: "Allow", + Resource: "*", + }), + ]), + }, + }); + }); + + test("creates CloudWatch log group", () => { + template.hasResourceProperties("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(); + }); +}); + +describe("EmbeddedLinuxCodeBuildProjectStack Custom", () => { + const resource_prefix = "test"; + + let app: cdk.App; + let stack: EmbeddedLinuxCodeBuildProjectStack; + let props: EmbeddedLinuxCodeBuildProjectProps; + let template: Template; + let common: cdk.Stack; + + beforeEach(() => { + app = new cdk.App(); + + common = new cdk.Stack(app, `${resource_prefix}-common`, { + env: DEFAULT_ENV, + }); + + // Create required props + const vpc = new ec2.Vpc(common, `${resource_prefix}-vpc`, { + maxAzs: 2, + }); + const ecrRepository = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); + const customPolicy = new iam.PolicyStatement({ + actions: ["s3:GetObject"], + resources: ["*"], + }); + + // Create the pipeline stack & props + props = { + env: DEFAULT_ENV, + ecrRepository: ecrRepository, + ecrRepositoryImageTag: "latest", + vpc: vpc, + encryptionKey: encryptionKey, + buildPolicyAdditions: [customPolicy], + }; + + stack = new EmbeddedLinuxCodeBuildProjectStack( + app, + `${resource_prefix}-stack`, + props, + ); + + template = Template.fromStack(stack); + }); + + test("Creates EFS filesystem with security group", () => { + template.hasResourceProperties("AWS::EFS::FileSystem", { + FileSystemTags: [ + { + Key: "Name", + Value: `${stack.stackName}/EmbeddedLinuxCodeBuildProjectFilesystem`, + }, + ], + Encrypted: true, + }); + + template.hasResourceProperties("AWS::EC2::SecurityGroup", { + SecurityGroupIngress: Match.arrayWith([ + Match.objectLike({ + CidrIp: { + "Fn::ImportValue": Match.stringLikeRegexp( + `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replace("-", "")}*`, + ), + }, + FromPort: 2049, + IpProtocol: "tcp", + ToPort: 2049, + }), + ]), + }); + }); + + test("creates CodeBuild project", () => { + template.hasResourceProperties("AWS::CodeBuild::Project", { + Environment: { + ComputeType: "BUILD_GENERAL1_XLARGE", + Image: { + "Fn::Join": [ + "", + [ + { + "Fn::Select": [ + 4, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": Match.stringLikeRegexp( + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace("-", "")}`, + ), + }, + ], + }, + ], + }, + ".dkr.ecr.", + { + "Fn::Select": [ + 3, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": Match.stringLikeRegexp( + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace("-", "")}`, + ), + }, + ], + }, + ], + }, + ".", + { + Ref: "AWS::URLSuffix", + }, + "/", + { + "Fn::ImportValue": Match.stringLikeRegexp( + `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replace("-", "")}`, + ), + }, + ":latest", + ], + ], + }, + PrivilegedMode: true, + Type: "LINUX_CONTAINER", + }, + TimeoutInMinutes: 240, + }); + }); + + test("creates Lambda function for pipeline check", () => { + template.hasResourceProperties("AWS::Lambda::Function", { + Handler: "index.handler", + Runtime: "python3.10", + }); + }); + + test("creates EventBridge rule", () => { + template.hasResourceProperties("AWS::Events::Rule", { + EventPattern: { + "detail-type": ["CodePipeline Pipeline Execution State Change"], + source: ["aws.codepipeline"], + detail: { + state: ["STARTED"], + "execution-trigger": { + "trigger-type": ["CreatePipeline"], + }, + }, + }, + }); + }); + + test("adds required policies to CodeBuild role", () => { + template.hasResourceProperties("AWS::IAM::Policy", { + PolicyDocument: { + Statement: Match.arrayWith([ + Match.objectLike({ + Action: [ + "ec2:DescribeSecurityGroups", + "codestar-connections:GetConnection", + "codestar-connections:GetConnectionToken", + "codeconnections:GetConnectionToken", + "codeconnections:GetConnection", + "codeconnections:ListConnection", + "codeconnections:UseConnection", + "codebuild:ListConnectedOAuthAccounts", + "codebuild:ListRepositories", + "codebuild:PersistOAuthToken", + "codebuild:ImportSourceCredentials", + ], + Effect: "Allow", + Resource: "*", + }), + ]), + }, + }); + }); + + test("creates CloudWatch log group", () => { + template.hasResourceProperties("AWS::Logs::LogGroup", { + RetentionInDays: 365, + }); + }); + + test("adds custom policy statements when provided", () => { + template.hasResourceProperties("AWS::IAM::Policy", { + PolicyName: Match.stringLikeRegexp( + `EmbeddedLinuxCodeBuildProjectRoleDefaultPolicy*`, + ), + PolicyDocument: { + Statement: Match.arrayWith([ + Match.objectLike({ + Action: "s3:GetObject", + Effect: "Allow", + Resource: "*", + }), + ]), + }, + }); + }); + + 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-base-image-nag.test.ts b/test/codepipeline-embedded-linux-base-image-nag.test.ts index a2b2e66..7181ccb 100644 --- a/test/codepipeline-embedded-linux-base-image-nag.test.ts +++ b/test/codepipeline-embedded-linux-base-image-nag.test.ts @@ -1,19 +1,26 @@ -import * as cdk from "aws-cdk-lib"; -import { Annotations, Match } from "aws-cdk-lib/assertions"; +import { describe, expect, test, beforeAll } from "@jest/globals"; import { AwsSolutionsChecks, NagSuppressions } from "cdk-nag"; +import { Annotations, Match } from "aws-cdk-lib/assertions"; + +import * as cdk from "aws-cdk-lib"; 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"; +} from "../lib"; import { DEFAULT_ENV } from "./util"; -function addNagSuppressions(stack: cdk.Stack) { +const base_path = `CodePipelineBuildBaseImage`; + +function addNagSuppressions( + _stack: EmbeddedLinuxCodePipelineBaseImageStack, + _props: EmbeddedLinuxCodePipelineBaseImageProps, +) { NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Resource`, + _stack, + `/${_stack.stackName}/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Resource`, [ { id: "AwsSolutions-L1", @@ -22,19 +29,18 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/CodePipelineBuildBaseImageBucketDeploymentRole/Resource`, + _stack, + `/${_stack.stackName}/${base_path}BucketDeploymentRole/Resource`, [ { id: "AwsSolutions-IAM5", - reason: - "Because CodePipelineBuildBaseImageBucketDeploymentRole/Resource is needed here.", + reason: `Because ${base_path}BucketDeploymentRole/Resource is needed here.`, }, ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/CodePipelineBuildBaseImageBucketDeploymentRole/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}BucketDeploymentRole/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -44,8 +50,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/CodePipelineBuildBaseImageProject/Role/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}Project/Role/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -55,8 +61,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/CodePipelineBuildBaseImageCodePipeline/Role/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}CodePipeline/Role/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -66,8 +72,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/CodePipelineBuildBaseImageCodePipeline/Source/Source/CodePipelineActionRole/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}CodePipeline/Source/Source/CodePipelineActionRole/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -79,46 +85,49 @@ function addNagSuppressions(stack: cdk.Stack) { } describe("EmbeddedLinuxCodePipelineBaseImageStack cdk-nag AwsSolutions Pack", () => { - const app: cdk.App = new cdk.App(); - let stack: cdk.Stack; + const resource_prefix = "test"; + + let app: cdk.App; + let stack: EmbeddedLinuxCodePipelineBaseImageStack; + let props: EmbeddedLinuxCodePipelineBaseImageProps; + let common: cdk.Stack; beforeAll(() => { // GIVEN - const baseStack = new cdk.Stack(app, "BaseStack", { env: DEFAULT_ENV }); + app = new cdk.App(); - const encryptionKey = new kms.Key(baseStack, "EncryptionKey", { - removalPolicy: cdk.RemovalPolicy.DESTROY, - enableKeyRotation: true, + common = new cdk.Stack(app, `${resource_prefix}-common`, { + env: DEFAULT_ENV, }); + + // Create required resources for testing const pipelineSourceBucket = new s3.Bucket( - baseStack, - "PipelineSourceBucket", - { - versioned: true, - }, + common, + `${resource_prefix}-src`, + { versioned: true }, ); const pipelineArtifactBucket = new s3.Bucket( - baseStack, - "PipelineArtifactBucket", + common, + `${resource_prefix}-art`, {}, ); - const ecrRepository = new ecr.Repository(baseStack, "EcrRepository", {}); + const ecrRepository = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); - const props: EmbeddedLinuxCodePipelineBaseImageProps = { + props = { env: DEFAULT_ENV, pipelineSourceBucket: pipelineSourceBucket, pipelineArtifactBucket: pipelineArtifactBucket, ecrRepository: ecrRepository, encryptionKey: encryptionKey, }; - stack = new EmbeddedLinuxCodePipelineBaseImageStack( app, - "MyTestStack", + `${resource_prefix}-stack`, props, ); - addNagSuppressions(stack); + addNagSuppressions(stack, props); // WHEN cdk.Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); diff --git a/test/codepipeline-embedded-linux-base-image.test.ts b/test/codepipeline-embedded-linux-base-image.test.ts index 9679efa..93da6fb 100644 --- a/test/codepipeline-embedded-linux-base-image.test.ts +++ b/test/codepipeline-embedded-linux-base-image.test.ts @@ -1,62 +1,159 @@ +import { beforeEach, describe, expect, test } from "@jest/globals"; +import { Match, Template } from "aws-cdk-lib/assertions"; + import * as cdk from "aws-cdk-lib"; -import * as assertions from "aws-cdk-lib/assertions"; -import { PipelineResourcesProps, PipelineResourcesStack } from "../lib"; +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 { 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 resource_prefix = "test"; - const pipelineResourcesProps: PipelineResourcesProps = { - resource_prefix: "test", - env: DEFAULT_ENV, - }; + let app: cdk.App; + let stack: EmbeddedLinuxCodePipelineBaseImageStack; + let props: EmbeddedLinuxCodePipelineBaseImageProps; + let template: Template; + let common: cdk.Stack; - beforeAll(() => { - // GIVEN + beforeEach(() => { 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, - }; + common = new cdk.Stack(app, `${resource_prefix}-common`, { + env: DEFAULT_ENV, + }); + + // Create required resources for testing + const sourceBucket = new s3.Bucket(common, `${resource_prefix}-src`); + const artifactBucket = new s3.Bucket(common, `${resource_prefix}-art`); + const ecrRepo = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); + + // Create the pipeline stack & props + props = { + env: DEFAULT_ENV, + pipelineSourceBucket: sourceBucket, + pipelineArtifactBucket: artifactBucket, + ecrRepository: ecrRepo, + encryptionKey: encryptionKey, + }; stack = new EmbeddedLinuxCodePipelineBaseImageStack( app, - "MyTestStack", - embeddedLinuxCodePipelineBaseImageProps, + `${resource_prefix}-stack`, + props, ); - template = assertions.Template.fromStack(stack); + + // Create template from stack + template = Template.fromStack(stack); + }); + + test("Pipeline is created with correct stages", () => { + template.hasResourceProperties("AWS::CodePipeline::Pipeline", { + Stages: [ + { + Name: "Source", + Actions: [ + { + Name: "Source", + ActionTypeId: { + Category: "Source", + Owner: "AWS", + Provider: "S3", + Version: "1", + }, + }, + ], + }, + { + Name: "Build", + Actions: [ + { + Name: "Build", + ActionTypeId: { + Category: "Build", + Owner: "AWS", + Provider: "CodeBuild", + Version: "1", + }, + }, + ], + }, + ], + }); + }); + + test("CodeBuild project is created with correct configuration", () => { + template.hasResourceProperties("AWS::CodeBuild::Project", { + Environment: { + ComputeType: "BUILD_GENERAL1_MEDIUM", + Image: "aws/codebuild/standard:7.0", + PrivilegedMode: true, + Type: "LINUX_CONTAINER", + }, + }); + }); + + test("EventBridge rule is created for weekly pipeline execution", () => { + template.hasResourceProperties("AWS::Events::Rule", { + ScheduleExpression: "cron(0 6 ? * Monday *)", + State: "ENABLED", + Targets: [ + { + Arn: { + "Fn::Join": [ + "", + [ + "arn:", + { + Ref: "AWS::Partition", + }, + `:codepipeline:${props.env?.region}:${props.env?.account}:`, + { + Ref: Match.stringLikeRegexp( + "CodePipelineBuildBaseImageCodePipeline*", + ), + }, + ], + ], + }, + }, + ], + }); }); - 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", { + test("CloudWatch log group is created with correct retention", () => { + template.hasResourceProperties("AWS::Logs::LogGroup", { RetentionInDays: 365, }); }); + test("Required outputs are created", () => { + template.hasOutput("ECRRepositoryName", {}); + template.hasOutput("ECRBaseImageTag", {}); + template.hasOutput("ECRBaseImageCheckCommand", {}); + template.hasOutput("SourceURI", {}); + }); + + test("IAM role for bucket deployment has correct permissions", () => { + template.hasResourceProperties("AWS::IAM::Role", { + AssumeRolePolicyDocument: { + Statement: [ + { + Action: "sts:AssumeRole", + Effect: "Allow", + Principal: { + Service: "lambda.amazonaws.com", + }, + }, + ], + }, + }); + }); + test("Snapshot", () => { /* We must change some randomly generated file names used in the S3 asset construct. */ const templateWithConstKeys = normalizedTemplateFromStack(stack); diff --git a/test/codepipeline-embedded-linux-nag.test.ts b/test/codepipeline-embedded-linux-nag.test.ts index 065e74c..4c22fee 100644 --- a/test/codepipeline-embedded-linux-nag.test.ts +++ b/test/codepipeline-embedded-linux-nag.test.ts @@ -1,17 +1,26 @@ +import { describe, expect, test, beforeAll } from "@jest/globals"; +import { AwsSolutionsChecks, NagSuppressions } from "cdk-nag"; +import { Annotations, Match } from "aws-cdk-lib/assertions"; + 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 { + ProjectType, + EmbeddedLinuxCodePipelineStack, + EmbeddedLinuxCodePipelineProps, +} from "../lib"; import { DEFAULT_ENV } from "./util"; -function addNagSuppressions(stack: cdk.Stack) { - NagSuppressions.addStackSuppressions(stack, [ +const base_path = `EmbeddedLinuxCodePipeline`; + +function addNagSuppressions( + _stack: EmbeddedLinuxCodePipelineStack, + _props: EmbeddedLinuxCodePipelineProps, +) { + NagSuppressions.addStackSuppressions(_stack, [ { id: "CdkNagValidationFailure", reason: "Multiple Validation Failures." }, { id: "AwsSolutions-CB3", @@ -23,19 +32,19 @@ function addNagSuppressions(stack: cdk.Stack) { }, ]); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipelineBucketDeploymentRole/Resource`, + _stack, + `/${_stack.stackName}/${base_path}BucketDeploymentRole/Resource`, [ { id: "AwsSolutions-IAM5", reason: - "/aws/lambda/EmbeddedLinuxCodePipeline-CustomCDKBucketDeployment* is needed here.", + "/aws/lambda/${base_path}-CustomCDKBucketDeployment* is needed here.", }, ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Resource`, + _stack, + `/${_stack.stackName}/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Resource`, [ { id: "AwsSolutions-L1", @@ -44,8 +53,19 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipelineProject/PolicyDocument/Resource`, + _stack, + `/${_stack.stackName}/${base_path}Project/PolicyDocument/Resource`, + [ + { + id: "AwsSolutions-IAM5", + reason: + "Because these are the default permissions assigned to a CDK default created role.", + }, + ], + ); + NagSuppressions.addResourceSuppressionsByPath( + _stack, + `/${_stack.stackName}/${base_path}Project/Role/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -55,8 +75,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipelineProject/Role/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}BucketDeploymentRole/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -66,8 +86,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipelineBucketDeploymentRole/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}/Role/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -77,8 +97,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipeline/Role/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}/Source/Source/CodePipelineActionRole/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -88,8 +108,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipeline/Artifact/Artifact/CodePipelineActionRole/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}/Build/Build/CodePipelineActionRole/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -99,8 +119,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipeline/Source/Source/CodePipelineActionRole/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/${base_path}/Output/Output/CodePipelineActionRole/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -110,8 +130,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8a/ServiceRole/DefaultPolicy/Resource`, + _stack, + `/${_stack.stackName}/LogRetentionaae0aa3c5b4d4f87b02d85b201efdd8a/ServiceRole/DefaultPolicy/Resource`, [ { id: "AwsSolutions-IAM5", @@ -121,8 +141,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipelineOSImageCheckOnStart/Resource`, + _stack, + `/${_stack.stackName}/${base_path}OSImageCheckOnStart/Resource`, [ { id: "AwsSolutions-L1", @@ -131,8 +151,8 @@ function addNagSuppressions(stack: cdk.Stack) { ], ); NagSuppressions.addResourceSuppressionsByPath( - stack, - `/${stack.stackName}/EmbeddedLinuxCodePipelineVMImportRole/Resource`, + _stack, + `/${_stack.stackName}/${base_path}VMImportRole/Resource`, [ { id: "AwsSolutions-IAM5", @@ -142,10 +162,13 @@ function addNagSuppressions(stack: cdk.Stack) { regex: `/Resource::arn:aws:ec2:${DEFAULT_ENV.region}::snapshot/\\*$/g`, }, { - regex: `/Resource::/\\*$/g`, + regex: `/Resource::<${_props.pipelineOutputBucket.node.id.replace("-", "")}A5072518.Arn>/\\*$/g`, }, { - regex: `/Resource::BaseStack:ExportsOutputFnGetAttOutputBucket7114EB27Arn67D5716D/\\*$/g`, + regex: `/Resource::${_stack.stackName}:ExportsOutputFnGetAtt${_props.pipelineOutputBucket.node.id.replace("-", "").toLowerCase()}A5072518ArnD3542377/\\*$/g`, + }, + { + regex: `/Resource::test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377/\\*$/g`, }, { regex: `/Resource::\\*$/g`, @@ -157,37 +180,46 @@ function addNagSuppressions(stack: cdk.Stack) { } describe("EmbeddedLinuxCodePipelineStack cdk-nag AwsSolutions Pack", () => { - const app: cdk.App = new cdk.App(); - let stack: cdk.Stack; + const resource_prefix = "test"; + + let app: cdk.App; + let stack: EmbeddedLinuxCodePipelineStack; + let props: EmbeddedLinuxCodePipelineProps; + let common: cdk.Stack; beforeAll(() => { // GIVEN - const baseStack = new cdk.Stack(app, "BaseStack", { env: DEFAULT_ENV }); + app = new cdk.App(); - // GIVEN - const encryptionKey = new kms.Key(baseStack, "EncryptionKey", { - removalPolicy: cdk.RemovalPolicy.DESTROY, - enableKeyRotation: true, + common = new cdk.Stack(app, `${resource_prefix}-common`, { + env: DEFAULT_ENV, }); + + // GIVEN + + // Create required resources for testing const pipelineSourceBucket = new s3.Bucket( - baseStack, - "pipelineSourceBucket", - { - versioned: true, - }, + common, + `${resource_prefix}-src`, + { versioned: true }, ); const pipelineArtifactBucket = new s3.Bucket( - baseStack, - "ArtifactBucket", + common, + `${resource_prefix}-art`, {}, ); - const pipelineOutputBucket = new s3.Bucket(baseStack, "OutputBucket", { - encryptionKey: encryptionKey, + const pipelineOutputBucket = new s3.Bucket( + common, + `${resource_prefix}-out`, + {}, + ); + const ecrRepository = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); + const vpc = new ec2.Vpc(common, `${resource_prefix}-vpc`, { + maxAzs: 2, }); - const ecrRepository = new ecr.Repository(baseStack, "EcrRepository", {}); - const vpc = new ec2.Vpc(baseStack, "Vpc", {}); - stack = new EmbeddedLinuxCodePipelineStack(app, "MyTestStack", { + props = { env: DEFAULT_ENV, pipelineSourceBucket: pipelineSourceBucket, pipelineArtifactBucket: pipelineArtifactBucket, @@ -198,9 +230,14 @@ describe("EmbeddedLinuxCodePipelineStack cdk-nag AwsSolutions Pack", () => { vpc: vpc, pipelineArtifactPrefix: `${ProjectType.PokyAmi}`, encryptionKey: encryptionKey, - }); + }; + stack = new EmbeddedLinuxCodePipelineStack( + app, + `${resource_prefix}-stack`, + props, + ); - addNagSuppressions(stack); + addNagSuppressions(stack, props); // WHEN cdk.Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); diff --git a/test/codepipeline-embedded-linux.test.ts b/test/codepipeline-embedded-linux.test.ts index 0497075..494ffb9 100644 --- a/test/codepipeline-embedded-linux.test.ts +++ b/test/codepipeline-embedded-linux.test.ts @@ -1,84 +1,70 @@ +import * as path from "path"; + +import { beforeEach, describe, expect, test } from "@jest/globals"; +import { Match, Template } from "aws-cdk-lib/assertions"; + 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 * 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 kms from "aws-cdk-lib/aws-kms"; import { EmbeddedLinuxCodePipelineProps, EmbeddedLinuxCodePipelineStack, + ProjectType, } from "../lib"; import { DEFAULT_ENV, normalizedTemplateFromStack } from "./util"; -// TODO -// - add test with PipelineResourcesProps values for various buckets -// - add test for other outouts - describe("EmbeddedLinuxCodePipelineStack", () => { + const resource_prefix = "test"; + 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 + let stack: EmbeddedLinuxCodePipelineStack; + let props: EmbeddedLinuxCodePipelineProps; + let template: Template; + let common: cdk.Stack; + + beforeEach(() => { 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 = { + common = new cdk.Stack(app, `${resource_prefix}-common`, { 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, - }; + }); + + // Create required resources for testing + const vpc = new ec2.Vpc(common, `${resource_prefix}-vpc`, { + maxAzs: 2, + }); + const sourceBucket = new s3.Bucket(common, `${resource_prefix}-src`); + const artifactBucket = new s3.Bucket(common, `${resource_prefix}-art`); + const outputBucket = new s3.Bucket(common, `${resource_prefix}-out`); + const ecrRepository = new ecr.Repository(common, `${resource_prefix}-ecr`); + const encryptionKey = new kms.Key(common, `${resource_prefix}-key`); + // Create the pipeline stack & props + props = { + env: DEFAULT_ENV, + pipelineSourceBucket: sourceBucket, + pipelineArtifactBucket: artifactBucket, + pipelineOutputBucket: outputBucket, + ecrRepository: ecrRepository, + ecrRepositoryImageTag: "latest", + projectType: ProjectType.Custom, + vpc: vpc, + encryptionKey: encryptionKey, + sourceCustomPath: path.join(__dirname, "buildspec"), + }; stack = new EmbeddedLinuxCodePipelineStack( app, - "MyTestStack", - embeddedLinuxCodePipelineProps, + `${resource_prefix}-stack`, + props, ); - template = assertions.Template.fromStack(stack); + + // Create template from stack + template = Template.fromStack(stack); }); - test("Has Resources", () => { + test("Has Correct Resources Count", () => { template.resourceCountIs("AWS::CodePipeline::Pipeline", 1); template.resourceCountIs("AWS::CodeBuild::Project", 1); // AWS::Events::Rule: @@ -87,6 +73,217 @@ describe("EmbeddedLinuxCodePipelineStack", () => { // - the weekly refresh template.resourceCountIs("AWS::Events::Rule", 3); template.resourceCountIs("AWS::Logs::LogGroup", 1); + }); + + test("Creates CodePipeline with correct stages", () => { + template.hasResourceProperties("AWS::CodePipeline::Pipeline", { + Stages: [ + { + Name: "Source", + Actions: [ + { + Name: "Source", + ActionTypeId: { + Category: "Source", + Owner: "AWS", + Provider: "S3", + Version: "1", + }, + }, + ], + }, + { + Name: "Build", + Actions: [ + { + Name: "Build", + ActionTypeId: { + Category: "Build", + Owner: "AWS", + Provider: "CodeBuild", + Version: "1", + }, + }, + ], + }, + { + Name: "Output", + Actions: [ + { + Name: "Output", + ActionTypeId: { + Category: "Deploy", + Owner: "AWS", + Provider: "S3", + Version: "1", + }, + }, + ], + }, + ], + }); + }); + + test("Creates CodeBuild project with correct configuration", () => { + template.hasResourceProperties("AWS::CodeBuild::Project", { + Environment: { + ComputeType: "BUILD_GENERAL1_XLARGE", + Image: { + "Fn::Join": [ + "", + [ + { + "Fn::Select": [ + 4, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": Match.stringLikeRegexp( + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace("-", "")}*`, + ), + }, + ], + }, + ], + }, + ".dkr.ecr.", + { + "Fn::Select": [ + 3, + { + "Fn::Split": [ + ":", + { + "Fn::ImportValue": Match.stringLikeRegexp( + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace("-", "")}*`, + ), + }, + ], + }, + ], + }, + ".", + { + Ref: "AWS::URLSuffix", + }, + "/", + { + "Fn::ImportValue": Match.stringLikeRegexp( + `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replace("-", "")}*`, + ), + }, + ":latest", + ], + ], + }, + PrivilegedMode: true, + Type: "LINUX_CONTAINER", + }, + }); + }); + + test("Creates EventBridge rule for weekly pipeline execution", () => { + template.hasResourceProperties("AWS::Events::Rule", { + ScheduleExpression: "cron(0 6 ? * Tuesday *)", + State: "ENABLED", + Targets: [ + { + Arn: { + "Fn::Join": [ + "", + [ + "arn:", + { + Ref: "AWS::Partition", + }, + `:codepipeline:${props.env?.region}:${props.env?.account}:`, + { + Ref: Match.stringLikeRegexp("EmbeddedLinuxCodePipeline*"), + }, + ], + ], + }, + Id: "Target0", + RoleArn: { + "Fn::GetAtt": [ + Match.stringLikeRegexp("EmbeddedLinuxCodePipelineEventsRole*"), + "Arn", + ], + }, + }, + ], + }); + }); + + test("Creates EFS filesystem with security group", () => { + template.hasResourceProperties("AWS::EFS::FileSystem", { + FileSystemTags: [ + { + Key: "Name", + Value: `${stack.stackName}/EmbeddedLinuxCodePipelineFileSystem`, + }, + ], + Encrypted: true, + }); + + template.hasResourceProperties("AWS::EC2::SecurityGroup", { + SecurityGroupIngress: Match.arrayWith([ + Match.objectLike({ + CidrIp: { + "Fn::ImportValue": Match.stringLikeRegexp( + `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replace("-", "")}*`, + ), + }, + FromPort: 2049, + IpProtocol: "tcp", + ToPort: 2049, + }), + ]), + }); + }); + + test("Creates required IAM roles and policies", () => { + // Test VM import role + template.hasResourceProperties("AWS::IAM::Role", { + RoleName: `${stack.stackName}-vm-mport`, + AssumeRolePolicyDocument: { + Statement: [ + { + Action: "sts:AssumeRole", + Effect: "Allow", + Principal: { + Service: "vmie.amazonaws.com", + }, + }, + ], + }, + }); + + // Test CodeBuild service role policies + template.hasResourceProperties("AWS::IAM::Policy", { + PolicyDocument: { + Statement: Match.arrayWith([ + Match.objectLike({ + Action: [ + "ec2:CreateImage", + "ec2:CreateTags", + "ec2:DescribeImages", + "ec2:DescribeSnapshots", + "ec2:DescribeImportSnapshotTasks", + "ec2:DescribeTags", + "ec2:CancelImportTask", + ], + Effect: "Allow", + Resource: "*", + }), + ]), + }, + }); + }); + + test("Logs Have Minimum Retention Period", () => { + template.resourceCountIs("AWS::Logs::LogGroup", 1); template.allResourcesProperties("AWS::Logs::LogGroup", { RetentionInDays: 365, }); diff --git a/test/codepipeline-resources-nag.test.ts b/test/codepipeline-resources-nag.test.ts index 310bee9..15cee0b 100644 --- a/test/codepipeline-resources-nag.test.ts +++ b/test/codepipeline-resources-nag.test.ts @@ -1,22 +1,28 @@ -import * as cdk from "aws-cdk-lib"; - -import { Annotations, Match } from "aws-cdk-lib/assertions"; +import { describe, expect, test, beforeAll } from "@jest/globals"; import { AwsSolutionsChecks } from "cdk-nag"; +import { Annotations, Match } from "aws-cdk-lib/assertions"; + +import * as cdk from "aws-cdk-lib"; +import { PipelineResourcesProps, PipelineResourcesStack } from "../lib"; 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; + const resource_prefix = "test"; + + let app: cdk.App; + let stack: PipelineResourcesStack; + let props: PipelineResourcesProps; beforeAll(() => { // GIVEN - const props = { + app = new cdk.App(); + + props = { env: DEFAULT_ENV, resource_prefix: `${DEFAULT_ENV.account}-${DEFAULT_ENV.region}`, }; - stack = new PipelineResourcesStack(app, "MyTestStack", props); + stack = new PipelineResourcesStack(app, `${resource_prefix}-stack`, props); // WHEN cdk.Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true })); diff --git a/test/codepipeline-resources.test.ts b/test/codepipeline-resources.test.ts index 391e12c..954542a 100644 --- a/test/codepipeline-resources.test.ts +++ b/test/codepipeline-resources.test.ts @@ -1,56 +1,146 @@ +import { beforeEach, describe, expect, it, test } from "@jest/globals"; +import { Match, Template } from "aws-cdk-lib/assertions"; + 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 +Object.prototype.toString = function () { + return JSON.stringify(this); +}; describe("PipelineResourcesStack", () => { - let stack: cdk.Stack, app: cdk.App, template: assertions.Template; - const props: PipelineResourcesProps = { - resource_prefix: "test", - env: DEFAULT_ENV, - }; - beforeAll(() => { - // GIVEN + const resource_prefix = "test"; + + let app: cdk.App; + let stack: PipelineResourcesStack; + let props: PipelineResourcesProps; + let template: Template; + + beforeEach(() => { app = new cdk.App(); - stack = new PipelineResourcesStack(app, "MyTestStack", props); - template = assertions.Template.fromStack(stack); + + props = { + resource_prefix: resource_prefix, + env: DEFAULT_ENV, + }; + + stack = new PipelineResourcesStack(app, `${resource_prefix}-stack`, props); + template = Template.fromStack(stack); + }); + + test("creates VPC with correct CIDR", () => { + template.hasResourceProperties("AWS::EC2::VPC", { + CidrBlock: "10.0.0.0/16", + }); + }); + + test("creates ECR repository", () => { + template.hasResourceProperties("AWS::ECR::Repository", { + RepositoryName: `${resource_prefix}-${DEFAULT_ENV.account}-${DEFAULT_ENV.region}-repo`, + }); + }); + + test("creates KMS key with rotation enabled", () => { + template.hasResourceProperties("AWS::KMS::Key", { + EnableKeyRotation: true, + }); }); 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", () => { + it.each(bucketSuffixes)( + `Has S3 Bucket with versioning enabled`, + (bucketSuffix) => { + const bucketName = `${resource_prefix}-${DEFAULT_ENV.account}-${DEFAULT_ENV.region}-${bucketSuffix}`; + template.hasResourceProperties("AWS::S3::Bucket", { + BucketName: bucketName, + VersioningConfiguration: { + Status: "Enabled", + }, + }); + }, + ); + + test("creates VPC flow logs", () => { + template.hasResourceProperties("AWS::EC2::FlowLog", { + ResourceType: "VPC", + TrafficType: "ALL", + }); + + template.hasResourceProperties("AWS::Logs::LogGroup", { + RetentionInDays: 365, + }); + }); + + test("creates buckets and ECR repo with custom names when provided", () => { + const customName: string = `${resource_prefix}-${DEFAULT_ENV.account}-${DEFAULT_ENV.region}-custom-xxxxxxxxxxxxxx`; + const appWithCustomNames = new cdk.App(); + const stackWithCustomNames = new PipelineResourcesStack( + appWithCustomNames, + `${resource_prefix}-stack-custom`, + { + resource_prefix: resource_prefix, + ecrRepositoryName: customName, + pipelineArtifactBucketName: customName, + pipelineSourceBucketName: customName, + pipelineOutputBucketName: customName, + loggingBucketName: customName, + }, + ); + const templateWithCustomNames = Template.fromStack(stackWithCustomNames); + + templateWithCustomNames.hasResourceProperties("AWS::ECR::Repository", { + RepositoryName: customName, + }); + + templateWithCustomNames.hasResourceProperties("AWS::S3::Bucket", { + BucketName: customName, + }); + + templateWithCustomNames.resourceCountIs("AWS::S3::Bucket", 4); + }); + + test("Logs Have Minimum Retention Period", () => { template.resourceCountIs("AWS::Logs::LogGroup", 1); template.allResourcesProperties("AWS::Logs::LogGroup", { RetentionInDays: 365, }); }); + test("creates required outputs", () => { + template.hasOutput("LoggingBucket", {}); + template.hasOutput("SourceBucket", {}); + template.hasOutput("ArtifactBucket", {}); + template.hasOutput("OutputBucket", {}); + }); + + test("enforces SSL on all buckets", () => { + const buckets = template.findResources("AWS::S3::Bucket"); + template.resourceCountIs( + "AWS::S3::BucketPolicy", + Object.keys(buckets).length, + ); + + template.hasResourceProperties("AWS::S3::BucketPolicy", { + PolicyDocument: { + Statement: Match.arrayWith([ + Match.objectLike({ + Action: "s3:*", + Condition: { + Bool: { + "aws:SecureTransport": "false", + }, + }, + Effect: "Deny", + Principal: { + AWS: "*", + }, + }), + ]), + }, + }); + }); + test("Snapshot", () => { /* We must change some randomly generated file names used in the S3 asset construct. */ const templateWithConstKeys = normalizedTemplateFromStack(stack); From af177f693f026de40a7e86f1325c48a76aadda49 Mon Sep 17 00:00:00 2001 From: Abdel Dadouche Date: Thu, 20 Feb 2025 13:58:42 +0100 Subject: [PATCH 087/112] Update doc.yml update to support yarn --- .github/workflows/doc.yml | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml index d16ea69..d8b9147 100644 --- a/.github/workflows/doc.yml +++ b/.github/workflows/doc.yml @@ -11,12 +11,29 @@ jobs: build-and-deploy: runs-on: ubuntu-latest steps: - - name: Checkout - 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@v4 + with: + node-version: ${{ matrix.node-version }} + cache: "yarn" - name: Install and Build run: | - yarn install --frozen-lockfile + yarn install --immutable yarn run doc - name: Deploy From a64d3d416af89cf55e617b411c9f4af3c035bc31 Mon Sep 17 00:00:00 2001 From: Abdel Dadouche Date: Mon, 24 Feb 2025 15:40:28 +0100 Subject: [PATCH 088/112] Major update to 0.2.0 (#76) * adding new folders to exclude * updating the architecture diagrams * adding / moving helper scripts * moving the base image assests to source-repo * adjusting buildspec file with new nfs mount location & adding debug logs * refactoring poky/poky-ami project & esling formatting * eslint & jest config refactoring / updates * library version updates & scripts commands ajdustments * github workflow adjustment to conform with new script location * deprecating existing/former cdk libraries and test * updating package-lock.json * adding new refactored version of the CDK construct with less dependecies between each other: - improve the overall deployment time - reduce the number of EFS instance requried (1 from 3 per pipeline) - provide reuable resourcess across pipelines (s3 buckets, kms keys, ecr reigistry, etc) - remove oprhan code * updated readme * updated tests snapshot * eslint reformatting * forcing dependency to prevent iam role issue on first run of pipeline * managin eof / eol with lf only (as I'm working o windows and this can cause issues if env is not configured properly) * updated test due to dependency change * moving build assets script out to avoid deployment in dist * updating reference to build assets script * adding execute permission * package.json: - updated dependencies/devDependencies/peerDependencies - added license attribute - switching to yarn README.md: - doc adjustement due toyarn switch - confirmed steps for linking Yarn switch for the following reasons: - provides better linking / dependencies management - faster than npm (somehow) - enable easier linking when developping * downsizing codebuild ComputeType to save on cost and because resources are not fully used * Normalize all the line endings * forcing lf endings * adding docker image file to allow uplaod & zip of source repo via cdk assets * variable renaming to improve readability * differentiating ProjectKind from deprecated API * - code refactoring to remove local archive creation (using assets and bucket deployement instead - variable renaming to improve readability * minor comment changes * moving the vmimport bucket class to the deprecated folder * adjusting the vmimport bucket class import * removing references to VMImportBucket * simplifying the build asset script * excluding the test folder from the dist/build output * adding excluded folder fom build and eslint * cleanup and relocation of scripts and assets * variable renaming to improve readability * - variable renaming to improve readability - removed use of custom S3 Bucket object for VM Import (enabled by design if needed) - updating nag snapshots * updating script path * varible renaming to improve readability * switching to S3 poll trigger * code cleanup * adjusting the readme with additional details * function refactoring * improving the doc / readme * minor change in navigation * adding the ability to use a custom local source path be used to create a pipeline * switching to codepipeline_actions.S3Trigger.EVENTS, * - switching to codepipeline_actions.S3Trigger.EVENTS, - adding a custom project type where you can provide the location of your buildspec * variable renaming * - extending create ami script with additional parameters - adding tags and name to the created ami * test updates * removing node 18/20 support * removing deprecated code * switching to yarn * switching to yarn * fixing shell check * fixing shell check warnings * adjusting shell check script path * pre-commit failures fixes * pre-commit failures fixes * adding a post install script to force dist folder generation on install * reveerting change * adjusting lifecycle scripts * updating to Yarn 2 (v4.6.0) * updating to Yarn 2 (v4.6.0) * adding package-lock for npm compatibility * fixing renesas script * Update doc.yml update to support yarn * fixing formatting --------- Co-authored-by: Abdelhalim Dadouche --- .gitignore | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.gitignore b/.gitignore index 589979c..cc126e1 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,15 @@ yarn-install.log !.yarn/sdks/ .pnp.* +# yarn asset +yarn-install.log +.yarn/* +!.yarn/releases/ +!.yarn/plugins/ +!.yarn/versions/ +!.yarn/sdks/ +.pnp.* + # CDK asset staging directory .cdk.staging cdk.out From a243b24c3879f28729e54bbdf23db9ab99edb20b Mon Sep 17 00:00:00 2001 From: Abdel Dadouche Date: Mon, 24 Feb 2025 15:40:28 +0100 Subject: [PATCH 089/112] Major update to 0.2.0 (#76) * adding new folders to exclude * updating the architecture diagrams * adding / moving helper scripts * moving the base image assests to source-repo * adjusting buildspec file with new nfs mount location & adding debug logs * refactoring poky/poky-ami project & esling formatting * eslint & jest config refactoring / updates * library version updates & scripts commands ajdustments * github workflow adjustment to conform with new script location * deprecating existing/former cdk libraries and test * updating package-lock.json * adding new refactored version of the CDK construct with less dependecies between each other: - improve the overall deployment time - reduce the number of EFS instance requried (1 from 3 per pipeline) - provide reuable resourcess across pipelines (s3 buckets, kms keys, ecr reigistry, etc) - remove oprhan code * updated readme * updated tests snapshot * eslint reformatting * forcing dependency to prevent iam role issue on first run of pipeline * managin eof / eol with lf only (as I'm working o windows and this can cause issues if env is not configured properly) * updated test due to dependency change * moving build assets script out to avoid deployment in dist * updating reference to build assets script * adding execute permission * package.json: - updated dependencies/devDependencies/peerDependencies - added license attribute - switching to yarn README.md: - doc adjustement due toyarn switch - confirmed steps for linking Yarn switch for the following reasons: - provides better linking / dependencies management - faster than npm (somehow) - enable easier linking when developping * downsizing codebuild ComputeType to save on cost and because resources are not fully used * Normalize all the line endings * forcing lf endings * adding docker image file to allow uplaod & zip of source repo via cdk assets * variable renaming to improve readability * differentiating ProjectKind from deprecated API * - code refactoring to remove local archive creation (using assets and bucket deployement instead - variable renaming to improve readability * minor comment changes * moving the vmimport bucket class to the deprecated folder * adjusting the vmimport bucket class import * removing references to VMImportBucket * simplifying the build asset script * excluding the test folder from the dist/build output * adding excluded folder fom build and eslint * cleanup and relocation of scripts and assets * variable renaming to improve readability * - variable renaming to improve readability - removed use of custom S3 Bucket object for VM Import (enabled by design if needed) - updating nag snapshots * updating script path * varible renaming to improve readability * switching to S3 poll trigger * code cleanup * adjusting the readme with additional details * function refactoring * improving the doc / readme * minor change in navigation * adding the ability to use a custom local source path be used to create a pipeline * switching to codepipeline_actions.S3Trigger.EVENTS, * - switching to codepipeline_actions.S3Trigger.EVENTS, - adding a custom project type where you can provide the location of your buildspec * variable renaming * - extending create ami script with additional parameters - adding tags and name to the created ami * test updates * removing node 18/20 support * removing deprecated code * switching to yarn * switching to yarn * fixing shell check * fixing shell check warnings * adjusting shell check script path * pre-commit failures fixes * pre-commit failures fixes * adding a post install script to force dist folder generation on install * reveerting change * adjusting lifecycle scripts * updating to Yarn 2 (v4.6.0) * updating to Yarn 2 (v4.6.0) * adding package-lock for npm compatibility * fixing renesas script * Update doc.yml update to support yarn * fixing formatting --------- Co-authored-by: Abdelhalim Dadouche --- .gitignore | 12 ++++++++++++ ...eline-embedded-linux-base-image.test.ts.snap | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/.gitignore b/.gitignore index cc126e1..902d03e 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,15 @@ yarn-install.log !.yarn/sdks/ .pnp.* +# yarn asset +yarn-install.log +.yarn/* +!.yarn/releases/ +!.yarn/plugins/ +!.yarn/versions/ +!.yarn/sdks/ +.pnp.* + # CDK asset staging directory .cdk.staging cdk.out @@ -41,4 +50,7 @@ cdk.context.json assets source-zip +<<<<<<< HEAD aws4embeddedlinux-cdk-lib-*.tgz +======= +>>>>>>> 988e320 (Major update to 0.2.0 (#76)) diff --git a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap index e4acead..d921562 100644 --- a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap @@ -499,6 +499,13 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, { "Action": "sts:AssumeRole", "Effect": "Allow", @@ -597,6 +604,16 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, + { + "Action": [ + "kms:Decrypt", + "kms:DescribeKey", + ], + "Effect": "Allow", + "Resource": { + "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", + }, + }, { "Action": [ "s3:DeleteObject*", From 4c38b989814d1639b1121d2897c1a3602cbbde94 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 26 Mar 2025 17:30:29 +0100 Subject: [PATCH 090/112] updating snapshot --- .gitignore | 3 --- ...eline-embedded-linux-base-image.test.ts.snap | 17 ----------------- 2 files changed, 20 deletions(-) diff --git a/.gitignore b/.gitignore index 902d03e..7ca1a94 100644 --- a/.gitignore +++ b/.gitignore @@ -50,7 +50,4 @@ cdk.context.json assets source-zip -<<<<<<< HEAD aws4embeddedlinux-cdk-lib-*.tgz -======= ->>>>>>> 988e320 (Major update to 0.2.0 (#76)) diff --git a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap index d921562..e4acead 100644 --- a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap @@ -499,13 +499,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": "sts:AssumeRole", "Effect": "Allow", @@ -604,16 +597,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": [ "s3:DeleteObject*", From 43dbe5366e46dd37259214406697432221d5aa3b Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Wed, 26 Mar 2025 17:59:57 +0100 Subject: [PATCH 091/112] updating snapshot and test --- ...eline-embedded-linux-base-image.test.ts.snap | 17 ----------------- test/codebuild-embedded-linux.test.ts | 16 ++++++++-------- test/codepipeline-embedded-linux-nag.test.ts | 4 ++-- test/codepipeline-embedded-linux.test.ts | 8 ++++---- 4 files changed, 14 insertions(+), 31 deletions(-) diff --git a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap index d921562..e4acead 100644 --- a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap @@ -499,13 +499,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": "sts:AssumeRole", "Effect": "Allow", @@ -604,16 +597,6 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` }, ], }, - { - "Action": [ - "kms:Decrypt", - "kms:DescribeKey", - ], - "Effect": "Allow", - "Resource": { - "Fn::ImportValue": "MyResourceStack:ExportsOutputFnGetAttPipelineResourcesArtifactKey368D3018Arn0E784876", - }, - }, { "Action": [ "s3:DeleteObject*", diff --git a/test/codebuild-embedded-linux.test.ts b/test/codebuild-embedded-linux.test.ts index 3ab1508..4fdf2c5 100644 --- a/test/codebuild-embedded-linux.test.ts +++ b/test/codebuild-embedded-linux.test.ts @@ -69,7 +69,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack", () => { Match.objectLike({ CidrIp: { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replace("-", "")}*`, + `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replaceAll("-", "")}*`, ), }, FromPort: 2049, @@ -96,7 +96,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack", () => { ":", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace("-", "")}`, + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replaceAll("-", "")}`, ), }, ], @@ -112,7 +112,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack", () => { ":", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace("-", "")}`, + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replaceAll("-", "")}`, ), }, ], @@ -126,7 +126,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack", () => { "/", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replace("-", "")}`, + `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replaceAll("-", "")}`, ), }, ":latest", @@ -263,7 +263,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack Custom", () => { Match.objectLike({ CidrIp: { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replace("-", "")}*`, + `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replaceAll("-", "")}*`, ), }, FromPort: 2049, @@ -290,7 +290,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack Custom", () => { ":", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace("-", "")}`, + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replaceAll("-", "")}`, ), }, ], @@ -306,7 +306,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack Custom", () => { ":", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace("-", "")}`, + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replaceAll("-", "")}`, ), }, ], @@ -320,7 +320,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack Custom", () => { "/", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replace("-", "")}`, + `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replaceAll("-", "")}`, ), }, ":latest", diff --git a/test/codepipeline-embedded-linux-nag.test.ts b/test/codepipeline-embedded-linux-nag.test.ts index 4c22fee..a162269 100644 --- a/test/codepipeline-embedded-linux-nag.test.ts +++ b/test/codepipeline-embedded-linux-nag.test.ts @@ -162,10 +162,10 @@ function addNagSuppressions( regex: `/Resource::arn:aws:ec2:${DEFAULT_ENV.region}::snapshot/\\*$/g`, }, { - regex: `/Resource::<${_props.pipelineOutputBucket.node.id.replace("-", "")}A5072518.Arn>/\\*$/g`, + regex: `/Resource::<${_props.pipelineOutputBucket.node.id.replaceAll("-", "")}A5072518.Arn>/\\*$/g`, }, { - regex: `/Resource::${_stack.stackName}:ExportsOutputFnGetAtt${_props.pipelineOutputBucket.node.id.replace("-", "").toLowerCase()}A5072518ArnD3542377/\\*$/g`, + regex: `/Resource::${_stack.stackName}:ExportsOutputFnGetAtt${_props.pipelineOutputBucket.node.id.replaceAll("-", "").toLowerCase()}A5072518ArnD3542377/\\*$/g`, }, { regex: `/Resource::test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377/\\*$/g`, diff --git a/test/codepipeline-embedded-linux.test.ts b/test/codepipeline-embedded-linux.test.ts index 494ffb9..ae6ab72 100644 --- a/test/codepipeline-embedded-linux.test.ts +++ b/test/codepipeline-embedded-linux.test.ts @@ -140,7 +140,7 @@ describe("EmbeddedLinuxCodePipelineStack", () => { ":", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace("-", "")}*`, + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replaceAll("-", "")}*`, ), }, ], @@ -156,7 +156,7 @@ describe("EmbeddedLinuxCodePipelineStack", () => { ":", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace("-", "")}*`, + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replaceAll("-", "")}*`, ), }, ], @@ -170,7 +170,7 @@ describe("EmbeddedLinuxCodePipelineStack", () => { "/", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replace("-", "")}*`, + `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replaceAll("-", "")}*`, ), }, ":latest", @@ -232,7 +232,7 @@ describe("EmbeddedLinuxCodePipelineStack", () => { Match.objectLike({ CidrIp: { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replace("-", "")}*`, + `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replaceAll("-", "")}*`, ), }, FromPort: 2049, From ecf0181434c1b26cfb2bf2a22b1c0e201b8da307 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 27 Mar 2025 09:20:39 +0100 Subject: [PATCH 092/112] changing target to es2020 instead of ES2020 --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 7d203cd..f433262 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2020", + "target": "es2020", "module": "commonjs", "lib": ["es2020", "dom"], "declaration": true, From 93b0ba167b07cb059aacacb404e5ffbb756ba934 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 27 Mar 2025 09:31:03 +0100 Subject: [PATCH 093/112] replacing reaplce all with global regexp --- test/codebuild-embedded-linux.test.ts | 16 ++++++++-------- test/codepipeline-embedded-linux-nag.test.ts | 4 ++-- test/codepipeline-embedded-linux.test.ts | 8 ++++---- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/test/codebuild-embedded-linux.test.ts b/test/codebuild-embedded-linux.test.ts index 4fdf2c5..24b0c3a 100644 --- a/test/codebuild-embedded-linux.test.ts +++ b/test/codebuild-embedded-linux.test.ts @@ -69,7 +69,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack", () => { Match.objectLike({ CidrIp: { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replaceAll("-", "")}*`, + `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replace(/-/g, "")}*`, ), }, FromPort: 2049, @@ -96,7 +96,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack", () => { ":", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replaceAll("-", "")}`, + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace(/-/g, "")}`, ), }, ], @@ -112,7 +112,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack", () => { ":", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replaceAll("-", "")}`, + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace(/-/g, "")}`, ), }, ], @@ -126,7 +126,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack", () => { "/", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replaceAll("-", "")}`, + `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replace(/-/g, "")}`, ), }, ":latest", @@ -263,7 +263,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack Custom", () => { Match.objectLike({ CidrIp: { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replaceAll("-", "")}*`, + `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replace(/-/g, "")}*`, ), }, FromPort: 2049, @@ -290,7 +290,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack Custom", () => { ":", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replaceAll("-", "")}`, + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace(/-/g, "")}`, ), }, ], @@ -306,7 +306,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack Custom", () => { ":", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replaceAll("-", "")}`, + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace(/-/g, "")}`, ), }, ], @@ -320,7 +320,7 @@ describe("EmbeddedLinuxCodeBuildProjectStack Custom", () => { "/", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replaceAll("-", "")}`, + `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replace(/-/g, "")}`, ), }, ":latest", diff --git a/test/codepipeline-embedded-linux-nag.test.ts b/test/codepipeline-embedded-linux-nag.test.ts index a162269..9680660 100644 --- a/test/codepipeline-embedded-linux-nag.test.ts +++ b/test/codepipeline-embedded-linux-nag.test.ts @@ -162,10 +162,10 @@ function addNagSuppressions( regex: `/Resource::arn:aws:ec2:${DEFAULT_ENV.region}::snapshot/\\*$/g`, }, { - regex: `/Resource::<${_props.pipelineOutputBucket.node.id.replaceAll("-", "")}A5072518.Arn>/\\*$/g`, + regex: `/Resource::<${_props.pipelineOutputBucket.node.id.replace(/-/g, "")}A5072518.Arn>/\\*$/g`, }, { - regex: `/Resource::${_stack.stackName}:ExportsOutputFnGetAtt${_props.pipelineOutputBucket.node.id.replaceAll("-", "").toLowerCase()}A5072518ArnD3542377/\\*$/g`, + regex: `/Resource::${_stack.stackName}:ExportsOutputFnGetAtt${_props.pipelineOutputBucket.node.id.replace(/-/g, "").toLowerCase()}A5072518ArnD3542377/\\*$/g`, }, { regex: `/Resource::test-common:ExportsOutputFnGetAtttestoutA5072518ArnD3542377/\\*$/g`, diff --git a/test/codepipeline-embedded-linux.test.ts b/test/codepipeline-embedded-linux.test.ts index ae6ab72..22eaf8c 100644 --- a/test/codepipeline-embedded-linux.test.ts +++ b/test/codepipeline-embedded-linux.test.ts @@ -140,7 +140,7 @@ describe("EmbeddedLinuxCodePipelineStack", () => { ":", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replaceAll("-", "")}*`, + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace(/-/g, "")}*`, ), }, ], @@ -156,7 +156,7 @@ describe("EmbeddedLinuxCodePipelineStack", () => { ":", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replaceAll("-", "")}*`, + `${common.stackName}:ExportsOutputFnGetAtt${props.ecrRepository.node.id.replace(/-/g, "")}*`, ), }, ], @@ -170,7 +170,7 @@ describe("EmbeddedLinuxCodePipelineStack", () => { "/", { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replaceAll("-", "")}*`, + `${common.stackName}:ExportsOutputRef${props.ecrRepository.node.id.replace(/-/g, "")}*`, ), }, ":latest", @@ -232,7 +232,7 @@ describe("EmbeddedLinuxCodePipelineStack", () => { Match.objectLike({ CidrIp: { "Fn::ImportValue": Match.stringLikeRegexp( - `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replaceAll("-", "")}*`, + `${common.stackName}:ExportsOutputFnGetAtt${props.vpc.node.id.replace(/-/g, "")}*`, ), }, FromPort: 2049, From 7c44dd672b38cb9a3eaf0dd82a79fedd8d7cee4f Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 27 Mar 2025 11:43:16 +0100 Subject: [PATCH 094/112] updating yarn and package lock files --- package-lock.json | 11 ++ yarn.lock | 452 ++++++++++++++++++++++++---------------------- 2 files changed, 245 insertions(+), 218 deletions(-) diff --git a/package-lock.json b/package-lock.json index f52d61d..3f3f560 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "eslint": "^9.16.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-tsdoc": "^0.4.0", "globals": "^15.13.0", "jest": "^29.7.0", @@ -2405,6 +2406,16 @@ } } }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", + "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, "node_modules/eslint-plugin-tsdoc": { "version": "0.4.0", "dev": true, diff --git a/yarn.lock b/yarn.lock index 32ab2d8..894692b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,9 +16,9 @@ __metadata: 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 + version: 2.2.229 + resolution: "@aws-cdk/asset-awscli-v1@npm:2.2.229" + checksum: 10c0/24a7ef8c49318bb6b177db90b63d407c0e5954fa785ffaa64a0055290361cc61610d9ad2df18d41fe13977be0f70222435ca0fcc2d75339e2f89453a7b37c545 languageName: node linkType: hard @@ -57,7 +57,7 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.26.5": +"@babel/compat-data@npm:^7.26.8": version: 7.26.8 resolution: "@babel/compat-data@npm:7.26.8" checksum: 10c0/66408a0388c3457fff1c2f6c3a061278dd7b3d2f0455ea29bb7b187fa52c60ae8b4054b3c0a184e21e45f0eaac63cf390737bc7504d1f4a088a6e7f652c068ca @@ -65,51 +65,51 @@ __metadata: 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" + version: 7.26.10 + resolution: "@babel/core@npm:7.26.10" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.9" + "@babel/generator": "npm:^7.26.10" "@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/helpers": "npm:^7.26.10" + "@babel/parser": "npm:^7.26.10" "@babel/template": "npm:^7.26.9" - "@babel/traverse": "npm:^7.26.9" - "@babel/types": "npm:^7.26.9" + "@babel/traverse": "npm:^7.26.10" + "@babel/types": "npm:^7.26.10" 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 + checksum: 10c0/e046e0e988ab53841b512ee9d263ca409f6c46e2a999fe53024688b92db394346fa3aeae5ea0866331f62133982eee05a675d22922a4603c3f603aa09a581d62 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" +"@babel/generator@npm:^7.26.10, @babel/generator@npm:^7.27.0, @babel/generator@npm:^7.7.2": + version: 7.27.0 + resolution: "@babel/generator@npm:7.27.0" dependencies: - "@babel/parser": "npm:^7.26.9" - "@babel/types": "npm:^7.26.9" + "@babel/parser": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^3.0.2" - checksum: 10c0/6b78872128205224a9a9761b9ea7543a9a7902a04b82fc2f6801ead4de8f59056bab3fd17b1f834ca7b049555fc4c79234b9a6230dd9531a06525306050becad + checksum: 10c0/7cb10693d2b365c278f109a745dc08856cae139d262748b77b70ce1d97da84627f79648cab6940d847392c0e5d180441669ed958b3aee98d9c7d274b37c553bd 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" + version: 7.27.0 + resolution: "@babel/helper-compilation-targets@npm:7.27.0" dependencies: - "@babel/compat-data": "npm:^7.26.5" + "@babel/compat-data": "npm:^7.26.8" "@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 + checksum: 10c0/375c9f80e6540118f41bd53dd54d670b8bf91235d631bdead44c8b313b26e9cd89aed5c6df770ad13a87a464497b5346bb72b9462ba690473da422f5402618b6 languageName: node linkType: hard @@ -164,24 +164,24 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.26.9": - version: 7.26.9 - resolution: "@babel/helpers@npm:7.26.9" +"@babel/helpers@npm:^7.26.10": + version: 7.27.0 + resolution: "@babel/helpers@npm:7.27.0" dependencies: - "@babel/template": "npm:^7.26.9" - "@babel/types": "npm:^7.26.9" - checksum: 10c0/3d4dbc4a33fe4181ed810cac52318b578294745ceaec07e2f6ecccf6cda55d25e4bfcea8f085f333bf911c9e1fc13320248dd1d5315ab47ad82ce1077410df05 + "@babel/template": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + checksum: 10c0/a3c64fd2d8b164c041808826cc00769d814074ea447daaacaf2e3714b66d3f4237ef6e420f61d08f463d6608f3468c2ac5124ab7c68f704e20384def5ade95f4 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" +"@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.10, @babel/parser@npm:^7.27.0": + version: 7.27.0 + resolution: "@babel/parser@npm:7.27.0" dependencies: - "@babel/types": "npm:^7.26.9" + "@babel/types": "npm:^7.27.0" bin: parser: ./bin/babel-parser.js - checksum: 10c0/4b9ef3c9a0d4c328e5e5544f50fe8932c36f8a2c851e7f14a85401487cd3da75cad72c2e1bcec1eac55599a6bbb2fdc091f274c4fcafa6bdd112d4915ff087fc + checksum: 10c0/ba2ed3f41735826546a3ef2a7634a8d10351df221891906e59b29b0a0cd748f9b0e7a6f07576858a9de8e77785aad925c8389ddef146de04ea2842047c9d2859 languageName: node linkType: hard @@ -372,39 +372,39 @@ __metadata: 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" +"@babel/template@npm:^7.26.9, @babel/template@npm:^7.27.0, @babel/template@npm:^7.3.3": + version: 7.27.0 + resolution: "@babel/template@npm:7.27.0" dependencies: "@babel/code-frame": "npm:^7.26.2" - "@babel/parser": "npm:^7.26.9" - "@babel/types": "npm:^7.26.9" - checksum: 10c0/019b1c4129cc01ad63e17529089c2c559c74709d225f595eee017af227fee11ae8a97a6ab19ae6768b8aa22d8d75dcb60a00b28f52e9fa78140672d928bc1ae9 + "@babel/parser": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" + checksum: 10c0/13af543756127edb5f62bf121f9b093c09a2b6fe108373887ccffc701465cfbcb17e07cf48aa7f440415b263f6ec006e9415c79dfc2e8e6010b069435f81f340 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" +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.10": + version: 7.27.0 + resolution: "@babel/traverse@npm:7.27.0" 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" + "@babel/generator": "npm:^7.27.0" + "@babel/parser": "npm:^7.27.0" + "@babel/template": "npm:^7.27.0" + "@babel/types": "npm:^7.27.0" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10c0/51dd57fa39ea34d04816806bfead04c74f37301269d24c192d1406dc6e244fea99713b3b9c5f3e926d9ef6aa9cd5c062ad4f2fc1caa9cf843d5e864484ac955e + checksum: 10c0/c7af29781960dacaae51762e8bc6c4b13d6ab4b17312990fbca9fc38e19c4ad7fecaae24b1cf52fb844e8e6cdc76c70ad597f90e496bcb3cc0a1d66b41a0aa5b 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" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.0, @babel/types@npm:^7.3.3": + version: 7.27.0 + resolution: "@babel/types@npm:7.27.0" dependencies: "@babel/helper-string-parser": "npm:^7.25.9" "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10c0/999c56269ba00e5c57aa711fbe7ff071cd6990bafd1b978341ea7572cc78919986e2aa6ee51dacf4b6a7a6fa63ba4eb3f1a03cf55eee31b896a56d068b895964 + checksum: 10c0/6f1592eabe243c89a608717b07b72969be9d9d2fce1dee21426238757ea1fa60fdfc09b29de9e48d8104311afc6e6fb1702565a9cc1e09bc1e76f2b2ddb0f6e1 languageName: node linkType: hard @@ -432,13 +432,13 @@ __metadata: 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" + version: 4.5.1 + resolution: "@eslint-community/eslint-utils@npm:4.5.1" dependencies: eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/2aa0ac2fc50ff3f234408b10900ed4f1a0b19352f21346ad4cc3d83a1271481bdda11097baa45d484dd564c895e0762a27a8240be7a256b3ad47129e96528252 + checksum: 10c0/b520ae1b7bd04531a5c5da2021071815df4717a9f7d13720e3a5ddccf5c9c619532039830811fcbae1c2f1c9d133e63af2435ee69e0fc0fabbd6d928c6800fb2 languageName: node linkType: hard @@ -450,18 +450,18 @@ __metadata: linkType: hard "@eslint/compat@npm:^1.2.4": - version: 1.2.6 - resolution: "@eslint/compat@npm:1.2.6" + version: 1.2.7 + resolution: "@eslint/compat@npm:1.2.7" peerDependencies: eslint: ^9.10.0 peerDependenciesMeta: eslint: optional: true - checksum: 10c0/e767b62f1e43a1b4e3f9f1ac64546f8bcdf4f3fb84c504d8f1b0ea31a71f1607bcd11288c86c77b8ddd3d0bba9a9513d7203d4e6d15b1b3a1cff7718dea61b40 + checksum: 10c0/df89a0396750748c3748eb5fc582bd6cb89be6599d88ed1c5cc60ae0d13f77d4bf5fb30fabdb6c9ce16dda35745ef2e6417fa82548cde7d2b3fa5a896da02c8e languageName: node linkType: hard -"@eslint/config-array@npm:^0.19.0": +"@eslint/config-array@npm:^0.19.2": version: 0.19.2 resolution: "@eslint/config-array@npm:0.19.2" dependencies: @@ -472,18 +472,25 @@ __metadata: languageName: node linkType: hard -"@eslint/core@npm:^0.11.0": - version: 0.11.0 - resolution: "@eslint/core@npm:0.11.0" +"@eslint/config-helpers@npm:^0.2.0": + version: 0.2.0 + resolution: "@eslint/config-helpers@npm:0.2.0" + checksum: 10c0/743a64653e13177029108f57ab47460ded08e3412c86216a14b7e8ab2dc79c2b64be45bf55c5ef29f83692a707dc34cf1e9217e4b8b4b272a0d9b691fdaf6a2a + languageName: node + linkType: hard + +"@eslint/core@npm:^0.12.0": + version: 0.12.0 + resolution: "@eslint/core@npm:0.12.0" dependencies: "@types/json-schema": "npm:^7.0.15" - checksum: 10c0/1e0671d035c908175f445864a7864cf6c6a8b67a5dfba8c47b2ac91e2d3ed36e8c1f2fd81d98a73264f8677055559699d4adb0f97d86588e616fc0dc9a4b86c9 + checksum: 10c0/d032af81195bb28dd800c2b9617548c6c2a09b9490da3c5537fd2a1201501666d06492278bb92cfccac1f7ac249e58601dd87f813ec0d6a423ef0880434fa0c3 languageName: node linkType: hard -"@eslint/eslintrc@npm:^3.2.0": - version: 3.2.0 - resolution: "@eslint/eslintrc@npm:3.2.0" +"@eslint/eslintrc@npm:^3.2.0, @eslint/eslintrc@npm:^3.3.1": + version: 3.3.1 + resolution: "@eslint/eslintrc@npm:3.3.1" dependencies: ajv: "npm:^6.12.4" debug: "npm:^4.3.2" @@ -494,14 +501,14 @@ __metadata: js-yaml: "npm:^4.1.0" minimatch: "npm:^3.1.2" strip-json-comments: "npm:^3.1.1" - checksum: 10c0/43867a07ff9884d895d9855edba41acf325ef7664a8df41d957135a81a477ff4df4196f5f74dc3382627e5cc8b7ad6b815c2cea1b58f04a75aced7c43414ab8b + checksum: 10c0/b0e63f3bc5cce4555f791a4e487bf999173fcf27c65e1ab6e7d63634d8a43b33c3693e79f192cbff486d7df1be8ebb2bd2edc6e70ddd486cbfa84a359a3e3b41 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 +"@eslint/js@npm:9.23.0, @eslint/js@npm:^9.16.0": + version: 9.23.0 + resolution: "@eslint/js@npm:9.23.0" + checksum: 10c0/4e70869372b6325389e0ab51cac6d3062689807d1cef2c3434857571422ce11dde3c62777af85c382b9f94d937127598d605d2086787f08611351bf99faded81 languageName: node linkType: hard @@ -512,13 +519,13 @@ __metadata: languageName: node linkType: hard -"@eslint/plugin-kit@npm:^0.2.5": - version: 0.2.6 - resolution: "@eslint/plugin-kit@npm:0.2.6" +"@eslint/plugin-kit@npm:^0.2.7": + version: 0.2.7 + resolution: "@eslint/plugin-kit@npm:0.2.7" dependencies: - "@eslint/core": "npm:^0.11.0" + "@eslint/core": "npm:^0.12.0" levn: "npm:^0.4.1" - checksum: 10c0/2d4cc4497c62e2a6437039fdd778911d768b0706c6256568c4ff1ad8724f663b2fa04a5873db6a20a812be11166e78e0346acfde4b7149e10e92f7b0075a976e + checksum: 10c0/0a1aff1ad63e72aca923217e556c6dfd67d7cd121870eb7686355d7d1475d569773528a8b2111b9176f3d91d2ea81f7413c34600e8e5b73d59e005d70780b633 languageName: node linkType: hard @@ -564,10 +571,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/retry@npm:^0.4.1": - version: 0.4.1 - resolution: "@humanwhocodes/retry@npm:0.4.1" - checksum: 10c0/be7bb6841c4c01d0b767d9bb1ec1c9359ee61421ce8ba66c249d035c5acdfd080f32d55a5c9e859cdd7868788b8935774f65b2caf24ec0b7bd7bf333791f063b +"@humanwhocodes/retry@npm:^0.4.2": + version: 0.4.2 + resolution: "@humanwhocodes/retry@npm:0.4.2" + checksum: 10c0/0235525d38f243bee3bf8b25ed395fbf957fb51c08adae52787e1325673071abe856c7e18e530922ed2dd3ce12ed82ba01b8cee0279ac52a3315fcdc3a69ef0c languageName: node linkType: hard @@ -950,10 +957,10 @@ __metadata: languageName: node linkType: hard -"@pkgr/core@npm:^0.1.0": - version: 0.1.1 - resolution: "@pkgr/core@npm:0.1.1" - checksum: 10c0/3f7536bc7f57320ab2cf96f8973664bef624710c403357429fbf680a5c3b4843c1dbd389bb43daa6b1f6f1f007bb082f5abcb76bb2b5dc9f421647743b71d3d8 +"@pkgr/core@npm:^0.2.0": + version: 0.2.0 + resolution: "@pkgr/core@npm:0.2.0" + checksum: 10c0/29cb9c15f4788096b8b8b786b19c75b6398b6afe814a97189922c3046d8acb5d24f1217fd2537c3f8e42c04e48d572295e7ee56d77964ddc932c44eb5a615931 languageName: node linkType: hard @@ -1070,18 +1077,18 @@ __metadata: 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" + version: 7.20.7 + resolution: "@types/babel__traverse@npm:7.20.7" dependencies: "@babel/types": "npm:^7.20.7" - checksum: 10c0/7ba7db61a53e28cac955aa99af280d2600f15a8c056619c05b6fc911cbe02c61aa4f2823299221b23ce0cce00b294c0e5f618ec772aa3f247523c2e48cf7b888 + checksum: 10c0/5386f0af44f8746b063b87418f06129a814e16bb2686965a575e9d7376b360b088b89177778d8c426012abc43dd1a2d8ec3218bfc382280c898682746ce2ffbd languageName: node linkType: hard "@types/estree@npm:^1.0.6": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + version: 1.0.7 + resolution: "@types/estree@npm:1.0.7" + checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c languageName: node linkType: hard @@ -1146,11 +1153,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 22.13.4 - resolution: "@types/node@npm:22.13.4" + version: 22.13.14 + resolution: "@types/node@npm:22.13.14" dependencies: undici-types: "npm:~6.20.0" - checksum: 10c0/3a234fa7766a3efc382cf81f66f474c26cdab2f54f43f757634c81c0444eb2160c2dabbde9741e4983078a318a88515b65416b5f1ab5478548579d7b3ead1d95 + checksum: 10c0/fa2ab5b8277bfbcc86c42e46a3ea9871b0d559894cc9d955685d17178c9499f0b1bf03d1d1ea8d92ef2dda818988f4035acb8abf9dc15423a998fa56173ab804 languageName: node linkType: hard @@ -1193,15 +1200,15 @@ __metadata: 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" +"@typescript-eslint/eslint-plugin@npm:8.28.0, @typescript-eslint/eslint-plugin@npm:^8.18.0": + version: 8.28.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.28.0" 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" + "@typescript-eslint/scope-manager": "npm:8.28.0" + "@typescript-eslint/type-utils": "npm:8.28.0" + "@typescript-eslint/utils": "npm:8.28.0" + "@typescript-eslint/visitor-keys": "npm:8.28.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -1209,65 +1216,65 @@ __metadata: 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 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/f01b7d231b01ec2c1cc7c40599ddceb329532f2876664a39dec9d25c0aed4cfdbef3ec07f26bac357df000d798f652af6fdb6a2481b6120e43bfa38f7c7a7c48 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" +"@typescript-eslint/parser@npm:8.28.0, @typescript-eslint/parser@npm:^8.18.0": + version: 8.28.0 + resolution: "@typescript-eslint/parser@npm:8.28.0" 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" + "@typescript-eslint/scope-manager": "npm:8.28.0" + "@typescript-eslint/types": "npm:8.28.0" + "@typescript-eslint/typescript-estree": "npm:8.28.0" + "@typescript-eslint/visitor-keys": "npm:8.28.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/9de557698c8debf3de06b6adf6aa06a8345e0e38600e5ccbeda62270d1a4a757dfa191db89d4e86cf373103a11bef1965c9d9889f622c51f4f26d1bf12394ae3 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/4bde6887bbf3fe031c01e46db90f9f384a8cac2e67c2972b113a62d607db75e01db943601279aac847b9187960a038981814042cb02fd5aa27ea4613028f9313 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" +"@typescript-eslint/scope-manager@npm:8.28.0": + version: 8.28.0 + resolution: "@typescript-eslint/scope-manager@npm:8.28.0" dependencies: - "@typescript-eslint/types": "npm:8.24.1" - "@typescript-eslint/visitor-keys": "npm:8.24.1" - checksum: 10c0/779880743ed7ab67fe477f1ad5648bbd77ad69b4663b5a42024112004c8f231049b1e4eeb67e260005769c3bb005049e00a80b885e19d593ffb080bd39f4fa94 + "@typescript-eslint/types": "npm:8.28.0" + "@typescript-eslint/visitor-keys": "npm:8.28.0" + checksum: 10c0/f3bd76b3f54e60f1efe108b233b2d818e44ecf0dc6422cc296542f784826caf3c66d51b8acc83d8c354980bd201e1d9aa1ea01011de96e0613d320c00e40ccfd 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" +"@typescript-eslint/type-utils@npm:8.28.0": + version: 8.28.0 + resolution: "@typescript-eslint/type-utils@npm:8.28.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.24.1" - "@typescript-eslint/utils": "npm:8.24.1" + "@typescript-eslint/typescript-estree": "npm:8.28.0" + "@typescript-eslint/utils": "npm:8.28.0" 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 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/b8936edc2153bf794efba39bfb06393a228217830051767360f4b691fed7c82f3831c4fc6deac6d78b90a58596e61f866c17eaee9dd793c3efda3ebdcf5a71d8 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 +"@typescript-eslint/types@npm:8.28.0": + version: 8.28.0 + resolution: "@typescript-eslint/types@npm:8.28.0" + checksum: 10c0/1f95895e20dac1cf063dc93c99142fd1871e53be816bcbbee93f22a05e6b2a82ca83c20ce3a551f65555910aa0956443a23268edbb004369d0d5cb282d13c377 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" +"@typescript-eslint/typescript-estree@npm:8.28.0": + version: 8.28.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.28.0" dependencies: - "@typescript-eslint/types": "npm:8.24.1" - "@typescript-eslint/visitor-keys": "npm:8.24.1" + "@typescript-eslint/types": "npm:8.28.0" + "@typescript-eslint/visitor-keys": "npm:8.28.0" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -1275,33 +1282,33 @@ __metadata: semver: "npm:^7.6.0" ts-api-utils: "npm:^2.0.1" peerDependencies: - typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/8eeeae6e8de1cd83f2eddd52293e9c31a655e0974cc2d410f00ba2b6fd6bb9aec1c346192d5784d64d0d1b15a55e56e35550788c04dda87e0f1a99b21a3eb709 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/97a91c95b1295926098c12e2d2c2abaa68994dc879da132dcce1e75ec9d7dee8187695eaa5241d09cbc42b5e633917b6d35c624e78e3d3ee9bda42d1318080b6 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.24.1": - version: 8.24.1 - resolution: "@typescript-eslint/utils@npm:8.24.1" +"@typescript-eslint/utils@npm:8.28.0": + version: 8.28.0 + resolution: "@typescript-eslint/utils@npm:8.28.0" 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" + "@typescript-eslint/scope-manager": "npm:8.28.0" + "@typescript-eslint/types": "npm:8.28.0" + "@typescript-eslint/typescript-estree": "npm:8.28.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/b3300d5c7e18ec524a46bf683052539f24df0d8c709e39e3bde9dfc6c65180610c46b875f1f4eaad5e311193a56acdfd7111a73f1e8aec4108e9cd19561bf8b8 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/d3425be7f86c1245a11f0ea39136af681027797417348d8e666d38c76646945eaed7b35eb8db66372b067dee8b02a855caf2c24c040ec9c31e59681ab223b59d 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" +"@typescript-eslint/visitor-keys@npm:8.28.0": + version: 8.28.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.28.0" dependencies: - "@typescript-eslint/types": "npm:8.24.1" + "@typescript-eslint/types": "npm:8.28.0" eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/ba09412fb4b1605aa73c890909c9a8dba2aa72e00ccd7d69baad17c564eedd77f489a06b1686985c7f0c49724787b82d76dcf4c146c4de44ef2c8776a9b6ad2b + checksum: 10c0/245a78ed983fe95fbd1b0f2d4cb9e9d1d964bddc0aa3e3d6ab10c19c4273855bfb27d840bb1fd55deb7ae3078b52f26592472baf6fd2c7019a5aa3b1da974f35 languageName: node linkType: hard @@ -1331,11 +1338,11 @@ __metadata: 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" + version: 8.14.1 + resolution: "acorn@npm:8.14.1" bin: acorn: bin/acorn - checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 + checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 languageName: node linkType: hard @@ -1726,9 +1733,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001700 - resolution: "caniuse-lite@npm:1.0.30001700" - checksum: 10c0/3d391bcdd193208166d3ad759de240b9c18ac3759dbd57195770f0fcd2eedcd47d5e853609aba1eee5a2def44b0a14eee457796bdb3451a27de0c8b27355017c + version: 1.0.30001707 + resolution: "caniuse-lite@npm:1.0.30001707" + checksum: 10c0/a1beaf84bad4f6617bbc5616d6bc0c9cab73e73f7e9e09b6466af5195b1bc393e0f6f19643d7a1c88bd3f4bfa122d7bea81cf6225ec3ade57d5b1dd3478c1a1b languageName: node linkType: hard @@ -1740,12 +1747,12 @@ __metadata: linkType: hard "cdk-nag@npm:^2.35.0": - version: 2.35.24 - resolution: "cdk-nag@npm:2.35.24" + version: 2.35.56 + resolution: "cdk-nag@npm:2.35.56" peerDependencies: aws-cdk-lib: ^2.156.0 constructs: ^10.0.5 - checksum: 10c0/12783afc8f2cef18e5fb70a988864a548250383e0a4e4430853458fc49f3241697f035b9c9516fe68f07d8f76dcbb6b85bdf6c8522639392aac78db05577e68f + checksum: 10c0/7707908e3ebfde42af327f9f84bdf21b068d55db440d13010dd73d1ebce831f500f8084a488cff9319dd9169128a61113aeab4e2bb33ac8374e4cbf40883b549 languageName: node linkType: hard @@ -1955,9 +1962,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.5.73": - version: 1.5.102 - resolution: "electron-to-chromium@npm:1.5.102" - checksum: 10c0/db07dab3ee3b7fbc39ad26203925669ade86b12a62d09fa14ae48a354a0f34d162ac9a2ca9d6f70ceb1b16821b01b155e56467702bcc915da1e1dd147dd034b4 + version: 1.5.126 + resolution: "electron-to-chromium@npm:1.5.126" + checksum: 10c0/0e481d2467ac603f2fbb365d1cddd1e2d43f5f8c11aa281395cf450cfefa7b5cbdde1b952201fdf04730aa14adaff53e4087f88c3ff671b08f0baee2c1179954 languageName: node linkType: hard @@ -2047,22 +2054,22 @@ __metadata: linkType: hard "eslint-plugin-prettier@npm:^5.2.1": - version: 5.2.3 - resolution: "eslint-plugin-prettier@npm:5.2.3" + version: 5.2.5 + resolution: "eslint-plugin-prettier@npm:5.2.5" dependencies: prettier-linter-helpers: "npm:^1.0.0" - synckit: "npm:^0.9.1" + synckit: "npm:^0.10.2" peerDependencies: "@types/eslint": ">=8.0.0" eslint: ">=8.0.0" - eslint-config-prettier: "*" + eslint-config-prettier: ">= 7.0.0 <10.0.0 || >=10.1.0" prettier: ">=3.0.0" peerDependenciesMeta: "@types/eslint": optional: true eslint-config-prettier: optional: true - checksum: 10c0/60d9c03491ec6080ac1d71d0bee1361539ff6beb9b91ac98cfa7176c9ed52b7dbe7119ebee5b441b479d447d17d802a4a492ee06095ef2f22c460e3dd6459302 + checksum: 10c0/b88d4ecfccfdea786aa8c2df8c6b52754070fec48ef5df0dcd325daf7cbe01730a96fb6a8c5ae0ddd173472b43704d6452169b058284e842dfee5894172f310b languageName: node linkType: hard @@ -2085,13 +2092,13 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^8.2.0": - version: 8.2.0 - resolution: "eslint-scope@npm:8.2.0" +"eslint-scope@npm:^8.3.0": + version: 8.3.0 + resolution: "eslint-scope@npm:8.3.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10c0/8d2d58e2136d548ac7e0099b1a90d9fab56f990d86eb518de1247a7066d38c908be2f3df477a79cf60d70b30ba18735d6c6e70e9914dca2ee515a729975d70d6 + checksum: 10c0/23bf54345573201fdf06d29efa345ab508b355492f6c6cc9e2b9f6d02b896f369b6dd5315205be94b8853809776c4d13353b85c6b531997b164ff6c3328ecf5b languageName: node linkType: hard @@ -2110,19 +2117,20 @@ __metadata: linkType: hard "eslint@npm:^9.16.0": - version: 9.20.1 - resolution: "eslint@npm:9.20.1" + version: 9.23.0 + resolution: "eslint@npm:9.23.0" 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" + "@eslint/config-array": "npm:^0.19.2" + "@eslint/config-helpers": "npm:^0.2.0" + "@eslint/core": "npm:^0.12.0" + "@eslint/eslintrc": "npm:^3.3.1" + "@eslint/js": "npm:9.23.0" + "@eslint/plugin-kit": "npm:^0.2.7" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" - "@humanwhocodes/retry": "npm:^0.4.1" + "@humanwhocodes/retry": "npm:^0.4.2" "@types/estree": "npm:^1.0.6" "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" @@ -2130,7 +2138,7 @@ __metadata: 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-scope: "npm:^8.3.0" eslint-visitor-keys: "npm:^4.2.0" espree: "npm:^10.3.0" esquery: "npm:^1.5.0" @@ -2154,7 +2162,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/056789dd5a00897730376f8c0a191e22840e97b7276916068ec096341cb2ec3a918c8bd474bf94ccd7b457ad9fbc16e5c521a993c7cc6ebcf241933e2fd378b0 + checksum: 10c0/9616c308dfa8d09db8ae51019c87d5d05933742214531b077bd6ab618baab3bec7938256c14dcad4dc47f5ba93feb0bc5e089f68799f076374ddea21b6a9be45 languageName: node linkType: hard @@ -2304,11 +2312,11 @@ __metadata: linkType: hard "fastq@npm:^1.6.0": - version: 1.19.0 - resolution: "fastq@npm:1.19.0" + version: 1.19.1 + resolution: "fastq@npm:1.19.1" dependencies: reusify: "npm:^1.0.4" - checksum: 10c0/d6a001638f1574a696660fcbba5300d017760432372c801632c325ca7c16819604841c92fd3ccadcdacec0966ca336363a5ff57bc5f0be335d8ea7ac6087b98f + checksum: 10c0/ebc6e50ac7048daaeb8e64522a1ea7a26e92b3cee5cd1c7f2316cdca81ba543aa40a136b53891446ea5c3a67ec215fbaca87ad405f102dd97012f62916905630 languageName: node linkType: hard @@ -3649,8 +3657,8 @@ __metadata: linkType: hard "minipass-fetch@npm:^4.0.0": - version: 4.0.0 - resolution: "minipass-fetch@npm:4.0.0" + version: 4.0.1 + resolution: "minipass-fetch@npm:4.0.1" dependencies: encoding: "npm:^0.1.13" minipass: "npm:^7.0.3" @@ -3659,7 +3667,7 @@ __metadata: dependenciesMeta: encoding: optional: true - checksum: 10c0/7fa30ce7c373fb6f94c086b374fff1589fd7e78451855d2d06c2e2d9df936d131e73e952163063016592ed3081444bd8d1ea608533313b0149156ce23311da4b + checksum: 10c0/a3147b2efe8e078c9bf9d024a0059339c5a09c5b1dded6900a219c218cc8b1b78510b62dae556b507304af226b18c3f1aeb1d48660283602d5b6586c399eed5c languageName: node linkType: hard @@ -3986,11 +3994,11 @@ __metadata: linkType: hard "prettier@npm:^3.4.2": - version: 3.5.1 - resolution: "prettier@npm:3.5.1" + version: 3.5.3 + resolution: "prettier@npm:3.5.3" bin: prettier: bin/prettier.cjs - checksum: 10c0/9f6f810eae455d6e4213845151a484a2338f2e0d6a8b84ee8e13a83af8a2421ef6c1e31e61e4b135671fb57b9541f6624648880cc2061ac803e243ac898c0123 + checksum: 10c0/3880cb90b9dc0635819ab52ff571518c35bd7f15a6e80a2054c05dbc8a3aa6e74f135519e91197de63705bcb38388ded7e7230e2178432a1468005406238b877 languageName: node linkType: hard @@ -4145,9 +4153,9 @@ __metadata: linkType: hard "reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa languageName: node linkType: hard @@ -4397,13 +4405,13 @@ __metadata: languageName: node linkType: hard -"synckit@npm:^0.9.1": - version: 0.9.2 - resolution: "synckit@npm:0.9.2" +"synckit@npm:^0.10.2": + version: 0.10.3 + resolution: "synckit@npm:0.10.3" dependencies: - "@pkgr/core": "npm:^0.1.0" - tslib: "npm:^2.6.2" - checksum: 10c0/e0c262817444e5b872708adb6f5ad37951ba33f6b2d1d4477d45db1f57573a784618ceed5e6614e0225db330632b1f6b95bb74d21e4d013e45ad4bde03d0cb59 + "@pkgr/core": "npm:^0.2.0" + tslib: "npm:^2.8.1" + checksum: 10c0/9855d10231ae9b69c3aa08d46c96bd4befdcac33da44e29fb80e5c1430e453b5a33b8c073cdd25cfe9578f1d625c7d60c394ece1e202237116c1484def614041 languageName: node linkType: hard @@ -4462,17 +4470,17 @@ __metadata: linkType: hard "ts-api-utils@npm:^2.0.1": - version: 2.0.1 - resolution: "ts-api-utils@npm:2.0.1" + version: 2.1.0 + resolution: "ts-api-utils@npm:2.1.0" peerDependencies: typescript: ">=4.8.4" - checksum: 10c0/23fd56a958b332cac00150a652e4c84730df30571bd2faa1ba6d7b511356d1a61656621492bb6c7f15dd6e18847a1408357a0e406671d358115369a17f5bfedd + checksum: 10c0/9806a38adea2db0f6aa217ccc6bc9c391ddba338a9fe3080676d0d50ed806d305bb90e8cef0276e793d28c8a929f400abb184ddd7ff83a416959c0f4d2ce754f languageName: node linkType: hard "ts-jest@npm:^29.2.5": - version: 29.2.5 - resolution: "ts-jest@npm:29.2.5" + version: 29.3.0 + resolution: "ts-jest@npm:29.3.0" dependencies: bs-logger: "npm:^0.2.6" ejs: "npm:^3.1.10" @@ -4481,7 +4489,8 @@ __metadata: json5: "npm:^2.2.3" lodash.memoize: "npm:^4.1.2" make-error: "npm:^1.3.6" - semver: "npm:^7.6.3" + semver: "npm:^7.7.1" + type-fest: "npm:^4.37.0" yargs-parser: "npm:^21.1.1" peerDependencies: "@babel/core": ">=7.0.0-beta.0 <8" @@ -4503,7 +4512,7 @@ __metadata: optional: true bin: ts-jest: cli.js - checksum: 10c0/acb62d168faec073e64b20873b583974ba8acecdb94681164eb346cef82ade8fb481c5b979363e01a97ce4dd1e793baf64d9efd90720bc941ad7fc1c3d6f3f68 + checksum: 10c0/c6a6b80e056a6d78679307fc859ebaafa9809bd707e5679b4f3e75b774137d840e607401698059e98497dac299c8c90305eae7ae8464cb1c6f161edfa8de0903 languageName: node linkType: hard @@ -4545,7 +4554,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.6.2": +"tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -4575,9 +4584,16 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^4.37.0": + version: 4.38.0 + resolution: "type-fest@npm:4.38.0" + checksum: 10c0/db9990d682a08697cf8ae67ac3cdbca734c742c96615e8888401d7d54e376b390e6a5d3be25fe3b4b439e1bb88a7da461da678a614ece8caccd9c0a07dd2e5f4 + languageName: node + linkType: hard + "typedoc@npm:^0.27.4": - version: 0.27.7 - resolution: "typedoc@npm:0.27.7" + version: 0.27.9 + resolution: "typedoc@npm:0.27.9" dependencies: "@gerrit0/mini-shiki": "npm:^1.24.0" lunr: "npm:^2.3.9" @@ -4585,24 +4601,24 @@ __metadata: 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 + 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 || 5.8.x bin: typedoc: bin/typedoc - checksum: 10c0/727f7da5255f66d949a524582b5ec9ecfa43caade1ea48efe9305117bd18d5a26c423c788767ee992662eff7bec7ac993673cafe14d6fd206881c604cad2f6ba + checksum: 10c0/999668d9d23e1824b762e2c411e2c0860d0ce4a2e61f23a2c31d36a1d6337a763553bc75205aee25ce34659e9315315c720694e9eccd7e7e4755873fdfec1192 languageName: node linkType: hard "typescript-eslint@npm:^8.18.0": - version: 8.24.1 - resolution: "typescript-eslint@npm:8.24.1" + version: 8.28.0 + resolution: "typescript-eslint@npm:8.28.0" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.24.1" - "@typescript-eslint/parser": "npm:8.24.1" - "@typescript-eslint/utils": "npm:8.24.1" + "@typescript-eslint/eslint-plugin": "npm:8.28.0" + "@typescript-eslint/parser": "npm:8.28.0" + "@typescript-eslint/utils": "npm:8.28.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/5bcb6af12d04777ca04ca9300552e1c7410d640950945d854be41c264fdfe965ce40c0203336e073eb0697567d59043b3096dfed825e76fd7347081e9abf3b16 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/bf1c1e4b2f21a95930758d5b285c39a394a50e3b6983f373413b93b80a6cb5aabc1d741780e60c63cb42ad5d645ea9c1e6d441d98174c5a2884ab88f4ac46df6 languageName: node linkType: hard @@ -4673,8 +4689,8 @@ __metadata: linkType: hard "update-browserslist-db@npm:^1.1.1": - version: 1.1.2 - resolution: "update-browserslist-db@npm:1.1.2" + version: 1.1.3 + resolution: "update-browserslist-db@npm:1.1.3" dependencies: escalade: "npm:^3.2.0" picocolors: "npm:^1.1.1" @@ -4682,7 +4698,7 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10c0/9cb353998d6d7d6ba1e46b8fa3db888822dd972212da4eda609d185eb5c3557a93fd59780ceb757afd4d84240518df08542736969e6a5d6d6ce2d58e9363aac6 + checksum: 10c0/682e8ecbf9de474a626f6462aa85927936cdd256fe584c6df2508b0df9f7362c44c957e9970df55dfe44d3623807d26316ea2c7d26b80bb76a16c56c37233c32 languageName: node linkType: hard From 8cc8011b884da905c90ee19fef3692465e8a33d4 Mon Sep 17 00:00:00 2001 From: Abdel Dadouche Date: Thu, 27 Mar 2025 15:11:44 +0100 Subject: [PATCH 095/112] Create dependabot.yml --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..5f0889c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "npm" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" From 68e2173baa1bfb98ec13af9b4dbef0c06ebd14cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 14:13:21 +0000 Subject: [PATCH 096/112] Bump globals from 15.15.0 to 16.0.0 Bumps [globals](https://github.com/sindresorhus/globals) from 15.15.0 to 16.0.0. - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v15.15.0...v16.0.0) --- updated-dependencies: - dependency-name: globals dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 9bc5113..220e5c4 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-tsdoc": "^0.4.0", - "globals": "^15.13.0", + "globals": "^16.0.0", "jest": "^29.7.0", "prettier": "^3.4.2", "ts-jest": "^29.2.5", diff --git a/yarn.lock b/yarn.lock index 894692b..0d33854 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1527,7 +1527,7 @@ __metadata: eslint-plugin-prettier: "npm:^5.2.1" eslint-plugin-simple-import-sort: "npm:^12.1.1" eslint-plugin-tsdoc: "npm:^0.4.0" - globals: "npm:^15.13.0" + globals: "npm:^16.0.0" jest: "npm:^29.7.0" prettier: "npm:^3.4.2" ts-jest: "npm:^29.2.5" @@ -2537,10 +2537,10 @@ __metadata: languageName: node linkType: hard -"globals@npm:^15.13.0": - version: 15.15.0 - resolution: "globals@npm:15.15.0" - checksum: 10c0/f9ae80996392ca71316495a39bec88ac43ae3525a438b5626cd9d5ce9d5500d0a98a266409605f8cd7241c7acf57c354a48111ea02a767ba4f374b806d6861fe +"globals@npm:^16.0.0": + version: 16.0.0 + resolution: "globals@npm:16.0.0" + checksum: 10c0/8906d5f01838df64a81d6c2a7b7214312e2216cf65c5ed1546dc9a7d0febddf55ffa906cf04efd5b01eec2534d6f14859a89535d1a68241832810e41ef3fd5bb languageName: node linkType: hard From b39bcb1f9cbf7c863f35bfc8bf5cbb98d712b183 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 14:13:37 +0000 Subject: [PATCH 097/112] Bump aws-cdk from 2.176.0 to 2.1006.0 Bumps [aws-cdk](https://github.com/aws/aws-cdk-cli/tree/HEAD/packages/aws-cdk) from 2.176.0 to 2.1006.0. - [Release notes](https://github.com/aws/aws-cdk-cli/releases) - [Commits](https://github.com/aws/aws-cdk-cli/commits/aws-cdk@v2.1006.0/packages/aws-cdk) --- updated-dependencies: - dependency-name: aws-cdk dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 9bc5113..8ef8a75 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@types/node": "20.14.8", "@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/parser": "^8.18.0", - "aws-cdk": "2.176.0", + "aws-cdk": "2.1006.0", "cdk-nag": "^2.35.0", "eslint": "^9.16.0", "eslint-config-prettier": "^9.1.0", diff --git a/yarn.lock b/yarn.lock index 894692b..c955efe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1493,9 +1493,9 @@ __metadata: languageName: node linkType: hard -"aws-cdk@npm:2.176.0": - version: 2.176.0 - resolution: "aws-cdk@npm:2.176.0" +"aws-cdk@npm:2.1006.0": + version: 2.1006.0 + resolution: "aws-cdk@npm:2.1006.0" dependencies: fsevents: "npm:2.3.2" dependenciesMeta: @@ -1503,7 +1503,7 @@ __metadata: optional: true bin: cdk: bin/cdk - checksum: 10c0/861dddf7dcc67806c9dae85e191af94080c6e76aaf47bf29c9b3971c6277738c5dbc64609c220b32ef4885d788360614aa1241617803d730dc1f77db2c5b7c23 + checksum: 10c0/71af8be65b5b07d02f102fdd1490c9f84a9367e6c970505f4eafd333ca026f4433056350150dc010df68de41b1e26725e177827181e0964d8f3221349e16b169 languageName: node linkType: hard @@ -1518,7 +1518,7 @@ __metadata: "@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: "npm:2.1006.0" aws-cdk-lib: "npm:2.176.0" cdk-nag: "npm:^2.35.0" constructs: "npm:^10.4.2" From 5a11c7f00ffadfed30dd587c946379c88d1925a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 14:13:53 +0000 Subject: [PATCH 098/112] Bump typedoc from 0.27.9 to 0.28.1 Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.27.9 to 0.28.1. - [Release notes](https://github.com/TypeStrong/TypeDoc/releases) - [Changelog](https://github.com/TypeStrong/typedoc/blob/master/CHANGELOG.md) - [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.27.9...v0.28.1) --- updated-dependencies: - dependency-name: typedoc dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 54 ++++++++++++++++++++++++++-------------------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 9bc5113..d33dd31 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "prettier": "^3.4.2", "ts-jest": "^29.2.5", "ts-node": "^10.9.2", - "typedoc": "^0.27.4", + "typedoc": "^0.28.1", "typescript": "~5.7.2", "typescript-eslint": "^8.18.0" }, diff --git a/yarn.lock b/yarn.lock index 894692b..5e23570 100644 --- a/yarn.lock +++ b/yarn.lock @@ -529,14 +529,14 @@ __metadata: languageName: node linkType: hard -"@gerrit0/mini-shiki@npm:^1.24.0": - version: 1.27.2 - resolution: "@gerrit0/mini-shiki@npm:1.27.2" +"@gerrit0/mini-shiki@npm:^3.2.1": + version: 3.2.1 + resolution: "@gerrit0/mini-shiki@npm:3.2.1" dependencies: - "@shikijs/engine-oniguruma": "npm:^1.27.2" - "@shikijs/types": "npm:^1.27.2" - "@shikijs/vscode-textmate": "npm:^10.0.1" - checksum: 10c0/aee681637d123e0e8c9ec154b117ce166dd8b4b9896341e617fef16d0b21ef91a17f6f90cc874137e33ca85b5898817b59bb8aea178cdb2fa6e75b0fff3640c2 + "@shikijs/engine-oniguruma": "npm:^3.2.1" + "@shikijs/types": "npm:^3.2.1" + "@shikijs/vscode-textmate": "npm:^10.0.2" + checksum: 10c0/57ca704172fa203bdad8bd03ed059463b9a9e7fb46c6c288aca6619a6b3ea2663eba44ee528247175ac63e0fe4192e3e1d871627aadbd77651370c2447296b6a languageName: node linkType: hard @@ -964,27 +964,27 @@ __metadata: languageName: node linkType: hard -"@shikijs/engine-oniguruma@npm:^1.27.2": - version: 1.29.2 - resolution: "@shikijs/engine-oniguruma@npm:1.29.2" +"@shikijs/engine-oniguruma@npm:^3.2.1": + version: 3.2.1 + resolution: "@shikijs/engine-oniguruma@npm:3.2.1" dependencies: - "@shikijs/types": "npm:1.29.2" - "@shikijs/vscode-textmate": "npm:^10.0.1" - checksum: 10c0/87d77e05af7fe862df40899a7034cbbd48d3635e27706873025e5035be578584d012f850208e97ca484d5e876bf802d4e23d0394d25026adb678eeb1d1f340ff + "@shikijs/types": "npm:3.2.1" + "@shikijs/vscode-textmate": "npm:^10.0.2" + checksum: 10c0/8c4c51738740f9cfa610ccefaaea2378833820336e4329bb88b9a2208e3deb994b0b7bea2d6657eb915fb668ca2090a2168a84dfeac2b820c1fee00631ca9bed 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" +"@shikijs/types@npm:3.2.1, @shikijs/types@npm:^3.2.1": + version: 3.2.1 + resolution: "@shikijs/types@npm:3.2.1" dependencies: - "@shikijs/vscode-textmate": "npm:^10.0.1" + "@shikijs/vscode-textmate": "npm:^10.0.2" "@types/hast": "npm:^3.0.4" - checksum: 10c0/37b4ac315effc03e7185aca1da0c2631ac55bdf613897476bd1d879105c41f86ccce6ebd0b78779513d88cc2ee371039f7efd95d604f77f21f180791978822b3 + checksum: 10c0/3380fde198d466a8771137b7ca3d4756a54d7d24c6e65f852737472a280c12c07f2123b9ad3d7eb2edec86d8d2c53bc207abe0fc0c7f78d337e52e742dc34edf languageName: node linkType: hard -"@shikijs/vscode-textmate@npm:^10.0.1": +"@shikijs/vscode-textmate@npm:^10.0.2": version: 10.0.2 resolution: "@shikijs/vscode-textmate@npm:10.0.2" checksum: 10c0/36b682d691088ec244de292dc8f91b808f95c89466af421cf84cbab92230f03c8348649c14b3251991b10ce632b0c715e416e992dd5f28ff3221dc2693fd9462 @@ -1532,7 +1532,7 @@ __metadata: prettier: "npm:^3.4.2" ts-jest: "npm:^29.2.5" ts-node: "npm:^10.9.2" - typedoc: "npm:^0.27.4" + typedoc: "npm:^0.28.1" typescript: "npm:~5.7.2" typescript-eslint: "npm:^8.18.0" languageName: unknown @@ -4591,20 +4591,20 @@ __metadata: languageName: node linkType: hard -"typedoc@npm:^0.27.4": - version: 0.27.9 - resolution: "typedoc@npm:0.27.9" +"typedoc@npm:^0.28.1": + version: 0.28.1 + resolution: "typedoc@npm:0.28.1" dependencies: - "@gerrit0/mini-shiki": "npm:^1.24.0" + "@gerrit0/mini-shiki": "npm:^3.2.1" lunr: "npm:^2.3.9" markdown-it: "npm:^14.1.0" minimatch: "npm:^9.0.5" - yaml: "npm:^2.6.1" + yaml: "npm:^2.7.0 " 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 || 5.8.x bin: typedoc: bin/typedoc - checksum: 10c0/999668d9d23e1824b762e2c411e2c0860d0ce4a2e61f23a2c31d36a1d6337a763553bc75205aee25ce34659e9315315c720694e9eccd7e7e4755873fdfec1192 + checksum: 10c0/9932b28a7bcfebc523d9bd32c6a97bdb6a87556921a68ba9bf6792ce87ba964c7d5af0eebd954a6ecb6bbbc5bbc9282a7554c71e5fc201642a4b87bbb0443369 languageName: node linkType: hard @@ -4823,7 +4823,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.6.1": +"yaml@npm:^2.7.0 ": version: 2.7.0 resolution: "yaml@npm:2.7.0" bin: From d62f995b6235b9a39d59449bba8849c676712d29 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 14:14:11 +0000 Subject: [PATCH 099/112] Bump typescript from 5.7.3 to 5.8.2 Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.7.3 to 5.8.2. - [Release notes](https://github.com/microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml) - [Commits](https://github.com/microsoft/TypeScript/compare/v5.7.3...v5.8.2) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 9bc5113..2562551 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "ts-jest": "^29.2.5", "ts-node": "^10.9.2", "typedoc": "^0.27.4", - "typescript": "~5.7.2", + "typescript": "~5.8.2", "typescript-eslint": "^8.18.0" }, "resolutions": { diff --git a/yarn.lock b/yarn.lock index 894692b..0852871 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1533,7 +1533,7 @@ __metadata: ts-jest: "npm:^29.2.5" ts-node: "npm:^10.9.2" typedoc: "npm:^0.27.4" - typescript: "npm:~5.7.2" + typescript: "npm:~5.8.2" typescript-eslint: "npm:^8.18.0" languageName: unknown linkType: soft @@ -4622,23 +4622,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:~5.7.2": - version: 5.7.3 - resolution: "typescript@npm:5.7.3" +"typescript@npm:~5.8.2": + version: 5.8.2 + resolution: "typescript@npm:5.8.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/b7580d716cf1824736cc6e628ab4cd8b51877408ba2be0869d2866da35ef8366dd6ae9eb9d0851470a39be17cbd61df1126f9e211d8799d764ea7431d5435afa + checksum: 10c0/5c4f6fbf1c6389b6928fe7b8fcd5dc73bb2d58cd4e3883f1d774ed5bd83b151cbac6b7ecf11723de56d4676daeba8713894b1e9af56174f2f9780ae7848ec3c6 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" +"typescript@patch:typescript@npm%3A~5.8.2#optional!builtin": + version: 5.8.2 + resolution: "typescript@patch:typescript@npm%3A5.8.2#optional!builtin::version=5.8.2&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/6fd7e0ed3bf23a81246878c613423730c40e8bdbfec4c6e4d7bf1b847cbb39076e56ad5f50aa9d7ebd89877999abaee216002d3f2818885e41c907caaa192cc4 + checksum: 10c0/5448a08e595cc558ab321e49d4cac64fb43d1fa106584f6ff9a8d8e592111b373a995a1d5c7f3046211c8a37201eb6d0f1566f15cdb7a62a5e3be01d087848e2 languageName: node linkType: hard From ef60dd0c6ea702eb55da5d00c81dbd608c093ddd Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 27 Mar 2025 15:58:08 +0100 Subject: [PATCH 100/112] upgrading cdk / cdk-lib versions and accepting any minor and patch updates for the package --- package.json | 6 +++--- yarn.lock | 52 ++++++++++++++++++++++------------------------------ 2 files changed, 25 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 0281089..9e41dc4 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "preformat": "yarn clean" }, "dependencies": { - "aws-cdk-lib": "2.176.0", + "aws-cdk-lib": "^2.186.0", "constructs": "^10.4.2" }, "devDependencies": { @@ -30,7 +30,7 @@ "@types/node": "20.14.8", "@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/parser": "^8.18.0", - "aws-cdk": "2.1006.0", + "aws-cdk": "^2.1006.0", "cdk-nag": "^2.35.0", "eslint": "^9.16.0", "eslint-config-prettier": "^9.1.0", @@ -52,5 +52,5 @@ "overrides": { "glob": "^9.3.5" }, - "packageManager": "yarn@4.6.0" + "packageManager": "yarn@4.7.0" } diff --git a/yarn.lock b/yarn.lock index 8bf9305..b4598d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,20 +15,13 @@ __metadata: languageName: node linkType: hard -"@aws-cdk/asset-awscli-v1@npm:^2.2.208": +"@aws-cdk/asset-awscli-v1@npm:^2.2.227": version: 2.2.229 resolution: "@aws-cdk/asset-awscli-v1@npm:2.2.229" checksum: 10c0/24a7ef8c49318bb6b177db90b63d407c0e5954fa785ffaa64a0055290361cc61610d9ad2df18d41fe13977be0f70222435ca0fcc2d75339e2f89453a7b37c545 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" @@ -36,13 +29,13 @@ __metadata: 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" +"@aws-cdk/cloud-assembly-schema@npm:^40.7.0": + version: 40.7.0 + resolution: "@aws-cdk/cloud-assembly-schema@npm:40.7.0" dependencies: jsonschema: "npm:~1.4.1" semver: "npm:^7.7.1" - checksum: 10c0/94a96dc318627f2e3dfdd984134ad106f1e592d2eae41cd690069726c2f7aa4155e9f5196e71281eb199dc61b5f23cfbdbef59b8fda84d44da7a1aefb4a109af + checksum: 10c0/d7bac318e1cb215119d903b885aa3b2cfd1757b1ed6c7b065a873cd0b2e47b66447dd7713a07611a6dfd8f3f3781ec2ce2802c763e7bef1adb99730ea098b4b7 languageName: node linkType: hard @@ -1468,32 +1461,31 @@ __metadata: languageName: node linkType: hard -"aws-cdk-lib@npm:2.176.0": - version: 2.176.0 - resolution: "aws-cdk-lib@npm:2.176.0" +"aws-cdk-lib@npm:^2.186.0": + version: 2.186.0 + resolution: "aws-cdk-lib@npm:2.186.0" dependencies: - "@aws-cdk/asset-awscli-v1": "npm:^2.2.208" - "@aws-cdk/asset-kubectl-v20": "npm:^2.1.3" + "@aws-cdk/asset-awscli-v1": "npm:^2.2.227" "@aws-cdk/asset-node-proxy-agent-v6": "npm:^2.1.0" - "@aws-cdk/cloud-assembly-schema": "npm:^39.0.1" + "@aws-cdk/cloud-assembly-schema": "npm:^40.7.0" "@balena/dockerignore": "npm:^1.0.2" case: "npm:1.6.3" - fs-extra: "npm:^11.2.0" + fs-extra: "npm:^11.3.0" ignore: "npm:^5.3.2" - jsonschema: "npm:^1.4.1" + jsonschema: "npm:^1.5.0" 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" + semver: "npm:^7.7.1" + table: "npm:^6.9.0" yaml: "npm:1.10.2" peerDependencies: constructs: ^10.0.0 - checksum: 10c0/8b2506f6245572b508dbe4221f1fd64161bae46aea26686f3616b8c34cedbd1bc3c7b0a8f65722c625f945805dad52976f3564dbfa05afe4dcd39b1cfdc3fe1b + checksum: 10c0/ad478a9b7ca1c50e3d67eb5428e08cb2017c56e501ff5b30fe93d8841e18fe282f35b9595e474e663ed9bd4f2d92c26a597c56ec4f436a7553ecacc2c8a58a15 languageName: node linkType: hard -"aws-cdk@npm:2.1006.0": +"aws-cdk@npm:^2.1006.0": version: 2.1006.0 resolution: "aws-cdk@npm:2.1006.0" dependencies: @@ -1518,8 +1510,8 @@ __metadata: "@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.1006.0" - aws-cdk-lib: "npm:2.176.0" + aws-cdk: "npm:^2.1006.0" + aws-cdk-lib: "npm:^2.186.0" cdk-nag: "npm:^2.35.0" constructs: "npm:^10.4.2" eslint: "npm:^9.16.0" @@ -2393,7 +2385,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^11.2.0": +"fs-extra@npm:^11.3.0": version: 11.3.0 resolution: "fs-extra@npm:11.3.0" dependencies: @@ -3372,7 +3364,7 @@ __metadata: languageName: node linkType: hard -"jsonschema@npm:^1.4.1": +"jsonschema@npm:^1.5.0": version: 1.5.0 resolution: "jsonschema@npm:1.5.0" checksum: 10c0/c24ddb8d741f02efc0da3ad9b597a275f6b595062903d3edbfaa535c3f9c4c98613df68da5cb6635ed9aeab30d658986fea61d7662fc5b2b92840d5a1e21235e @@ -4195,7 +4187,7 @@ __metadata: 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": +"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.1": version: 7.7.1 resolution: "semver@npm:7.7.1" bin: @@ -4415,7 +4407,7 @@ __metadata: languageName: node linkType: hard -"table@npm:^6.8.2": +"table@npm:^6.9.0": version: 6.9.0 resolution: "table@npm:6.9.0" dependencies: From 54324a4b1086fc23131719417953d5eac92532ae Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 27 Mar 2025 15:58:08 +0100 Subject: [PATCH 101/112] upgrading cdk / cdk-lib versions and accepting any minor and patch updates for the package --- package.json | 8 ++++---- yarn.lock | 52 ++++++++++++++++++++++------------------------------ 2 files changed, 26 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index 0281089..e043e8d 100644 --- a/package.json +++ b/package.json @@ -12,14 +12,14 @@ "format": "eslint '**/*.{js,ts,json}' --quiet --fix", "postinstall": "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", + "test": "jest --passWithNoTests --updateSnapshot", "update-snapshot": "jest -u", "watch": "tsc -w", "precheck": "yarn clean", "preformat": "yarn clean" }, "dependencies": { - "aws-cdk-lib": "2.176.0", + "aws-cdk-lib": "^2.186.0", "constructs": "^10.4.2" }, "devDependencies": { @@ -30,7 +30,7 @@ "@types/node": "20.14.8", "@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/parser": "^8.18.0", - "aws-cdk": "2.1006.0", + "aws-cdk": "^2.1006.0", "cdk-nag": "^2.35.0", "eslint": "^9.16.0", "eslint-config-prettier": "^9.1.0", @@ -52,5 +52,5 @@ "overrides": { "glob": "^9.3.5" }, - "packageManager": "yarn@4.6.0" + "packageManager": "yarn@4.7.0" } diff --git a/yarn.lock b/yarn.lock index 8bf9305..b4598d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,20 +15,13 @@ __metadata: languageName: node linkType: hard -"@aws-cdk/asset-awscli-v1@npm:^2.2.208": +"@aws-cdk/asset-awscli-v1@npm:^2.2.227": version: 2.2.229 resolution: "@aws-cdk/asset-awscli-v1@npm:2.2.229" checksum: 10c0/24a7ef8c49318bb6b177db90b63d407c0e5954fa785ffaa64a0055290361cc61610d9ad2df18d41fe13977be0f70222435ca0fcc2d75339e2f89453a7b37c545 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" @@ -36,13 +29,13 @@ __metadata: 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" +"@aws-cdk/cloud-assembly-schema@npm:^40.7.0": + version: 40.7.0 + resolution: "@aws-cdk/cloud-assembly-schema@npm:40.7.0" dependencies: jsonschema: "npm:~1.4.1" semver: "npm:^7.7.1" - checksum: 10c0/94a96dc318627f2e3dfdd984134ad106f1e592d2eae41cd690069726c2f7aa4155e9f5196e71281eb199dc61b5f23cfbdbef59b8fda84d44da7a1aefb4a109af + checksum: 10c0/d7bac318e1cb215119d903b885aa3b2cfd1757b1ed6c7b065a873cd0b2e47b66447dd7713a07611a6dfd8f3f3781ec2ce2802c763e7bef1adb99730ea098b4b7 languageName: node linkType: hard @@ -1468,32 +1461,31 @@ __metadata: languageName: node linkType: hard -"aws-cdk-lib@npm:2.176.0": - version: 2.176.0 - resolution: "aws-cdk-lib@npm:2.176.0" +"aws-cdk-lib@npm:^2.186.0": + version: 2.186.0 + resolution: "aws-cdk-lib@npm:2.186.0" dependencies: - "@aws-cdk/asset-awscli-v1": "npm:^2.2.208" - "@aws-cdk/asset-kubectl-v20": "npm:^2.1.3" + "@aws-cdk/asset-awscli-v1": "npm:^2.2.227" "@aws-cdk/asset-node-proxy-agent-v6": "npm:^2.1.0" - "@aws-cdk/cloud-assembly-schema": "npm:^39.0.1" + "@aws-cdk/cloud-assembly-schema": "npm:^40.7.0" "@balena/dockerignore": "npm:^1.0.2" case: "npm:1.6.3" - fs-extra: "npm:^11.2.0" + fs-extra: "npm:^11.3.0" ignore: "npm:^5.3.2" - jsonschema: "npm:^1.4.1" + jsonschema: "npm:^1.5.0" 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" + semver: "npm:^7.7.1" + table: "npm:^6.9.0" yaml: "npm:1.10.2" peerDependencies: constructs: ^10.0.0 - checksum: 10c0/8b2506f6245572b508dbe4221f1fd64161bae46aea26686f3616b8c34cedbd1bc3c7b0a8f65722c625f945805dad52976f3564dbfa05afe4dcd39b1cfdc3fe1b + checksum: 10c0/ad478a9b7ca1c50e3d67eb5428e08cb2017c56e501ff5b30fe93d8841e18fe282f35b9595e474e663ed9bd4f2d92c26a597c56ec4f436a7553ecacc2c8a58a15 languageName: node linkType: hard -"aws-cdk@npm:2.1006.0": +"aws-cdk@npm:^2.1006.0": version: 2.1006.0 resolution: "aws-cdk@npm:2.1006.0" dependencies: @@ -1518,8 +1510,8 @@ __metadata: "@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.1006.0" - aws-cdk-lib: "npm:2.176.0" + aws-cdk: "npm:^2.1006.0" + aws-cdk-lib: "npm:^2.186.0" cdk-nag: "npm:^2.35.0" constructs: "npm:^10.4.2" eslint: "npm:^9.16.0" @@ -2393,7 +2385,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^11.2.0": +"fs-extra@npm:^11.3.0": version: 11.3.0 resolution: "fs-extra@npm:11.3.0" dependencies: @@ -3372,7 +3364,7 @@ __metadata: languageName: node linkType: hard -"jsonschema@npm:^1.4.1": +"jsonschema@npm:^1.5.0": version: 1.5.0 resolution: "jsonschema@npm:1.5.0" checksum: 10c0/c24ddb8d741f02efc0da3ad9b597a275f6b595062903d3edbfaa535c3f9c4c98613df68da5cb6635ed9aeab30d658986fea61d7662fc5b2b92840d5a1e21235e @@ -4195,7 +4187,7 @@ __metadata: 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": +"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.7.1": version: 7.7.1 resolution: "semver@npm:7.7.1" bin: @@ -4415,7 +4407,7 @@ __metadata: languageName: node linkType: hard -"table@npm:^6.8.2": +"table@npm:^6.9.0": version: 6.9.0 resolution: "table@npm:6.9.0" dependencies: From c9bc3deed4b13a56a2f45b6abf4ade0c05d73fdf Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 27 Mar 2025 16:26:34 +0100 Subject: [PATCH 102/112] updated snapshot --- ...ine-embedded-linux-base-image.test.ts.snap | 24 ++++--------- .../codepipeline-embedded-linux.test.ts.snap | 36 +++++-------------- 2 files changed, 15 insertions(+), 45 deletions(-) diff --git a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap index e4acead..c5f1ded 100644 --- a/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux-base-image.test.ts.snap @@ -321,15 +321,9 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Effect": "Allow", "Principal": { "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::111111111111:root", - ], + "Fn::GetAtt": [ + "CodePipelineBuildBaseImageCodePipelineRole73E36B25", + "Arn", ], }, }, @@ -545,15 +539,9 @@ exports[`EmbeddedLinuxCodePipelineBaseImageStack Snapshot 1`] = ` "Effect": "Allow", "Principal": { "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::111111111111:root", - ], + "Fn::GetAtt": [ + "CodePipelineBuildBaseImageCodePipelineRole73E36B25", + "Arn", ], }, }, diff --git a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap index 376c99d..2190b4c 100644 --- a/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap +++ b/test/__snapshots__/codepipeline-embedded-linux.test.ts.snap @@ -425,15 +425,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Principal": { "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::111111111111:root", - ], + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineRole784D6893", + "Arn", ], }, }, @@ -845,15 +839,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Principal": { "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::111111111111:root", - ], + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineRole784D6893", + "Arn", ], }, }, @@ -1630,15 +1618,9 @@ exports[`EmbeddedLinuxCodePipelineStack Snapshot 1`] = ` "Effect": "Allow", "Principal": { "AWS": { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition", - }, - ":iam::111111111111:root", - ], + "Fn::GetAtt": [ + "EmbeddedLinuxCodePipelineRole784D6893", + "Arn", ], }, }, From 01a1517b77499a2df637600916bd65b5a12a8e7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 07:14:13 +0000 Subject: [PATCH 103/112] Bump cdk-nag from 2.35.56 to 2.35.59 Bumps [cdk-nag](https://github.com/cdklabs/cdk-nag) from 2.35.56 to 2.35.59. - [Release notes](https://github.com/cdklabs/cdk-nag/releases) - [Commits](https://github.com/cdklabs/cdk-nag/compare/v2.35.56...v2.35.59) --- updated-dependencies: - dependency-name: cdk-nag dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e043e8d..b24f68e 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/parser": "^8.18.0", "aws-cdk": "^2.1006.0", - "cdk-nag": "^2.35.0", + "cdk-nag": "^2.35.59", "eslint": "^9.16.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", diff --git a/yarn.lock b/yarn.lock index 2c73bfd..3ea4312 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1512,7 +1512,7 @@ __metadata: "@typescript-eslint/parser": "npm:^8.18.0" aws-cdk: "npm:^2.1006.0" aws-cdk-lib: "npm:^2.186.0" - cdk-nag: "npm:^2.35.0" + cdk-nag: "npm:^2.35.59" constructs: "npm:^10.4.2" eslint: "npm:^9.16.0" eslint-config-prettier: "npm:^9.1.0" @@ -1738,13 +1738,13 @@ __metadata: languageName: node linkType: hard -"cdk-nag@npm:^2.35.0": - version: 2.35.56 - resolution: "cdk-nag@npm:2.35.56" +"cdk-nag@npm:^2.35.59": + version: 2.35.59 + resolution: "cdk-nag@npm:2.35.59" peerDependencies: aws-cdk-lib: ^2.156.0 constructs: ^10.0.5 - checksum: 10c0/7707908e3ebfde42af327f9f84bdf21b068d55db440d13010dd73d1ebce831f500f8084a488cff9319dd9169128a61113aeab4e2bb33ac8374e4cbf40883b549 + checksum: 10c0/601cedb01944cc9b182b2b6cc63a4c404d48311debf23dfa5877446595e306443006db568da107faa4b3ad63fddf91707a1a72f78d082bdbbf7ebac0db4b4c3a languageName: node linkType: hard From 6bfe0720dfc8ed3282e895b9d119acb0b516ac15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 07:14:49 +0000 Subject: [PATCH 104/112] Bump @types/node from 20.14.8 to 22.13.14 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.14.8 to 22.13.14. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 20 ++------------------ 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index e043e8d..fd4deab 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.16.0", "@types/jest": "^29.5.14", - "@types/node": "20.14.8", + "@types/node": "22.13.14", "@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/parser": "^8.18.0", "aws-cdk": "^2.1006.0", diff --git a/yarn.lock b/yarn.lock index 2c73bfd..c9fd020 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1145,7 +1145,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*": +"@types/node@npm:*, @types/node@npm:22.13.14": version: 22.13.14 resolution: "@types/node@npm:22.13.14" dependencies: @@ -1154,15 +1154,6 @@ __metadata: 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" @@ -1507,7 +1498,7 @@ __metadata: "@eslint/eslintrc": "npm:^3.2.0" "@eslint/js": "npm:^9.16.0" "@types/jest": "npm:^29.5.14" - "@types/node": "npm:20.14.8" + "@types/node": "npm:22.13.14" "@typescript-eslint/eslint-plugin": "npm:^8.18.0" "@typescript-eslint/parser": "npm:^8.18.0" aws-cdk: "npm:^2.1006.0" @@ -4641,13 +4632,6 @@ __metadata: 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" From 797b8d0c7ac863acd23586ec0f47b499dce43f6a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Apr 2025 04:41:23 +0000 Subject: [PATCH 105/112] Bump aws-cdk-lib from 2.186.0 to 2.187.0 in the npm_and_yarn group Bumps the npm_and_yarn group with 1 update: [aws-cdk-lib](https://github.com/aws/aws-cdk/tree/HEAD/packages/aws-cdk-lib). Updates `aws-cdk-lib` from 2.186.0 to 2.187.0 - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.alpha.md) - [Commits](https://github.com/aws/aws-cdk/commits/v2.187.0/packages/aws-cdk-lib) --- updated-dependencies: - dependency-name: aws-cdk-lib dependency-version: 2.187.0 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 30 +++++++++++++++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 9c3efeb..c8eb5ff 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "preformat": "yarn clean" }, "dependencies": { - "aws-cdk-lib": "^2.186.0", + "aws-cdk-lib": "^2.187.0", "constructs": "^10.4.2" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 1804066..e73d50c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,10 +15,10 @@ __metadata: languageName: node linkType: hard -"@aws-cdk/asset-awscli-v1@npm:^2.2.227": - version: 2.2.229 - resolution: "@aws-cdk/asset-awscli-v1@npm:2.2.229" - checksum: 10c0/24a7ef8c49318bb6b177db90b63d407c0e5954fa785ffaa64a0055290361cc61610d9ad2df18d41fe13977be0f70222435ca0fcc2d75339e2f89453a7b37c545 +"@aws-cdk/asset-awscli-v1@npm:^2.2.229": + version: 2.2.230 + resolution: "@aws-cdk/asset-awscli-v1@npm:2.2.230" + checksum: 10c0/4a43bdaffaabed33f4fba2cca46dfea6dac22e8379b61f15c6d5f2560b54eb5c2b10da123c0bf328292998cd5dc1dcab69a8599a064299384e69d5f8f39afd33 languageName: node linkType: hard @@ -29,13 +29,13 @@ __metadata: languageName: node linkType: hard -"@aws-cdk/cloud-assembly-schema@npm:^40.7.0": - version: 40.7.0 - resolution: "@aws-cdk/cloud-assembly-schema@npm:40.7.0" +"@aws-cdk/cloud-assembly-schema@npm:^41.0.0": + version: 41.2.0 + resolution: "@aws-cdk/cloud-assembly-schema@npm:41.2.0" dependencies: jsonschema: "npm:~1.4.1" semver: "npm:^7.7.1" - checksum: 10c0/d7bac318e1cb215119d903b885aa3b2cfd1757b1ed6c7b065a873cd0b2e47b66447dd7713a07611a6dfd8f3f3781ec2ce2802c763e7bef1adb99730ea098b4b7 + checksum: 10c0/b62e580878d7f969f32a74982c6f449372538368180e017312948bd727b53f2c3e909f232b2238cac94190a12cfa098ecbdebeddf29b8119e5a794a9b1754793 languageName: node linkType: hard @@ -1452,13 +1452,13 @@ __metadata: languageName: node linkType: hard -"aws-cdk-lib@npm:^2.186.0": - version: 2.186.0 - resolution: "aws-cdk-lib@npm:2.186.0" +"aws-cdk-lib@npm:^2.187.0": + version: 2.188.0 + resolution: "aws-cdk-lib@npm:2.188.0" dependencies: - "@aws-cdk/asset-awscli-v1": "npm:^2.2.227" + "@aws-cdk/asset-awscli-v1": "npm:^2.2.229" "@aws-cdk/asset-node-proxy-agent-v6": "npm:^2.1.0" - "@aws-cdk/cloud-assembly-schema": "npm:^40.7.0" + "@aws-cdk/cloud-assembly-schema": "npm:^41.0.0" "@balena/dockerignore": "npm:^1.0.2" case: "npm:1.6.3" fs-extra: "npm:^11.3.0" @@ -1472,7 +1472,7 @@ __metadata: yaml: "npm:1.10.2" peerDependencies: constructs: ^10.0.0 - checksum: 10c0/ad478a9b7ca1c50e3d67eb5428e08cb2017c56e501ff5b30fe93d8841e18fe282f35b9595e474e663ed9bd4f2d92c26a597c56ec4f436a7553ecacc2c8a58a15 + checksum: 10c0/92d477f527f0a8cf1892ab587a90678a93d3de5b1224e4609451d569ee4f425ecd4b9b662cc8ea863b4edc03cdf0ff5bc442ab7e699a914ca89ea0a43a43ec35 languageName: node linkType: hard @@ -1502,7 +1502,7 @@ __metadata: "@typescript-eslint/eslint-plugin": "npm:^8.18.0" "@typescript-eslint/parser": "npm:^8.18.0" aws-cdk: "npm:^2.1006.0" - aws-cdk-lib: "npm:^2.186.0" + aws-cdk-lib: "npm:^2.187.0" cdk-nag: "npm:^2.35.59" constructs: "npm:^10.4.2" eslint: "npm:^9.16.0" From 67a39d9271b9a061df2d070beb32fd21fc89fcaa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Apr 2025 04:41:57 +0000 Subject: [PATCH 106/112] Bump eslint-config-prettier from 9.1.0 to 10.1.1 Bumps [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier) from 9.1.0 to 10.1.1. - [Release notes](https://github.com/prettier/eslint-config-prettier/releases) - [Changelog](https://github.com/prettier/eslint-config-prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/eslint-config-prettier/compare/v9.1.0...v10.1.1) --- updated-dependencies: - dependency-name: eslint-config-prettier dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 9c3efeb..6f6db0b 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "aws-cdk": "^2.1006.0", "cdk-nag": "^2.35.59", "eslint": "^9.16.0", - "eslint-config-prettier": "^9.1.0", + "eslint-config-prettier": "^10.1.1", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-tsdoc": "^0.4.0", diff --git a/yarn.lock b/yarn.lock index 1804066..17258ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1506,7 +1506,7 @@ __metadata: cdk-nag: "npm:^2.35.59" constructs: "npm:^10.4.2" eslint: "npm:^9.16.0" - eslint-config-prettier: "npm:^9.1.0" + eslint-config-prettier: "npm:^10.1.1" eslint-plugin-prettier: "npm:^5.2.1" eslint-plugin-simple-import-sort: "npm:^12.1.1" eslint-plugin-tsdoc: "npm:^0.4.0" @@ -2025,14 +2025,14 @@ __metadata: languageName: node linkType: hard -"eslint-config-prettier@npm:^9.1.0": - version: 9.1.0 - resolution: "eslint-config-prettier@npm:9.1.0" +"eslint-config-prettier@npm:^10.1.1": + version: 10.1.1 + resolution: "eslint-config-prettier@npm:10.1.1" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 10c0/6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d + checksum: 10c0/3dbfdf6495dd62e2e1644ea9e8e978100dabcd8740fd264df1222d130001a1e8de05d6ed6c67d3a60727386a07507f067d1ca79af6d546910414beab19e7966e languageName: node linkType: hard From 2dd61619cf2a264e21c69360e1f9f90c662ebe56 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 07:20:47 +0000 Subject: [PATCH 107/112] Bump @eslint/js from 9.23.0 to 9.24.0 Bumps [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) from 9.23.0 to 9.24.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/commits/v9.24.0/packages/js) --- updated-dependencies: - dependency-name: "@eslint/js" dependency-version: 9.24.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 8bf6fb0..eac1a49 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "devDependencies": { "@eslint/compat": "^1.2.4", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "^9.16.0", + "@eslint/js": "^9.24.0", "@types/jest": "^29.5.14", "@types/node": "22.13.14", "@typescript-eslint/eslint-plugin": "^8.18.0", diff --git a/yarn.lock b/yarn.lock index cb1b5b4..d4847ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -498,13 +498,20 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.23.0, @eslint/js@npm:^9.16.0": +"@eslint/js@npm:9.23.0": version: 9.23.0 resolution: "@eslint/js@npm:9.23.0" checksum: 10c0/4e70869372b6325389e0ab51cac6d3062689807d1cef2c3434857571422ce11dde3c62777af85c382b9f94d937127598d605d2086787f08611351bf99faded81 languageName: node linkType: hard +"@eslint/js@npm:^9.24.0": + version: 9.24.0 + resolution: "@eslint/js@npm:9.24.0" + checksum: 10c0/efe22e29469e4140ac3e2916be8143b1bcfd1084a6edf692b7a58a3e54949d53c67f7f979bc0a811db134d9cc1e7bff8aa71ef1376b47eecd7e226b71206bb36 + languageName: node + linkType: hard + "@eslint/object-schema@npm:^2.1.6": version: 2.1.6 resolution: "@eslint/object-schema@npm:2.1.6" @@ -1496,7 +1503,7 @@ __metadata: dependencies: "@eslint/compat": "npm:^1.2.4" "@eslint/eslintrc": "npm:^3.2.0" - "@eslint/js": "npm:^9.16.0" + "@eslint/js": "npm:^9.24.0" "@types/jest": "npm:^29.5.14" "@types/node": "npm:22.13.14" "@typescript-eslint/eslint-plugin": "npm:^8.18.0" From 596de45b48aab244d0d66bd852430dda23c994ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 07:23:05 +0000 Subject: [PATCH 108/112] Bump eslint-plugin-prettier from 5.2.5 to 5.2.6 Bumps [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) from 5.2.5 to 5.2.6. - [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases) - [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/eslint-plugin-prettier/compare/v5.2.5...v5.2.6) --- updated-dependencies: - dependency-name: eslint-plugin-prettier dependency-version: 5.2.6 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 8bf6fb0..e9ed144 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "cdk-nag": "^2.35.59", "eslint": "^9.16.0", "eslint-config-prettier": "^10.1.1", - "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-prettier": "^5.2.6", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-tsdoc": "^0.4.0", "globals": "^16.0.0", diff --git a/yarn.lock b/yarn.lock index cb1b5b4..6e889a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1507,7 +1507,7 @@ __metadata: constructs: "npm:^10.4.2" eslint: "npm:^9.16.0" eslint-config-prettier: "npm:^10.1.1" - eslint-plugin-prettier: "npm:^5.2.1" + eslint-plugin-prettier: "npm:^5.2.6" eslint-plugin-simple-import-sort: "npm:^12.1.1" eslint-plugin-tsdoc: "npm:^0.4.0" globals: "npm:^16.0.0" @@ -2036,12 +2036,12 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-prettier@npm:^5.2.1": - version: 5.2.5 - resolution: "eslint-plugin-prettier@npm:5.2.5" +"eslint-plugin-prettier@npm:^5.2.6": + version: 5.2.6 + resolution: "eslint-plugin-prettier@npm:5.2.6" dependencies: prettier-linter-helpers: "npm:^1.0.0" - synckit: "npm:^0.10.2" + synckit: "npm:^0.11.0" peerDependencies: "@types/eslint": ">=8.0.0" eslint: ">=8.0.0" @@ -2052,7 +2052,7 @@ __metadata: optional: true eslint-config-prettier: optional: true - checksum: 10c0/b88d4ecfccfdea786aa8c2df8c6b52754070fec48ef5df0dcd325daf7cbe01730a96fb6a8c5ae0ddd173472b43704d6452169b058284e842dfee5894172f310b + checksum: 10c0/9911740a5edac7933d92671381908671c61ffa32a3cee7aed667ebab89831ee2c0b69eb9530f68dbe172ca9d4b3fa3d47350762dc1eb096a3ce125fa31c0e616 languageName: node linkType: hard @@ -4388,13 +4388,13 @@ __metadata: languageName: node linkType: hard -"synckit@npm:^0.10.2": - version: 0.10.3 - resolution: "synckit@npm:0.10.3" +"synckit@npm:^0.11.0": + version: 0.11.2 + resolution: "synckit@npm:0.11.2" dependencies: "@pkgr/core": "npm:^0.2.0" tslib: "npm:^2.8.1" - checksum: 10c0/9855d10231ae9b69c3aa08d46c96bd4befdcac33da44e29fb80e5c1430e453b5a33b8c073cdd25cfe9578f1d625c7d60c394ece1e202237116c1484def614041 + checksum: 10c0/e7744abce8041233d6be40c05dcbff6177aec88f2625a586a01855aa97757d3b6c640714e0c73eed917a382bd76eb815d4af66ca80ca8f94f880fd4dfb9429c6 languageName: node linkType: hard From 8e9275b5e677e27365efa2de32a68bd645f7ec63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 07:24:18 +0000 Subject: [PATCH 109/112] Bump typedoc from 0.28.1 to 0.28.2 Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.28.1 to 0.28.2. - [Release notes](https://github.com/TypeStrong/TypeDoc/releases) - [Changelog](https://github.com/TypeStrong/typedoc/blob/master/CHANGELOG.md) - [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.28.1...v0.28.2) --- updated-dependencies: - dependency-name: typedoc dependency-version: 0.28.2 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 50 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 8bf6fb0..831838c 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "prettier": "^3.4.2", "ts-jest": "^29.2.5", "ts-node": "^10.9.2", - "typedoc": "^0.28.1", + "typedoc": "^0.28.2", "typescript": "~5.8.2", "typescript-eslint": "^8.18.0" }, diff --git a/yarn.lock b/yarn.lock index cb1b5b4..1ea0a2e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -522,14 +522,16 @@ __metadata: languageName: node linkType: hard -"@gerrit0/mini-shiki@npm:^3.2.1": - version: 3.2.1 - resolution: "@gerrit0/mini-shiki@npm:3.2.1" +"@gerrit0/mini-shiki@npm:^3.2.2": + version: 3.2.2 + resolution: "@gerrit0/mini-shiki@npm:3.2.2" dependencies: "@shikijs/engine-oniguruma": "npm:^3.2.1" + "@shikijs/langs": "npm:^3.2.1" + "@shikijs/themes": "npm:^3.2.1" "@shikijs/types": "npm:^3.2.1" "@shikijs/vscode-textmate": "npm:^10.0.2" - checksum: 10c0/57ca704172fa203bdad8bd03ed059463b9a9e7fb46c6c288aca6619a6b3ea2663eba44ee528247175ac63e0fe4192e3e1d871627aadbd77651370c2447296b6a + checksum: 10c0/0714ddea5a3d727b7b8a517f01b45a03f4134c8716b435a92d3087d2ab657ec0488c5da9416159a74835f2eef6b44982190707a1ae9c31ac38ba6acf63b51dd1 languageName: node linkType: hard @@ -967,6 +969,24 @@ __metadata: languageName: node linkType: hard +"@shikijs/langs@npm:^3.2.1": + version: 3.2.1 + resolution: "@shikijs/langs@npm:3.2.1" + dependencies: + "@shikijs/types": "npm:3.2.1" + checksum: 10c0/8a4e8c066795f1e96686bee271ad9783febcb1cece2ebb9815dfb3d59c856ac869cf9dddc7d90cbcd186a782ddc0628b37486fcc4a46516be6825907f0e74178 + languageName: node + linkType: hard + +"@shikijs/themes@npm:^3.2.1": + version: 3.2.1 + resolution: "@shikijs/themes@npm:3.2.1" + dependencies: + "@shikijs/types": "npm:3.2.1" + checksum: 10c0/674aae42244832142f584037504ab102dc141f9918f5b11b62aa0dc1abb6a763daf74f86124ae5f2362116dd095b5fc62c9a249aa8c14fdae847e5b8b955b11b + languageName: node + linkType: hard + "@shikijs/types@npm:3.2.1, @shikijs/types@npm:^3.2.1": version: 3.2.1 resolution: "@shikijs/types@npm:3.2.1" @@ -1515,7 +1535,7 @@ __metadata: prettier: "npm:^3.4.2" ts-jest: "npm:^29.2.5" ts-node: "npm:^10.9.2" - typedoc: "npm:^0.28.1" + typedoc: "npm:^0.28.2" typescript: "npm:~5.8.2" typescript-eslint: "npm:^8.18.0" languageName: unknown @@ -4574,20 +4594,20 @@ __metadata: languageName: node linkType: hard -"typedoc@npm:^0.28.1": - version: 0.28.1 - resolution: "typedoc@npm:0.28.1" +"typedoc@npm:^0.28.2": + version: 0.28.2 + resolution: "typedoc@npm:0.28.2" dependencies: - "@gerrit0/mini-shiki": "npm:^3.2.1" + "@gerrit0/mini-shiki": "npm:^3.2.2" lunr: "npm:^2.3.9" markdown-it: "npm:^14.1.0" minimatch: "npm:^9.0.5" - yaml: "npm:^2.7.0 " + yaml: "npm:^2.7.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 || 5.8.x bin: typedoc: bin/typedoc - checksum: 10c0/9932b28a7bcfebc523d9bd32c6a97bdb6a87556921a68ba9bf6792ce87ba964c7d5af0eebd954a6ecb6bbbc5bbc9282a7554c71e5fc201642a4b87bbb0443369 + checksum: 10c0/5864419daf8e77423971cff48b94a4b0e9e3f4459a30b784508d59b6c7cb10ee9bc0a413a933c286c59c1a974137a0301daf72d30d0e6aefb7f53534e9369d5c languageName: node linkType: hard @@ -4799,12 +4819,12 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.7.0 ": - version: 2.7.0 - resolution: "yaml@npm:2.7.0" +"yaml@npm:^2.7.1": + version: 2.7.1 + resolution: "yaml@npm:2.7.1" bin: yaml: bin.mjs - checksum: 10c0/886a7d2abbd70704b79f1d2d05fe9fb0aa63aefb86e1cb9991837dced65193d300f5554747a872b4b10ae9a12bc5d5327e4d04205f70336e863e35e89d8f4ea9 + checksum: 10c0/ee2126398ab7d1fdde566b4013b68e36930b9e6d8e68b6db356875c99614c10d678b6f45597a145ff6d63814961221fc305bf9242af8bf7450177f8a68537590 languageName: node linkType: hard From e78d4ee12c1033be4841bc8a0bc21ddba29b20ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 07:16:53 +0000 Subject: [PATCH 110/112] Bump cdk-nag from 2.35.59 to 2.35.69 Bumps [cdk-nag](https://github.com/cdklabs/cdk-nag) from 2.35.59 to 2.35.69. - [Release notes](https://github.com/cdklabs/cdk-nag/releases) - [Commits](https://github.com/cdklabs/cdk-nag/compare/v2.35.59...v2.35.69) --- updated-dependencies: - dependency-name: cdk-nag dependency-version: 2.35.69 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 8bf6fb0..59e9437 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@typescript-eslint/eslint-plugin": "^8.18.0", "@typescript-eslint/parser": "^8.18.0", "aws-cdk": "^2.1006.0", - "cdk-nag": "^2.35.59", + "cdk-nag": "^2.35.69", "eslint": "^9.16.0", "eslint-config-prettier": "^10.1.1", "eslint-plugin-prettier": "^5.2.1", diff --git a/yarn.lock b/yarn.lock index cb1b5b4..aeaf1fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1503,7 +1503,7 @@ __metadata: "@typescript-eslint/parser": "npm:^8.18.0" aws-cdk: "npm:^2.1006.0" aws-cdk-lib: "npm:^2.187.0" - cdk-nag: "npm:^2.35.59" + cdk-nag: "npm:^2.35.69" constructs: "npm:^10.4.2" eslint: "npm:^9.16.0" eslint-config-prettier: "npm:^10.1.1" @@ -1729,13 +1729,13 @@ __metadata: languageName: node linkType: hard -"cdk-nag@npm:^2.35.59": - version: 2.35.59 - resolution: "cdk-nag@npm:2.35.59" +"cdk-nag@npm:^2.35.69": + version: 2.35.69 + resolution: "cdk-nag@npm:2.35.69" peerDependencies: aws-cdk-lib: ^2.156.0 constructs: ^10.0.5 - checksum: 10c0/601cedb01944cc9b182b2b6cc63a4c404d48311debf23dfa5877446595e306443006db568da107faa4b3ad63fddf91707a1a72f78d082bdbbf7ebac0db4b4c3a + checksum: 10c0/eeaab851c0f89055e7aa297d4a2f13bf949614230a9a55ae29491cc7ea9e30880a7474b1bd94089769a423e5432a9e576e22f8b79f0a49c79d5bcdb6932dc3b4 languageName: node linkType: hard From e02c120f101d74e698dd804b88f90a53cb395578 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Apr 2025 13:03:56 +0000 Subject: [PATCH 111/112] Bump aws-cdk-lib from 2.188.0 to 2.189.0 in the npm_and_yarn group Bumps the npm_and_yarn group with 1 update: [aws-cdk-lib](https://github.com/aws/aws-cdk/tree/HEAD/packages/aws-cdk-lib). Updates `aws-cdk-lib` from 2.188.0 to 2.189.0 - [Release notes](https://github.com/aws/aws-cdk/releases) - [Changelog](https://github.com/aws/aws-cdk/blob/main/CHANGELOG.v2.alpha.md) - [Commits](https://github.com/aws/aws-cdk/commits/v2.189.0/packages/aws-cdk-lib) --- updated-dependencies: - dependency-name: aws-cdk-lib dependency-version: 2.189.0 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index eafc21f..959b2f7 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "preformat": "yarn clean" }, "dependencies": { - "aws-cdk-lib": "^2.187.0", + "aws-cdk-lib": "^2.189.0", "constructs": "^10.4.2" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 518400f..f632b2d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1472,9 +1472,9 @@ __metadata: languageName: node linkType: hard -"aws-cdk-lib@npm:^2.187.0": - version: 2.188.0 - resolution: "aws-cdk-lib@npm:2.188.0" +"aws-cdk-lib@npm:^2.189.0": + version: 2.189.1 + resolution: "aws-cdk-lib@npm:2.189.1" dependencies: "@aws-cdk/asset-awscli-v1": "npm:^2.2.229" "@aws-cdk/asset-node-proxy-agent-v6": "npm:^2.1.0" @@ -1492,7 +1492,7 @@ __metadata: yaml: "npm:1.10.2" peerDependencies: constructs: ^10.0.0 - checksum: 10c0/92d477f527f0a8cf1892ab587a90678a93d3de5b1224e4609451d569ee4f425ecd4b9b662cc8ea863b4edc03cdf0ff5bc442ab7e699a914ca89ea0a43a43ec35 + checksum: 10c0/6603cc1756f10e8046627c975a15a35b95ed33bd20adf97d4838b52a5e3594e604cfe89be622fbbb7ab34559ca0584c146aab452fdb6d7222dc4f1f0469665cc languageName: node linkType: hard @@ -1522,7 +1522,7 @@ __metadata: "@typescript-eslint/eslint-plugin": "npm:^8.18.0" "@typescript-eslint/parser": "npm:^8.18.0" aws-cdk: "npm:^2.1006.0" - aws-cdk-lib: "npm:^2.187.0" + aws-cdk-lib: "npm:^2.189.0" cdk-nag: "npm:^2.35.69" constructs: "npm:^10.4.2" eslint: "npm:^9.16.0" From 9541d9fe866bbd9e5fe65415e09ae6d65551043c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Apr 2025 13:06:36 +0000 Subject: [PATCH 112/112] Bump eslint from 9.23.0 to 9.24.0 Bumps [eslint](https://github.com/eslint/eslint) from 9.23.0 to 9.24.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.23.0...v9.24.0) --- updated-dependencies: - dependency-name: eslint dependency-version: 9.24.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 31 ++++++++++++------------------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 9050bbf..2e830cd 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@typescript-eslint/parser": "^8.18.0", "aws-cdk": "^2.1006.0", "cdk-nag": "^2.35.69", - "eslint": "^9.16.0", + "eslint": "^9.24.0", "eslint-config-prettier": "^10.1.1", "eslint-plugin-prettier": "^5.2.6", "eslint-plugin-simple-import-sort": "^12.1.1", diff --git a/yarn.lock b/yarn.lock index 72f5999..b2e8496 100644 --- a/yarn.lock +++ b/yarn.lock @@ -454,14 +454,14 @@ __metadata: languageName: node linkType: hard -"@eslint/config-array@npm:^0.19.2": - version: 0.19.2 - resolution: "@eslint/config-array@npm:0.19.2" +"@eslint/config-array@npm:^0.20.0": + version: 0.20.0 + resolution: "@eslint/config-array@npm:0.20.0" dependencies: "@eslint/object-schema": "npm:^2.1.6" debug: "npm:^4.3.1" minimatch: "npm:^3.1.2" - checksum: 10c0/dd68da9abb32d336233ac4fe0db1e15a0a8d794b6e69abb9e57545d746a97f6f542496ff9db0d7e27fab1438546250d810d90b1904ac67677215b8d8e7573f3d + checksum: 10c0/94bc5d0abb96dc5295ff559925242ff75a54eacfb3576677e95917e42f7175e1c4b87bf039aa2a872f949b4852ad9724bf2f7529aaea6b98f28bb3fca7f1d659 languageName: node linkType: hard @@ -498,14 +498,7 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.23.0": - version: 9.23.0 - resolution: "@eslint/js@npm:9.23.0" - checksum: 10c0/4e70869372b6325389e0ab51cac6d3062689807d1cef2c3434857571422ce11dde3c62777af85c382b9f94d937127598d605d2086787f08611351bf99faded81 - languageName: node - linkType: hard - -"@eslint/js@npm:^9.24.0": +"@eslint/js@npm:9.24.0, @eslint/js@npm:^9.24.0": version: 9.24.0 resolution: "@eslint/js@npm:9.24.0" checksum: 10c0/efe22e29469e4140ac3e2916be8143b1bcfd1084a6edf692b7a58a3e54949d53c67f7f979bc0a811db134d9cc1e7bff8aa71ef1376b47eecd7e226b71206bb36 @@ -1532,7 +1525,7 @@ __metadata: aws-cdk-lib: "npm:^2.189.0" cdk-nag: "npm:^2.35.69" constructs: "npm:^10.4.2" - eslint: "npm:^9.16.0" + eslint: "npm:^9.24.0" eslint-config-prettier: "npm:^10.1.1" eslint-plugin-prettier: "npm:^5.2.6" eslint-plugin-simple-import-sort: "npm:^12.1.1" @@ -2126,17 +2119,17 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^9.16.0": - version: 9.23.0 - resolution: "eslint@npm:9.23.0" +"eslint@npm:^9.24.0": + version: 9.24.0 + resolution: "eslint@npm:9.24.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.12.1" - "@eslint/config-array": "npm:^0.19.2" + "@eslint/config-array": "npm:^0.20.0" "@eslint/config-helpers": "npm:^0.2.0" "@eslint/core": "npm:^0.12.0" "@eslint/eslintrc": "npm:^3.3.1" - "@eslint/js": "npm:9.23.0" + "@eslint/js": "npm:9.24.0" "@eslint/plugin-kit": "npm:^0.2.7" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" @@ -2172,7 +2165,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/9616c308dfa8d09db8ae51019c87d5d05933742214531b077bd6ab618baab3bec7938256c14dcad4dc47f5ba93feb0bc5e089f68799f076374ddea21b6a9be45 + checksum: 10c0/f758ff1b9d2f2af5335f562f3f40aa8f71607b3edca33f7616840a222ed224555aeb3ac6943cc86e4f9ac5dc124a60bbfde624d054fb235631a8c04447e39ecc languageName: node linkType: hard