From 6b4d1cac1a34b3e9bc00fb1e781f3c342d715eb3 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 12 Dec 2024 12:04:31 +0100 Subject: [PATCH 01/13] updating eslint config --- .eslintignore | 8 -------- .eslintrc.js | 16 +++++++++++++--- eslint.config.mjs | 13 +++++++++++++ 3 files changed, 26 insertions(+), 11 deletions(-) delete mode 100644 .eslintignore create mode 100644 eslint.config.mjs diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 8f1ef3d..0000000 --- a/.eslintignore +++ /dev/null @@ -1,8 +0,0 @@ -npm_modules/ -dist/ -cdk.out/ -.eslintrc.js -package.json -package-lock.json -tsconfig.json -typedoc.json diff --git a/.eslintrc.js b/.eslintrc.js index 32448fe..395915c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -42,10 +42,10 @@ module.exports = { "@typescript-eslint/eslint-plugin", "eslint-plugin-tsdoc" ], - extends: [ + extends: [ 'plugin:@typescript-eslint/recommended' ], - parser: '@typescript-eslint/parser', + parser: '@typescript-eslint/parser', parserOptions: { project: "./tsconfig.json", tsconfigRootDir: __dirname, @@ -54,5 +54,15 @@ module.exports = { }, rules: { "tsdoc/syntax": "warn" - } + }, + ignorePatterns: [ + "npm_modules/", + "dist/", + "cdk.out/", + ".eslintrc.js", + "package.json", + "package-lock.json", + "tsconfig.json", + "typedoc.json" + ], }; diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..44dbdf9 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,13 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; +import tseslint from "typescript-eslint"; + + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + {files: ["**/*.{js,mjs,cjs,ts}"]}, + {files: ["**/*.js"], languageOptions: {sourceType: "commonjs"}}, + {languageOptions: { globals: globals.browser }}, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, +]; \ No newline at end of file From 421b512bfbe936ea0992d70e0e679d629cfa9204 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 12 Dec 2024 12:05:02 +0100 Subject: [PATCH 02/13] content formatting --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2b206aa..57bed19 100644 --- a/README.md +++ b/README.md @@ -46,11 +46,13 @@ The `cdk diff` command can be used to preview changes before deployment. This wi 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 ``` ### In your-project folder: + ```bash npm install npm link ../aws4embeddedlinux-ci @@ -65,7 +67,6 @@ or [set a node prefix](https://docs.npmjs.com/resolving-eacces-permissions-error - 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. - ## Security See [SECURITY](SECURITY.md) for more information about reporting issues with this project. @@ -79,10 +80,10 @@ source repos, etc. 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, @@ -100,6 +101,7 @@ const pipeline = new EmbeddedLinuxPipelineStack(app, "MyPokyPipeline", { 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: From 9e7a6b2eccb8c473c7c9c6c78b0938efd09ca18a Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 12 Dec 2024 12:40:34 +0100 Subject: [PATCH 03/13] npm package upgrade and peer dependency fix / obsolete package removal --- package-lock.json | 1503 ++++++++++++++++++++++++++------------------- package.json | 44 +- 2 files changed, 886 insertions(+), 661 deletions(-) diff --git a/package-lock.json b/package-lock.json index d7dd265..44c248f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,27 +6,31 @@ "packages": { "": { "name": "aws4embeddedlinux-cdk-lib", - "version": "0.1.4", + "version": "0.1.3", "devDependencies": { - "@types/jest": "^29.5.1", - "@types/node": "20.1.0", - "@typescript-eslint/eslint-plugin": "^5.59.6", - "@typescript-eslint/parser": "^5.59.6", - "aws-cdk-lib": "^2.170.0", - "cdk-nag": "^2.34.8", - "eslint": "^8.40.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-tsdoc": "^0.2.17", - "jest": "^29.5.0", - "prettier": "^2.8.8", - "ts-jest": "^29.1.0", - "ts-node": "^10.9.1", - "typedoc": "^0.24.8", - "typescript": "~5.0.4" + "@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.0", + "cdk-nag": "^2.34.23", + "constructs": "^10.4.2", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-tsdoc": "^0.4.0", + "globals": "^15.13.0", + "jest": "^29.7.0", + "prettier": "^3.4.2", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "typedoc": "^0.27.4", + "typescript": "~5.7.2", + "typescript-eslint": "^8.18.0" }, "peerDependencies": { - "aws-cdk-lib": "^2.170.0", + "aws-cdk-lib": "^2.173.0", "constructs": "^10.4.2" } }, @@ -45,9 +49,9 @@ } }, "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.210", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.210.tgz", - "integrity": "sha512-yxuGP52ZtdAGkcAik5mW79FKKv6yvc5QuCZbsKMyICk48alqs+ni7Iv2UnuGLkVSLh09+ixoHHu4o5rIv8X9jg==", + "version": "2.2.214", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.214.tgz", + "integrity": "sha512-JeuX1xoYWXEeFD4RyAyvv8OD/NPdbLD6leKKpFLECWqsKY1YrwX0U8lr753CskflwaDGpU42pyyjPdiMZ7NiWA==", "dev": true, "license": "Apache-2.0" }, @@ -117,9 +121,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", - "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "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": { @@ -168,14 +172,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "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.2", - "@babel/types": "^7.26.0", + "@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" @@ -298,13 +302,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", - "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "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.0" + "@babel/types": "^7.26.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -568,17 +572,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "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.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", + "@babel/types": "^7.26.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -597,9 +601,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "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": { @@ -670,17 +674,69 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "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/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", + "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", + "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": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "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": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -688,36 +744,130 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "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": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", + "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "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/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "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": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-oniguruma": "^1.24.2", + "@shikijs/types": "^1.24.2", + "@shikijs/vscode-textmate": "^9.3.0" + } + }, + "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": ">=10.10.0" + "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": { @@ -734,13 +884,19 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "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": "BSD-3-Clause" + "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", @@ -1152,9 +1308,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "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": { @@ -1205,25 +1361,49 @@ } }, "node_modules/@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "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.16.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", - "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "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.14.2", - "ajv": "~6.12.6", + "@microsoft/tsdoc": "0.15.1", + "ajv": "~8.12.0", "jju": "~1.4.0", - "resolve": "~1.19.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", @@ -1262,6 +1442,48 @@ "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", @@ -1362,6 +1584,13 @@ "@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", @@ -1372,6 +1601,16 @@ "@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", @@ -1418,18 +1657,14 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", - "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "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" + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/stack-utils": { "version": "2.0.3", @@ -1438,6 +1673,13 @@ "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", @@ -1456,80 +1698,72 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", + "@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", "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@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": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.0.tgz", + "integrity": "sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==", "dev": true, - "license": "BSD-2-Clause", + "license": "MITClause", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", + "@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", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1537,41 +1771,37 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz", + "integrity": "sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@typescript-eslint/typescript-estree": "8.18.0", + "@typescript-eslint/utils": "8.18.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", + "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1579,84 +1809,86 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", + "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", + "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@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" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", + "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.18.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "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": "ISC" + "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", @@ -1727,19 +1959,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/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/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1750,13 +1969,6 @@ "node": ">=8" } }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", - "dev": true, - "license": "MIT" - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1801,16 +2013,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", @@ -1819,9 +2021,9 @@ "license": "MIT" }, "node_modules/aws-cdk-lib": { - "version": "2.170.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.170.0.tgz", - "integrity": "sha512-hlfoOJUZmAY3TjOXjWhAYKlrPcfGNTXA24NirwkEYOX+t1HD8OLSrYZvluMc7nWgIZf1Mq1g6M0xNEZJqykPrA==", + "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==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -2328,14 +2530,13 @@ "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==", + "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", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -2435,9 +2636,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001677", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001677.tgz", - "integrity": "sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==", + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true, "funding": [ { @@ -2456,9 +2657,9 @@ "license": "CC-BY-4.0" }, "node_modules/cdk-nag": { - "version": "2.34.8", - "resolved": "https://registry.npmjs.org/cdk-nag/-/cdk-nag-2.34.8.tgz", - "integrity": "sha512-mmhLyMM7OWs6GB3nU4FkQcHkkKoAjGr0SePB7KQ0/yHWcu0neBpDv6/VyO27wCr7//TaqINUW+d0eiyzyfkqNw==", + "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": { @@ -2580,9 +2781,9 @@ "version": "10.4.2", "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.4.2.tgz", "integrity": "sha512-wsNxBlAott2qg8Zv87q3eYZYgheb9lchtBfjHzzLHtXbttwSrHPs1NNQbBrmbb1YZvYg2+Vh0Dor76w4mFxJkA==", - "license": "Apache-2.0", - "peer": true - }, + "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", @@ -2620,9 +2821,9 @@ "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "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": { @@ -2635,9 +2836,9 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "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": { @@ -2714,32 +2915,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", @@ -2757,9 +2932,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.52", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.52.tgz", - "integrity": "sha512-xtoijJTZ+qeucLBDNztDOuQBE1ksqjvNjvqFoST3nGC7fSpqJ+X6BdTBaY5BHG+IhWWmpc6b/KfpeuEDupEPOQ==", + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", "dev": true, "license": "ISC" }, @@ -2783,6 +2958,19 @@ "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", @@ -2817,66 +3005,69 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", + "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.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.16.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@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.2", + "cross-spawn": "^7.0.5", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "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": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "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": { @@ -2887,50 +3078,62 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "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" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" }, "engines": { - "node": ">=12.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" }, "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "@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.2.17", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.17.tgz", - "integrity": "sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==", + "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.14.2", - "@microsoft/tsdoc-config": "0.16.2" + "@microsoft/tsdoc": "0.15.1", + "@microsoft/tsdoc-config": "0.17.1" } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "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": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { @@ -2946,46 +3149,69 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "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": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, + "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", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "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": "BSD-2-Clause", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=4.0" + "node": "*" } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "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.9.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/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" @@ -3018,16 +3244,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/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/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -3041,7 +3257,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -3051,16 +3267,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "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", @@ -3200,16 +3406,16 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "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": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/filelist": { @@ -3222,16 +3428,6 @@ "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", @@ -3276,24 +3472,23 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "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.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "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" }, @@ -3373,22 +3568,19 @@ } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "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", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3407,38 +3599,30 @@ "node": ">=10.13.0" } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "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": "MIT", + "license": "ISC", "dependencies": { - "type-fest": "^0.20.2" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "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", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3555,25 +3739,6 @@ "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3650,16 +3815,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -3770,6 +3925,30 @@ "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", @@ -4153,24 +4332,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-resolve/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.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/jest-runner": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", @@ -4399,9 +4560,9 @@ } }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -4452,13 +4613,6 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -4510,6 +4664,16 @@ "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", @@ -4590,19 +4754,31 @@ "tmpl": "1.0.5" } }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "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", - "bin": { - "marked": "bin/marked.js" + "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" }, - "engines": { - "node": ">= 12" + "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", @@ -4645,16 +4821,29 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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": { @@ -4671,13 +4860,6 @@ "dev": true, "license": "MIT" }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "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", @@ -4686,9 +4868,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "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" }, @@ -4715,16 +4897,6 @@ "node": ">=8" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -4843,16 +5015,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -4870,14 +5032,38 @@ "dev": true, "license": "MIT" }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "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": "MIT", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">=8" + "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": { @@ -4990,16 +5176,16 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "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.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -5070,6 +5256,16 @@ "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", @@ -5125,15 +5321,29 @@ "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.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5173,9 +5383,9 @@ } }, "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "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": { @@ -5193,23 +5403,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5270,19 +5463,6 @@ "node": ">=8" } }, - "node_modules/shiki": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz", - "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -5459,6 +5639,23 @@ "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", @@ -5474,12 +5671,29 @@ "node": ">=8" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "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" + "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", @@ -5501,6 +5715,19 @@ "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", @@ -5595,28 +5822,12 @@ } }, "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "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/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -5641,9 +5852,9 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "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": { @@ -5654,66 +5865,78 @@ } }, "node_modules/typedoc": { - "version": "0.24.8", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.8.tgz", - "integrity": "sha512-ahJ6Cpcvxwaxfu4KtjA8qZNqS43wYt6JL27wYiIgl1vd38WW/KWX11YuAeZhuz9v+ttrutSsgK+XO1CjL1kA3w==", + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.4.tgz", + "integrity": "sha512-wXPQs1AYC2Crk+1XFpNuutLIkNWleokZf1UNf/X8w9KsMnirkvT+LzxTXDvfF6ug3TSLf3Xu5ZXRKGfoXPX7IA==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@gerrit0/mini-shiki": "^1.24.0", "lunr": "^2.3.9", - "marked": "^4.3.0", - "minimatch": "^9.0.0", - "shiki": "^0.14.1" + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "yaml": "^2.6.1" }, "bin": { "typedoc": "bin/typedoc" }, "engines": { - "node": ">= 14.14" + "node": ">= 18" }, "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.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" } }, - "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==", + "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": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" } }, - "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==", + "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==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "@typescript-eslint/eslint-plugin": "8.18.0", + "@typescript-eslint/parser": "8.18.0", + "@typescript-eslint/utils": "8.18.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "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": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "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": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } + "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", @@ -5778,20 +6001,6 @@ "node": ">=10.12.0" } }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true, - "license": "MIT" - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true, - "license": "MIT" - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -5846,13 +6055,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", @@ -5884,6 +6086,19 @@ "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", diff --git a/package.json b/package.json index 9c34d0d..495097d 100644 --- a/package.json +++ b/package.json @@ -19,25 +19,35 @@ "prepare": "npm run build" }, "devDependencies": { - "@types/jest": "^29.5.1", - "@types/node": "20.1.0", - "@typescript-eslint/eslint-plugin": "^5.59.6", - "@typescript-eslint/parser": "^5.59.6", - "aws-cdk-lib": "^2.170.0", - "cdk-nag": "^2.34.8", - "eslint": "^8.40.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-tsdoc": "^0.2.17", - "jest": "^29.5.0", - "prettier": "^2.8.8", - "ts-jest": "^29.1.0", - "ts-node": "^10.9.1", - "typedoc": "^0.24.8", - "typescript": "~5.0.4" + "@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.0", + "cdk-nag": "^2.34.23", + "constructs": "^10.4.2", + "eslint": "^9.16.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-tsdoc": "^0.4.0", + "globals": "^15.13.0", + "jest": "^29.7.0", + "prettier": "^3.4.2", + "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", + "typedoc": "^0.27.4", + "typescript": "~5.7.2", + "typescript-eslint": "^8.18.0" }, "peerDependencies": { - "aws-cdk-lib": "^2.170.0", + "aws-cdk-lib": "^2.173.0", "constructs": "^10.4.2" + }, + "resolutions": { + "glob": "^9.3.5" + }, + "overrides": { + "glob": "^9.3.5" } } From ba77a0963690b7c5a1667c0a280b3804a990682f Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 12 Dec 2024 13:11:12 +0100 Subject: [PATCH 04/13] code pipeline bucket needs to be versioned --- lib/build-image-data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/build-image-data.ts b/lib/build-image-data.ts index 7c69c8f..94c1cd2 100644 --- a/lib/build-image-data.ts +++ b/lib/build-image-data.ts @@ -51,7 +51,7 @@ export class BuildImageDataStack extends cdk.Stack { // Create a bucket, then allow a deployment Lambda to upload to it. const dataBucket = new s3.Bucket(this, 'BuildImageDataBucket', { bucketName, - versioned: false, + versioned: true, encryptionKey: encryptionKey, enforceSSL: true, serverAccessLogsBucket: accessLoggingBucket, From c155884f330f7816a12af062cc994c83dcdb1a8f Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 12 Dec 2024 13:49:53 +0100 Subject: [PATCH 05/13] reverting to versioned buckets --- lib/build-image-data.ts | 2 +- lib/build-image-pipeline.ts | 4 ++-- lib/embedded-linux-codebuild-project.ts | 2 +- lib/embedded-linux-pipeline.ts | 6 ++--- test/build-image-data.test.ts | 22 +++++++++--------- test/build-image-pipeline.test.ts | 6 ++--- test/embedded-linux-pipeline.test.ts | 30 ++++++++++++------------- 7 files changed, 36 insertions(+), 36 deletions(-) diff --git a/lib/build-image-data.ts b/lib/build-image-data.ts index 94c1cd2..f81da3b 100644 --- a/lib/build-image-data.ts +++ b/lib/build-image-data.ts @@ -37,7 +37,7 @@ export class BuildImageDataStack extends cdk.Stack { */ private createDeploymentBucket(bucketName: string): s3.IBucket { const accessLoggingBucket = new s3.Bucket(this, 'LoggingBucket', { - versioned: false, + versioned: true, enforceSSL: true, autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY, diff --git a/lib/build-image-pipeline.ts b/lib/build-image-pipeline.ts index b66a8d2..692940b 100644 --- a/lib/build-image-pipeline.ts +++ b/lib/build-image-pipeline.ts @@ -111,7 +111,7 @@ export class BuildImagePipelineStack extends cdk.Stack { accessLoggingBucket = props.accessLoggingBucket; } else { accessLoggingBucket = new s3.Bucket(this, 'ArtifactAccessLogging', { - versioned: false, + versioned: true, enforceSSL: true, autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY, @@ -128,7 +128,7 @@ export class BuildImagePipelineStack extends cdk.Stack { enableKeyRotation: true, }); artifactBucket = new s3.Bucket(this, 'PipelineArtifacts', { - versioned: false, + versioned: true, enforceSSL: true, serverAccessLogsBucket: accessLoggingBucket, serverAccessLogsPrefix: props.serverAccessLogsPrefix, diff --git a/lib/embedded-linux-codebuild-project.ts b/lib/embedded-linux-codebuild-project.ts index c4caea3..9105f52 100644 --- a/lib/embedded-linux-codebuild-project.ts +++ b/lib/embedded-linux-codebuild-project.ts @@ -94,7 +94,7 @@ export class EmbeddedLinuxCodebuildProjectStack extends cdk.Stack { accessLoggingBucket = props.accessLoggingBucket; } else { accessLoggingBucket = new s3.Bucket(this, "ArtifactAccessLogging", { - versioned: false, + versioned: true, enforceSSL: true, autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY, diff --git a/lib/embedded-linux-pipeline.ts b/lib/embedded-linux-pipeline.ts index 337b382..03b4ff7 100644 --- a/lib/embedded-linux-pipeline.ts +++ b/lib/embedded-linux-pipeline.ts @@ -96,7 +96,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { accessLoggingBucket = props.accessLoggingBucket; } else { accessLoggingBucket = new s3.Bucket(this, 'ArtifactAccessLogging', { - versioned: false, + versioned: true, enforceSSL: true, autoDeleteObjects: true, removalPolicy: RemovalPolicy.DESTROY, @@ -150,7 +150,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { outputBucket = props.outputBucket; } else { outputBucket = new s3.Bucket(this, 'PipelineOutput', { - versioned: false, + versioned: true, enforceSSL: true, serverAccessLogsBucket: accessLoggingBucket, autoDeleteObjects: true, @@ -169,7 +169,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { enableKeyRotation: true, }); artifactBucket = new s3.Bucket(this, 'PipelineArtifacts', { - versioned: false, + versioned: true, enforceSSL: true, serverAccessLogsBucket: accessLoggingBucket, encryptionKey, diff --git a/test/build-image-data.test.ts b/test/build-image-data.test.ts index a8e72dc..0f241d7 100644 --- a/test/build-image-data.test.ts +++ b/test/build-image-data.test.ts @@ -11,18 +11,18 @@ describe('Build Image Data', () => { env: { account: '111111111111', region: 'eu-central-1' }, }; - // test('S3 Bucket Has Versioning Disabled', () => { - // 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', - // }); + 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' }, - // }); - // }); + template.allResourcesProperties('AWS::S3::Bucket', { + VersioningConfiguration: { Status: 'Enabled' }, + }); + }); test('Snapshot', () => { const app = new cdk.App(); diff --git a/test/build-image-pipeline.test.ts b/test/build-image-pipeline.test.ts index 6eea433..76ccc21 100644 --- a/test/build-image-pipeline.test.ts +++ b/test/build-image-pipeline.test.ts @@ -30,9 +30,9 @@ describe('Build Image Pipeline', () => { template.allResourcesProperties('AWS::Logs::LogGroup', { RetentionInDays: 3653, }); - // template.allResourcesProperties('AWS::S3::Bucket', { - // VersioningConfiguration: { Status: 'Enabled' }, - // }); + template.allResourcesProperties('AWS::S3::Bucket', { + VersioningConfiguration: { Status: 'Enabled' }, + }); }); test('Snapshot', () => { diff --git a/test/embedded-linux-pipeline.test.ts b/test/embedded-linux-pipeline.test.ts index 9b30e68..d84a914 100644 --- a/test/embedded-linux-pipeline.test.ts +++ b/test/embedded-linux-pipeline.test.ts @@ -27,22 +27,22 @@ describe('Pipeline', () => { }); }); - // test('S3 Bucket Has Versioning Disabled', () => { - // 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', {}); + 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' }, - // }); - // }); + 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(); From 154e4c1add11a6fde6c05d0d0d8a0a93bd6e511b Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 12 Dec 2024 14:08:36 +0100 Subject: [PATCH 06/13] adjusting test cases results --- .../build-image-data.test.ts.snap | 6 ++++++ .../build-image-pipeline.test.ts.snap | 6 ++++++ .../embedded-linux-pipeline.test.ts.snap | 21 +++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/test/__snapshots__/build-image-data.test.ts.snap b/test/__snapshots__/build-image-data.test.ts.snap index 9b0bc19..3137bf0 100644 --- a/test/__snapshots__/build-image-data.test.ts.snap +++ b/test/__snapshots__/build-image-data.test.ts.snap @@ -247,6 +247,9 @@ exports[`Build Image Data Snapshot 1`] = ` "Value": "true", }, ], + "VersioningConfiguration": { + "Status": "Enabled", + }, }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Delete", @@ -442,6 +445,9 @@ exports[`Build Image Data Snapshot 1`] = ` "Value": "true", }, ], + "VersioningConfiguration": { + "Status": "Enabled", + }, }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Delete", diff --git a/test/__snapshots__/build-image-pipeline.test.ts.snap b/test/__snapshots__/build-image-pipeline.test.ts.snap index 7147a5a..61ea95d 100644 --- a/test/__snapshots__/build-image-pipeline.test.ts.snap +++ b/test/__snapshots__/build-image-pipeline.test.ts.snap @@ -46,6 +46,9 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Value": "true", }, ], + "VersioningConfiguration": { + "Status": "Enabled", + }, }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Delete", @@ -994,6 +997,9 @@ exports[`Build Image Pipeline Snapshot 1`] = ` "Value": "true", }, ], + "VersioningConfiguration": { + "Status": "Enabled", + }, }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Delete", diff --git a/test/__snapshots__/embedded-linux-pipeline.test.ts.snap b/test/__snapshots__/embedded-linux-pipeline.test.ts.snap index 0b5ce6c..f1f29b4 100644 --- a/test/__snapshots__/embedded-linux-pipeline.test.ts.snap +++ b/test/__snapshots__/embedded-linux-pipeline.test.ts.snap @@ -57,6 +57,9 @@ exports[`Pipeline Poky AMI Pipeline - check role name trim 1`] = ` "Value": "true", }, ], + "VersioningConfiguration": { + "Status": "Enabled", + }, }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Delete", @@ -2253,6 +2256,9 @@ def handler(event, context): "Value": "true", }, ], + "VersioningConfiguration": { + "Status": "Enabled", + }, }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Delete", @@ -2771,6 +2777,9 @@ exports[`Pipeline Snapshot Poky AMI Pipeline 1`] = ` "Value": "true", }, ], + "VersioningConfiguration": { + "Status": "Enabled", + }, }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Delete", @@ -4967,6 +4976,9 @@ def handler(event, context): "Value": "true", }, ], + "VersioningConfiguration": { + "Status": "Enabled", + }, }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Delete", @@ -5485,6 +5497,9 @@ exports[`Pipeline Snapshot Poky Pipeline 1`] = ` "Value": "true", }, ], + "VersioningConfiguration": { + "Status": "Enabled", + }, }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Delete", @@ -7442,6 +7457,9 @@ def handler(event, context): "Value": "true", }, ], + "VersioningConfiguration": { + "Status": "Enabled", + }, }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Delete", @@ -7573,6 +7591,9 @@ def handler(event, context): "Value": "true", }, ], + "VersioningConfiguration": { + "Status": "Enabled", + }, }, "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Delete", From cbef74d2b1f9092c20059c6520d16f4fc0e670ff Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 12 Dec 2024 16:24:15 +0100 Subject: [PATCH 07/13] changing version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 495097d..bebf23e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aws4embeddedlinux-cdk-lib", - "version": "0.1.3", + "version": "0.1.4", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts", "scripts": { From 11f8e8da2ecc048f21daa135251d9bdd582cade1 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Thu, 12 Dec 2024 16:48:10 +0100 Subject: [PATCH 08/13] adding cr at the end of file --- eslint.config.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 44dbdf9..ceba176 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -10,4 +10,4 @@ export default [ {languageOptions: { globals: globals.browser }}, pluginJs.configs.recommended, ...tseslint.configs.recommended, -]; \ No newline at end of file +]; From 562daa9c33f6380589840f37bf7b19a3351edd63 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 13 Dec 2024 13:32:29 +0100 Subject: [PATCH 09/13] eslint upgrade + fixing eslint issues --- .eslintrc.js | 68 -------- eslint.config.mjs | 91 +++++++++-- jest.config.js | 10 +- lib/build-image-pipeline.ts | 13 +- lib/embedded-linux-codebuild-project.ts | 188 +++++++++++------------ lib/embedded-linux-pipeline.ts | 46 +++--- package-lock.json | 24 ++- package.json | 2 + test/embedded-linux-pipeline-nag.test.ts | 3 +- tsconfig.json | 17 +- 10 files changed, 244 insertions(+), 218 deletions(-) delete mode 100644 .eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 395915c..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,68 +0,0 @@ -module.exports = { - env: { - browser: true, - es2021: true, - node: true, - jest: true, - }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended', - ], - overrides: [], - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - }, - plugins: ['@typescript-eslint'], - rules: { - 'max-len': [ - 'error', - { - code: 150, - ignoreUrls: true, - ignoreStrings: true, - ignoreTemplateLiterals: true, - ignoreComments: true, - ignoreRegExpLiterals: true, - }, - ], - 'prettier/prettier': [ - 'error', - { - singleQuote: true, // Eliminate escaping. - trailingComma: 'es5', // For simpler diffs - }, - ], - }, - root: true, - plugins: [ - "@typescript-eslint/eslint-plugin", - "eslint-plugin-tsdoc" - ], - extends: [ - 'plugin:@typescript-eslint/recommended' - ], - parser: '@typescript-eslint/parser', - parserOptions: { - project: "./tsconfig.json", - tsconfigRootDir: __dirname, - ecmaVersion: 2018, - sourceType: "module" - }, - rules: { - "tsdoc/syntax": "warn" - }, - ignorePatterns: [ - "npm_modules/", - "dist/", - "cdk.out/", - ".eslintrc.js", - "package.json", - "package-lock.json", - "tsconfig.json", - "typedoc.json" - ], -}; diff --git a/eslint.config.mjs b/eslint.config.mjs index ceba176..c611bf1 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,13 +1,80 @@ +import typescriptEslintEslintPlugin from "@typescript-eslint/eslint-plugin"; +import tsdoc from "eslint-plugin-tsdoc"; import globals from "globals"; -import pluginJs from "@eslint/js"; -import tseslint from "typescript-eslint"; - - -/** @type {import('eslint').Linter.Config[]} */ -export default [ - {files: ["**/*.{js,mjs,cjs,ts}"]}, - {files: ["**/*.js"], languageOptions: {sourceType: "commonjs"}}, - {languageOptions: { globals: globals.browser }}, - pluginJs.configs.recommended, - ...tseslint.configs.recommended, -]; +import tsParser from "@typescript-eslint/parser"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import js from "@eslint/js"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +import { includeIgnoreFile } from "@eslint/compat"; +const gitignorePath = path.resolve(__dirname, ".gitignore"); + +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +export default [...compat.extends( + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended", +), { + plugins: { + "@typescript-eslint": typescriptEslintEslintPlugin, + tsdoc, + }, + + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + ...globals.jest, + ...globals.commonjs, + }, + + parser: tsParser, + ecmaVersion: "latest", + sourceType: "module", + + parserOptions: { + sourceType: 'module', + project: './tsconfig.json', + }, + }, + + rules: { + "tsdoc/syntax": "warn", + + "max-len": ["error", { + code: 150, + ignoreUrls: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + ignoreComments: true, + ignoreRegExpLiterals: true, + }], + + "prettier/prettier": ["error", { + singleQuote: true, + trailingComma: "es5", + }], + }, + + ignores: [ + "jest.config.js", + "package.json", + "package-lock.json", + "tsconfig.json", + "typedoc.json", + ], +}, +includeIgnoreFile(gitignorePath), +{ + // your overrides +}, +]; \ No newline at end of file diff --git a/jest.config.js b/jest.config.js index 44ead85..e993232 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,8 +1,8 @@ -module.exports = { - testEnvironment: 'node', - roots: ['/test'], - testMatch: ['**/*.test.ts'], +export default { + testEnvironment: "node", + roots: ["/test"], + testMatch: ["**/*.test.ts"], transform: { - '^.+\\.tsx?$': 'ts-jest', + "^.+\\.tsx?$": "ts-jest", }, }; diff --git a/lib/build-image-pipeline.ts b/lib/build-image-pipeline.ts index 692940b..fa349b0 100644 --- a/lib/build-image-pipeline.ts +++ b/lib/build-image-pipeline.ts @@ -35,7 +35,6 @@ export interface BuildImagePipelineProps extends cdk.StackProps { readonly serverAccessLogsPrefix?: string; /** Artifact bucket to use */ readonly artifactBucket?: s3.Bucket; - } /** @@ -107,10 +106,10 @@ export class BuildImagePipelineStack extends cdk.Stack { let accessLoggingBucket: s3.IBucket; - if (props.accessLoggingBucket){ + 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, @@ -120,13 +119,13 @@ export class BuildImagePipelineStack extends cdk.Stack { let artifactBucket: s3.IBucket; - if (props.artifactBucket){ + if (props.artifactBucket) { artifactBucket = props.artifactBucket; } else { const encryptionKey = new kms.Key(this, 'PipelineArtifactKey', { - removalPolicy: RemovalPolicy.DESTROY, - enableKeyRotation: true, - }); + removalPolicy: RemovalPolicy.DESTROY, + enableKeyRotation: true, + }); artifactBucket = new s3.Bucket(this, 'PipelineArtifacts', { versioned: true, enforceSSL: true, diff --git a/lib/embedded-linux-codebuild-project.ts b/lib/embedded-linux-codebuild-project.ts index 9105f52..544a67c 100644 --- a/lib/embedded-linux-codebuild-project.ts +++ b/lib/embedded-linux-codebuild-project.ts @@ -1,12 +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 kms from "aws-cdk-lib/aws-kms"; -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, @@ -14,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, @@ -23,18 +22,16 @@ import { Peer, Port, SecurityGroup, -} from "aws-cdk-lib/aws-ec2"; -import { 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 { ProjectKind } from './constructs/source-repo'; +import { VMImportBucket } from './vm-import-bucket'; +import { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs'; +import { RemovalPolicy } from 'aws-cdk-lib'; /** * Properties to allow customizing the build. */ -export interface EmbeddedLinuxCodebuildProjectProps - extends cdk.StackProps { +export interface EmbeddedLinuxCodebuildProjectProps extends cdk.StackProps { /** ECR Repository where the Build Host Image resides. */ readonly imageRepo: IRepository; /** Tag for the Build Host Image */ @@ -74,26 +71,27 @@ export class EmbeddedLinuxCodebuildProjectStack 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); - let accessLoggingBucket: s3.IBucket; + // let accessLoggingBucket: s3.IBucket; if (props.accessLoggingBucket) { - accessLoggingBucket = props.accessLoggingBucket; + // accessLoggingBucket = props.accessLoggingBucket; } else { - accessLoggingBucket = new s3.Bucket(this, "ArtifactAccessLogging", { + /* accessLoggingBucket = */ + new s3.Bucket(this, 'ArtifactAccessLogging', { versioned: true, enforceSSL: true, autoDeleteObjects: true, @@ -102,59 +100,55 @@ export class EmbeddedLinuxCodebuildProjectStack extends cdk.Stack { } /** 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": ".", + const project = new Project(this, 'EmbeddedLinuxCodebuildProject', { + buildSpec: BuildSpec.fromObject({ + version: '0.2', + phases: { + build: { + commands: ['echo "DUMMY BUILDSPEC - can not be empty"'], }, - }), - environment: { - computeType: ComputeType.X2_LARGE, - buildImage: LinuxBuildImage.fromEcrRepository( - props.imageRepo, - props.imageTag - ), - privileged: true, }, - timeout: cdk.Duration.hours(4), - vpc: props.vpc, - securityGroups: [projectSg], - fileSystemLocations: [ - FileSystemLocation.efs({ - identifier: "tmp_dir", - location: tmpFS, - mountPoint: "/build-output", - }), - FileSystemLocation.efs({ - identifier: "sstate_cache", - location: sstateFS, - mountPoint: "/sstate-cache", - }), - FileSystemLocation.efs({ - identifier: "dl_dir", - location: dlFS, - mountPoint: "/downloads", + artifacts: { + files: ['**/*'], + 'base-directory': '.', + }, + }), + environment: { + computeType: ComputeType.X2_LARGE, + buildImage: LinuxBuildImage.fromEcrRepository( + props.imageRepo, + props.imageTag + ), + privileged: true, + }, + timeout: cdk.Duration.hours(4), + vpc: props.vpc, + securityGroups: [projectSg], + fileSystemLocations: [ + FileSystemLocation.efs({ + identifier: 'tmp_dir', + location: tmpFS, + mountPoint: '/build-output', + }), + FileSystemLocation.efs({ + identifier: 'sstate_cache', + location: sstateFS, + mountPoint: '/sstate-cache', + }), + FileSystemLocation.efs({ + identifier: 'dl_dir', + location: dlFS, + mountPoint: '/downloads', + }), + ], + logging: { + cloudWatch: { + logGroup: new LogGroup(this, 'PipelineBuildLogs', { + retention: RetentionDays.TEN_YEARS, }), - ], - logging: { - cloudWatch: { - logGroup: new LogGroup(this, "PipelineBuildLogs", { - retention: RetentionDays.TEN_YEARS, - }), - }, }, - } - ); + }, + }); if (props.buildPolicyAdditions) { props.buildPolicyAdditions.map((p) => project.addToRolePolicy(p)); @@ -163,17 +157,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 @@ -199,14 +193,14 @@ def handler(event, context): } ); - 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'], }, }, }, @@ -250,18 +244,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/embedded-linux-pipeline.ts index 03b4ff7..7e8af5e 100644 --- a/lib/embedded-linux-pipeline.ts +++ b/lib/embedded-linux-pipeline.ts @@ -60,7 +60,7 @@ export interface EmbeddedLinuxPipelineProps extends cdk.StackProps { readonly outputBucket?: s3.Bucket | VMImportBucket; /** Prefix for S3 object within bucket */ readonly subDirectoryName?: string; - } +} /** * The stack for creating a build pipeline. @@ -92,10 +92,10 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { let scriptAsset!: Asset; let accessLoggingBucket: s3.IBucket; - if (props.accessLoggingBucket){ + 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, @@ -117,7 +117,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { } ); - if (props.outputBucket){ + if (props.outputBucket) { outputBucket = props.outputBucket; } else { outputBucket = new VMImportBucket(this, 'PipelineOutput', { @@ -146,7 +146,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { }, }; } else { - if (props.outputBucket){ + if (props.outputBucket) { outputBucket = props.outputBucket; } else { outputBucket = new s3.Bucket(this, 'PipelineOutput', { @@ -161,13 +161,13 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { let artifactBucket: s3.IBucket; - if (props.artifactBucket){ + if (props.artifactBucket) { artifactBucket = props.artifactBucket; } else { const encryptionKey = new kms.Key(this, 'PipelineArtifactKey', { - removalPolicy: RemovalPolicy.DESTROY, - enableKeyRotation: true, - }); + removalPolicy: RemovalPolicy.DESTROY, + enableKeyRotation: true, + }); artifactBucket = new s3.Bucket(this, 'PipelineArtifacts', { versioned: true, enforceSSL: true, @@ -240,7 +240,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { }); if (props.buildPolicyAdditions) { - props.buildPolicyAdditions.map(p => project.addToRolePolicy(p)) + props.buildPolicyAdditions.map((p) => project.addToRolePolicy(p)); } if (props.projectKind && props.projectKind == ProjectKind.PokyAmi) { @@ -255,11 +255,11 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { `arn:aws:ec2:${this.region}::snapshot/*`, ], }) - ), - //Permissions for BackUp to S3 - project.addToRolePolicy( - this.addAMIS3BackupPolicy(outputBucket.bucketArn) - ); + ); + //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()); @@ -276,12 +276,12 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { let artifactAction: codepipeline_actions.S3DeployAction; - if (props.subDirectoryName){ + if (props.subDirectoryName) { artifactAction = new codepipeline_actions.S3DeployAction({ actionName: 'Artifact', input: buildOutput, bucket: outputBucket, - objectKey: props.subDirectoryName + objectKey: props.subDirectoryName, }); } else { artifactAction = new codepipeline_actions.S3DeployAction({ @@ -396,10 +396,14 @@ def handler(event, context): vpc: IVpc, securityGroup: ISecurityGroup ): string { - const fs = new efs.FileSystem(this, `EmbeddedLinuxPipeline${name}Filesystem`, { - vpc, - removalPolicy: cdk.RemovalPolicy.DESTROY, - }); + 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; diff --git a/package-lock.json b/package-lock.json index 44c248f..4d7e45c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,15 @@ { "name": "aws4embeddedlinux-cdk-lib", - "version": "0.1.3", + "version": "0.1.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "aws4embeddedlinux-cdk-lib", - "version": "0.1.3", + "version": "0.1.4", "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", @@ -674,6 +676,24 @@ "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", diff --git a/package.json b/package.json index bebf23e..80df519 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,8 @@ "prepare": "npm run build" }, "devDependencies": { + "@eslint/compat": "^1.2.4", + "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.16.0", "@types/jest": "^29.5.14", "@types/node": "20.14.8", diff --git a/test/embedded-linux-pipeline-nag.test.ts b/test/embedded-linux-pipeline-nag.test.ts index 263afe0..e50a317 100644 --- a/test/embedded-linux-pipeline-nag.test.ts +++ b/test/embedded-linux-pipeline-nag.test.ts @@ -139,8 +139,7 @@ describe('Pipeline cdk-nag AwsSolutions Pack', () => { [ { id: 'AwsSolutions-L1', - reason: - 'There is no latest PYTHON version to set.', + reason: 'There is no latest PYTHON version to set.', }, ] ); diff --git a/tsconfig.json b/tsconfig.json index e20c701..25a1997 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,10 @@ "compilerOptions": { "target": "ES2020", "module": "commonjs", - "lib": ["es2020", "dom"], + "lib": [ + "es2020", + "dom" + ], "declaration": true, "strict": true, "noImplicitAny": true, @@ -17,8 +20,14 @@ "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" + ] +} \ No newline at end of file From af01d5ca8ec9d27c33accc718238119544ea35fb Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 13 Dec 2024 13:32:29 +0100 Subject: [PATCH 10/13] eslint upgrade + fixing eslint issues --- .eslintrc.js | 68 -------- eslint.config.mjs | 85 ++++++++-- jest.config.js | 10 +- lib/build-image-pipeline.ts | 13 +- lib/embedded-linux-codebuild-project.ts | 188 +++++++++++------------ lib/embedded-linux-pipeline.ts | 46 +++--- package-lock.json | 24 ++- package.json | 2 + test/embedded-linux-pipeline-nag.test.ts | 3 +- tsconfig.json | 17 +- 10 files changed, 241 insertions(+), 215 deletions(-) delete mode 100644 .eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 395915c..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,68 +0,0 @@ -module.exports = { - env: { - browser: true, - es2021: true, - node: true, - jest: true, - }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended', - ], - overrides: [], - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - }, - plugins: ['@typescript-eslint'], - rules: { - 'max-len': [ - 'error', - { - code: 150, - ignoreUrls: true, - ignoreStrings: true, - ignoreTemplateLiterals: true, - ignoreComments: true, - ignoreRegExpLiterals: true, - }, - ], - 'prettier/prettier': [ - 'error', - { - singleQuote: true, // Eliminate escaping. - trailingComma: 'es5', // For simpler diffs - }, - ], - }, - root: true, - plugins: [ - "@typescript-eslint/eslint-plugin", - "eslint-plugin-tsdoc" - ], - extends: [ - 'plugin:@typescript-eslint/recommended' - ], - parser: '@typescript-eslint/parser', - parserOptions: { - project: "./tsconfig.json", - tsconfigRootDir: __dirname, - ecmaVersion: 2018, - sourceType: "module" - }, - rules: { - "tsdoc/syntax": "warn" - }, - ignorePatterns: [ - "npm_modules/", - "dist/", - "cdk.out/", - ".eslintrc.js", - "package.json", - "package-lock.json", - "tsconfig.json", - "typedoc.json" - ], -}; diff --git a/eslint.config.mjs b/eslint.config.mjs index ceba176..b91787f 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,13 +1,80 @@ +import typescriptEslintEslintPlugin from "@typescript-eslint/eslint-plugin"; +import tsdoc from "eslint-plugin-tsdoc"; import globals from "globals"; -import pluginJs from "@eslint/js"; -import tseslint from "typescript-eslint"; +import tsParser from "@typescript-eslint/parser"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import js from "@eslint/js"; +import { FlatCompat } from "@eslint/eslintrc"; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); -/** @type {import('eslint').Linter.Config[]} */ -export default [ - {files: ["**/*.{js,mjs,cjs,ts}"]}, - {files: ["**/*.js"], languageOptions: {sourceType: "commonjs"}}, - {languageOptions: { globals: globals.browser }}, - pluginJs.configs.recommended, - ...tseslint.configs.recommended, +import { includeIgnoreFile } from "@eslint/compat"; +const gitignorePath = path.resolve(__dirname, ".gitignore"); + +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +export default [...compat.extends( + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended", +), { + plugins: { + "@typescript-eslint": typescriptEslintEslintPlugin, + tsdoc, + }, + + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + ...globals.jest, + ...globals.commonjs, + }, + + parser: tsParser, + ecmaVersion: "latest", + sourceType: "module", + + parserOptions: { + sourceType: 'module', + project: './tsconfig.json', + }, + }, + + rules: { + "tsdoc/syntax": "warn", + + "max-len": ["error", { + code: 150, + ignoreUrls: true, + ignoreStrings: true, + ignoreTemplateLiterals: true, + ignoreComments: true, + ignoreRegExpLiterals: true, + }], + + "prettier/prettier": ["error", { + singleQuote: true, + trailingComma: "es5", + }], + }, + + ignores: [ + "jest.config.js", + "package.json", + "package-lock.json", + "tsconfig.json", + "typedoc.json", + ], +}, +includeIgnoreFile(gitignorePath), +{ + // your overrides +}, ]; diff --git a/jest.config.js b/jest.config.js index 44ead85..e993232 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,8 +1,8 @@ -module.exports = { - testEnvironment: 'node', - roots: ['/test'], - testMatch: ['**/*.test.ts'], +export default { + testEnvironment: "node", + roots: ["/test"], + testMatch: ["**/*.test.ts"], transform: { - '^.+\\.tsx?$': 'ts-jest', + "^.+\\.tsx?$": "ts-jest", }, }; diff --git a/lib/build-image-pipeline.ts b/lib/build-image-pipeline.ts index 692940b..fa349b0 100644 --- a/lib/build-image-pipeline.ts +++ b/lib/build-image-pipeline.ts @@ -35,7 +35,6 @@ export interface BuildImagePipelineProps extends cdk.StackProps { readonly serverAccessLogsPrefix?: string; /** Artifact bucket to use */ readonly artifactBucket?: s3.Bucket; - } /** @@ -107,10 +106,10 @@ export class BuildImagePipelineStack extends cdk.Stack { let accessLoggingBucket: s3.IBucket; - if (props.accessLoggingBucket){ + 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, @@ -120,13 +119,13 @@ export class BuildImagePipelineStack extends cdk.Stack { let artifactBucket: s3.IBucket; - if (props.artifactBucket){ + if (props.artifactBucket) { artifactBucket = props.artifactBucket; } else { const encryptionKey = new kms.Key(this, 'PipelineArtifactKey', { - removalPolicy: RemovalPolicy.DESTROY, - enableKeyRotation: true, - }); + removalPolicy: RemovalPolicy.DESTROY, + enableKeyRotation: true, + }); artifactBucket = new s3.Bucket(this, 'PipelineArtifacts', { versioned: true, enforceSSL: true, diff --git a/lib/embedded-linux-codebuild-project.ts b/lib/embedded-linux-codebuild-project.ts index 9105f52..544a67c 100644 --- a/lib/embedded-linux-codebuild-project.ts +++ b/lib/embedded-linux-codebuild-project.ts @@ -1,12 +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 kms from "aws-cdk-lib/aws-kms"; -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, @@ -14,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, @@ -23,18 +22,16 @@ import { Peer, Port, SecurityGroup, -} from "aws-cdk-lib/aws-ec2"; -import { 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 { ProjectKind } from './constructs/source-repo'; +import { VMImportBucket } from './vm-import-bucket'; +import { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs'; +import { RemovalPolicy } from 'aws-cdk-lib'; /** * Properties to allow customizing the build. */ -export interface EmbeddedLinuxCodebuildProjectProps - extends cdk.StackProps { +export interface EmbeddedLinuxCodebuildProjectProps extends cdk.StackProps { /** ECR Repository where the Build Host Image resides. */ readonly imageRepo: IRepository; /** Tag for the Build Host Image */ @@ -74,26 +71,27 @@ export class EmbeddedLinuxCodebuildProjectStack 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); - let accessLoggingBucket: s3.IBucket; + // let accessLoggingBucket: s3.IBucket; if (props.accessLoggingBucket) { - accessLoggingBucket = props.accessLoggingBucket; + // accessLoggingBucket = props.accessLoggingBucket; } else { - accessLoggingBucket = new s3.Bucket(this, "ArtifactAccessLogging", { + /* accessLoggingBucket = */ + new s3.Bucket(this, 'ArtifactAccessLogging', { versioned: true, enforceSSL: true, autoDeleteObjects: true, @@ -102,59 +100,55 @@ export class EmbeddedLinuxCodebuildProjectStack extends cdk.Stack { } /** 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": ".", + const project = new Project(this, 'EmbeddedLinuxCodebuildProject', { + buildSpec: BuildSpec.fromObject({ + version: '0.2', + phases: { + build: { + commands: ['echo "DUMMY BUILDSPEC - can not be empty"'], }, - }), - environment: { - computeType: ComputeType.X2_LARGE, - buildImage: LinuxBuildImage.fromEcrRepository( - props.imageRepo, - props.imageTag - ), - privileged: true, }, - timeout: cdk.Duration.hours(4), - vpc: props.vpc, - securityGroups: [projectSg], - fileSystemLocations: [ - FileSystemLocation.efs({ - identifier: "tmp_dir", - location: tmpFS, - mountPoint: "/build-output", - }), - FileSystemLocation.efs({ - identifier: "sstate_cache", - location: sstateFS, - mountPoint: "/sstate-cache", - }), - FileSystemLocation.efs({ - identifier: "dl_dir", - location: dlFS, - mountPoint: "/downloads", + artifacts: { + files: ['**/*'], + 'base-directory': '.', + }, + }), + environment: { + computeType: ComputeType.X2_LARGE, + buildImage: LinuxBuildImage.fromEcrRepository( + props.imageRepo, + props.imageTag + ), + privileged: true, + }, + timeout: cdk.Duration.hours(4), + vpc: props.vpc, + securityGroups: [projectSg], + fileSystemLocations: [ + FileSystemLocation.efs({ + identifier: 'tmp_dir', + location: tmpFS, + mountPoint: '/build-output', + }), + FileSystemLocation.efs({ + identifier: 'sstate_cache', + location: sstateFS, + mountPoint: '/sstate-cache', + }), + FileSystemLocation.efs({ + identifier: 'dl_dir', + location: dlFS, + mountPoint: '/downloads', + }), + ], + logging: { + cloudWatch: { + logGroup: new LogGroup(this, 'PipelineBuildLogs', { + retention: RetentionDays.TEN_YEARS, }), - ], - logging: { - cloudWatch: { - logGroup: new LogGroup(this, "PipelineBuildLogs", { - retention: RetentionDays.TEN_YEARS, - }), - }, }, - } - ); + }, + }); if (props.buildPolicyAdditions) { props.buildPolicyAdditions.map((p) => project.addToRolePolicy(p)); @@ -163,17 +157,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 @@ -199,14 +193,14 @@ def handler(event, context): } ); - 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'], }, }, }, @@ -250,18 +244,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/embedded-linux-pipeline.ts index 03b4ff7..7e8af5e 100644 --- a/lib/embedded-linux-pipeline.ts +++ b/lib/embedded-linux-pipeline.ts @@ -60,7 +60,7 @@ export interface EmbeddedLinuxPipelineProps extends cdk.StackProps { readonly outputBucket?: s3.Bucket | VMImportBucket; /** Prefix for S3 object within bucket */ readonly subDirectoryName?: string; - } +} /** * The stack for creating a build pipeline. @@ -92,10 +92,10 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { let scriptAsset!: Asset; let accessLoggingBucket: s3.IBucket; - if (props.accessLoggingBucket){ + 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, @@ -117,7 +117,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { } ); - if (props.outputBucket){ + if (props.outputBucket) { outputBucket = props.outputBucket; } else { outputBucket = new VMImportBucket(this, 'PipelineOutput', { @@ -146,7 +146,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { }, }; } else { - if (props.outputBucket){ + if (props.outputBucket) { outputBucket = props.outputBucket; } else { outputBucket = new s3.Bucket(this, 'PipelineOutput', { @@ -161,13 +161,13 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { let artifactBucket: s3.IBucket; - if (props.artifactBucket){ + if (props.artifactBucket) { artifactBucket = props.artifactBucket; } else { const encryptionKey = new kms.Key(this, 'PipelineArtifactKey', { - removalPolicy: RemovalPolicy.DESTROY, - enableKeyRotation: true, - }); + removalPolicy: RemovalPolicy.DESTROY, + enableKeyRotation: true, + }); artifactBucket = new s3.Bucket(this, 'PipelineArtifacts', { versioned: true, enforceSSL: true, @@ -240,7 +240,7 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { }); if (props.buildPolicyAdditions) { - props.buildPolicyAdditions.map(p => project.addToRolePolicy(p)) + props.buildPolicyAdditions.map((p) => project.addToRolePolicy(p)); } if (props.projectKind && props.projectKind == ProjectKind.PokyAmi) { @@ -255,11 +255,11 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { `arn:aws:ec2:${this.region}::snapshot/*`, ], }) - ), - //Permissions for BackUp to S3 - project.addToRolePolicy( - this.addAMIS3BackupPolicy(outputBucket.bucketArn) - ); + ); + //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()); @@ -276,12 +276,12 @@ export class EmbeddedLinuxPipelineStack extends cdk.Stack { let artifactAction: codepipeline_actions.S3DeployAction; - if (props.subDirectoryName){ + if (props.subDirectoryName) { artifactAction = new codepipeline_actions.S3DeployAction({ actionName: 'Artifact', input: buildOutput, bucket: outputBucket, - objectKey: props.subDirectoryName + objectKey: props.subDirectoryName, }); } else { artifactAction = new codepipeline_actions.S3DeployAction({ @@ -396,10 +396,14 @@ def handler(event, context): vpc: IVpc, securityGroup: ISecurityGroup ): string { - const fs = new efs.FileSystem(this, `EmbeddedLinuxPipeline${name}Filesystem`, { - vpc, - removalPolicy: cdk.RemovalPolicy.DESTROY, - }); + 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; diff --git a/package-lock.json b/package-lock.json index 44c248f..4d7e45c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,15 @@ { "name": "aws4embeddedlinux-cdk-lib", - "version": "0.1.3", + "version": "0.1.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "aws4embeddedlinux-cdk-lib", - "version": "0.1.3", + "version": "0.1.4", "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", @@ -674,6 +676,24 @@ "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", diff --git a/package.json b/package.json index bebf23e..80df519 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,8 @@ "prepare": "npm run build" }, "devDependencies": { + "@eslint/compat": "^1.2.4", + "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.16.0", "@types/jest": "^29.5.14", "@types/node": "20.14.8", diff --git a/test/embedded-linux-pipeline-nag.test.ts b/test/embedded-linux-pipeline-nag.test.ts index 263afe0..e50a317 100644 --- a/test/embedded-linux-pipeline-nag.test.ts +++ b/test/embedded-linux-pipeline-nag.test.ts @@ -139,8 +139,7 @@ describe('Pipeline cdk-nag AwsSolutions Pack', () => { [ { id: 'AwsSolutions-L1', - reason: - 'There is no latest PYTHON version to set.', + reason: 'There is no latest PYTHON version to set.', }, ] ); diff --git a/tsconfig.json b/tsconfig.json index e20c701..25a1997 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,10 @@ "compilerOptions": { "target": "ES2020", "module": "commonjs", - "lib": ["es2020", "dom"], + "lib": [ + "es2020", + "dom" + ], "declaration": true, "strict": true, "noImplicitAny": true, @@ -17,8 +20,14 @@ "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" + ] +} \ No newline at end of file From 298bf5705d63033e04f8e25eb6b2038565ac3778 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 13 Dec 2024 15:13:18 +0100 Subject: [PATCH 11/13] dropping node 16 support, adding node 22 -> eslint v9 update --- .github/workflows/test-cdk.yml | 2 +- eslint.config.mjs | 1 - package.json | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-cdk.yml b/.github/workflows/test-cdk.yml index f05cdd1..96418a1 100644 --- a/.github/workflows/test-cdk.yml +++ b/.github/workflows/test-cdk.yml @@ -10,7 +10,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x, 20.x] + node-version: [18.x, 20.x, 22.x] steps: - name: Check out repository code diff --git a/eslint.config.mjs b/eslint.config.mjs index ce89a17..61853b1 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -34,7 +34,6 @@ export default [...compat.extends( ...globals.browser, ...globals.node, ...globals.jest, - ...globals.commonjs, }, parser: tsParser, diff --git a/package.json b/package.json index b581e3f..b744e5c 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.1.4", "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", From a9f57e63b6e5b1a2361a530624d417e9677807ca Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 13 Dec 2024 15:15:09 +0100 Subject: [PATCH 12/13] buidlspec update : v0.0.1 branch is no longer available for aws4embeddedlinux/meta-aws-demos -> switchig to main --- source-repo/meta-aws-demo/build.buildspec.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source-repo/meta-aws-demo/build.buildspec.yml b/source-repo/meta-aws-demo/build.buildspec.yml index 6ad5c62..c169330 100644 --- a/source-repo/meta-aws-demo/build.buildspec.yml +++ b/source-repo/meta-aws-demo/build.buildspec.yml @@ -23,7 +23,7 @@ phases: fi build: commands: - - git clone https://github.com/aws4embeddedlinux/meta-aws-demos -b v0.0.1 + - git clone https://github.com/aws4embeddedlinux/meta-aws-demos - cd meta-aws-demos - git submodule update --init --recursive - echo Build started on `date` From a7811563324835dc343c1101b73c5f65728ebac0 Mon Sep 17 00:00:00 2001 From: Abdelhalim Dadouche Date: Fri, 13 Dec 2024 15:15:09 +0100 Subject: [PATCH 13/13] buidlspec update : v0.0.1 branch is no longer available for aws4embeddedlinux/meta-aws-demos -> switchig to main --- source-repo/meta-aws-demo/build.buildspec.yml | 2 +- tsconfig.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source-repo/meta-aws-demo/build.buildspec.yml b/source-repo/meta-aws-demo/build.buildspec.yml index 6ad5c62..c169330 100644 --- a/source-repo/meta-aws-demo/build.buildspec.yml +++ b/source-repo/meta-aws-demo/build.buildspec.yml @@ -23,7 +23,7 @@ phases: fi build: commands: - - git clone https://github.com/aws4embeddedlinux/meta-aws-demos -b v0.0.1 + - git clone https://github.com/aws4embeddedlinux/meta-aws-demos - cd meta-aws-demos - git submodule update --init --recursive - echo Build started on `date` diff --git a/tsconfig.json b/tsconfig.json index 25a1997..a3c1c1c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -30,4 +30,4 @@ "cdk.out", "dist" ] -} \ No newline at end of file +}