From 7790688e81f7b4f7e648b06b3c1dd75372326ff7 Mon Sep 17 00:00:00 2001 From: Matthew Bystedt Date: Tue, 21 Nov 2023 08:29:31 -0800 Subject: [PATCH] feat: build/install checksum link (#134) * feat: build/install checksum link * feat: add artifact api * feat: update dependencies --- .gitignore | 2 + package-lock.json | 507 +++++++++++------- package.json | 30 +- scripts/provision-app-quick-build.sh | 7 +- scripts/provision-app-quick-install.json | 25 + scripts/provision-app-quick-install.sh | 41 ++ scripts/setenv-backend-dev.sh | 2 +- src/audit/audit.service.ts | 5 +- src/graph/graph.service.ts | 2 +- src/intention/action.service.ts | 31 ++ .../dto/artifact-search-query.dto.ts | 31 ++ .../dto/artifact-search-result.dto.ts | 17 + src/intention/dto/artifact.dto.ts | 5 + src/intention/dto/intention.dto.ts | 1 + src/intention/dto/package.dto.ts | 13 +- src/intention/intention.controller.ts | 19 +- src/intention/intention.service.ts | 44 +- .../interfaces/intention.repository.ts | 13 +- .../mongo/intention-mongo.repository.ts | 62 ++- src/preference/preference.controller.ts | 2 +- src/provision/provision.controller.ts | 4 +- ui/package-lock.json | 392 +++++++------- ui/package.json | 30 +- 23 files changed, 863 insertions(+), 422 deletions(-) create mode 100644 scripts/provision-app-quick-install.json create mode 100755 scripts/provision-app-quick-install.sh create mode 100644 src/intention/dto/artifact-search-query.dto.ts create mode 100644 src/intention/dto/artifact-search-result.dto.ts diff --git a/.gitignore b/.gitignore index ae328765..2d34aa04 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,5 @@ lerna-debug.log* /env-prod.hcl /scripts/db/mongo-setup-ext.js /scripts/setenv-common.sh +/scripts/provision-app-quick-build.artifact.sha256 +/scripts/provision-app-quick-build.trace.id diff --git a/package-lock.json b/package-lock.json index bdd6815e..324f074e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,22 +1,22 @@ { "name": "nr-broker", - "version": "5.4.0", + "version": "5.5.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nr-broker", - "version": "5.4.0", + "version": "5.5.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-kinesis": "^3.451.0", + "@aws-sdk/client-kinesis": "^3.454.0", "@nestjs/axios": "^3.0.1", - "@nestjs/common": "^10.2.8", + "@nestjs/common": "^10.2.10", "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.2.8", + "@nestjs/core": "^10.2.10", "@nestjs/jwt": "^10.2.0", "@nestjs/passport": "^10.0.2", - "@nestjs/platform-express": "^10.2.8", + "@nestjs/platform-express": "^10.2.10", "@nestjs/schedule": "^4.0.0", "@nestjs/serve-static": "^4.0.0", "@nestjs/swagger": "^7.1.16", @@ -40,6 +40,7 @@ "reflect-metadata": "^0.1.13", "rimraf": "^5.0.5", "rxjs": "^7.8.1", + "snakecase-keys": "^5.5.0", "typeorm": "^0.3.17", "uuid": "^9.0.1" }, @@ -47,22 +48,22 @@ "@golevelup/ts-jest": "^0.4.0", "@nestjs/cli": "^10.2.1", "@nestjs/schematics": "^10.0.3", - "@nestjs/testing": "^10.2.8", + "@nestjs/testing": "^10.2.10", "@types/cron": "^2.4.0", "@types/ejs": "^3.1.5", "@types/express": "^4.17.21", "@types/express-session": "^1.17.10", - "@types/jest": "^29.5.8", + "@types/jest": "^29.5.9", "@types/lodash.merge": "^4.6.9", - "@types/node": "^20.9.0", - "@types/passport": "^1.0.15", + "@types/node": "^20.9.3", + "@types/passport": "^1.0.16", "@types/passport-http": "^0.3.11", "@types/passport-jwt": "^3.0.13", "@types/supertest": "^2.0.16", "@types/uuid": "^9.0.7", - "@typescript-eslint/eslint-plugin": "^6.11.0", - "@typescript-eslint/parser": "^6.11.0", - "eslint": "^8.53.0", + "@typescript-eslint/eslint-plugin": "^6.12.0", + "@typescript-eslint/parser": "^6.12.0", + "eslint": "^8.54.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.1", "jest": "^29.7.0", @@ -73,7 +74,7 @@ "ts-loader": "^9.5.1", "ts-node": "^10.0.0", "tsconfig-paths": "^4.2.0", - "typescript": "^5.2.2" + "typescript": "^5.3.2" } }, "9.3.0@nestjs/common@9.4.0": { @@ -286,13 +287,13 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@aws-sdk/client-kinesis": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-kinesis/-/client-kinesis-3.451.0.tgz", - "integrity": "sha512-Wz2mQCmCWbcgtOwY7Rchyi2sVUEnqMPrQNnpovXZ9gceoVPyl+IHzHCFoqD+6tFrnDMOUOYG31gW4xz82OrUoQ==", + "version": "3.454.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kinesis/-/client-kinesis-3.454.0.tgz", + "integrity": "sha512-/1et4+3iasjCa1vg0IjQmon0hdUWqKj0rvXngiF+xs1LVC5jUK+3kvNpxWxGISJvpX0BxNg3JeEeJXyK1sy0NQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.451.0", + "@aws-sdk/client-sts": "3.454.0", "@aws-sdk/core": "3.451.0", "@aws-sdk/credential-provider-node": "3.451.0", "@aws-sdk/middleware-host-header": "3.451.0", @@ -385,9 +386,9 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.451.0.tgz", - "integrity": "sha512-48NcIRxWBdP1fom6RSjwn2R2u7SE7eeV3p+c4s7ukEOfrHhBxJfn3EpqBVQMGzdiU55qFImy+Fe81iA2lXq3Jw==", + "version": "3.454.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.454.0.tgz", + "integrity": "sha512-0fDvr8WeB6IYO8BUCzcivWmahgGl/zDbaYfakzGnt4mrl5ztYaXE875WI6b7+oFcKMRvN+KLvwu5TtyFuNY+GQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -1478,9 +1479,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2224,10 +2225,23 @@ "node": ">=8" } }, + "node_modules/@nestjs/cli/node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/@nestjs/common": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.2.8.tgz", - "integrity": "sha512-rmpwcdvq2IWMmsUVP8rsdKub6uDWk7dwCYo0aif50JTwcvcxzaP3iKVFKoSgvp0RKYu8h15+/AEOfaInmPpl0Q==", + "version": "10.2.10", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.2.10.tgz", + "integrity": "sha512-fwAk931rjW8CNH2Mgwawq/7HWHH1dxkOLdcgs7U52ddLk8CtHXjejm1cbNahewlSbNhvlOl7y1STLHutE6sUqw==", "dependencies": { "iterare": "1.2.1", "tslib": "2.6.2", @@ -2276,9 +2290,9 @@ } }, "node_modules/@nestjs/core": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.2.8.tgz", - "integrity": "sha512-9+MZ2s8ixfY9Bl/M9ofChiyYymcwdK9ZWNH4GDMF7Am7XRAQ1oqde6MYGG05rhQwiVXuTwaYLlXciJKfsrg5qg==", + "version": "10.2.10", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.2.10.tgz", + "integrity": "sha512-+ckOI6BPi2ZMHikT9MCG4ctHDc4OnjhoIytrn7f2AYMMXI4bnutJhqyQKc30VDka5x3Wq6QAD57pgSP7y+JjJg==", "hasInstallScript": true, "dependencies": { "@nuxtjs/opencollective": "0.3.2", @@ -2353,9 +2367,9 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.2.8.tgz", - "integrity": "sha512-WoSSVtwIRc5AdGMHWVzWZK4JZLT0f4o2xW8P9gQvcX+omL8W1kXCfY8GQYXNBG84XmBNYH8r0FtC8oMe/lH5NQ==", + "version": "10.2.10", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.2.10.tgz", + "integrity": "sha512-U4KDgtMjH8TqEvt0RzC/POP8ABvL9bYoCScvlGtFSKgVGaMLBKkZ4+jHtbQx6qItYSlBBRUuz/dveMZCObfrkQ==", "dependencies": { "body-parser": "1.20.2", "cors": "2.8.5", @@ -2584,9 +2598,9 @@ } }, "node_modules/@nestjs/testing": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.2.8.tgz", - "integrity": "sha512-9Kj5IQhM67/nj/MT6Wi2OmWr5YQnCMptwKVFrX1TDaikpY12196v7frk0jVjdT7wms7rV07GZle9I2z0aSjqtQ==", + "version": "10.2.10", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.2.10.tgz", + "integrity": "sha512-IVLUnPz/+fkBtPATYfqTIP+phN9yjkXejmj+JyhmcfPJZpxBmD1i9VSMqa4u54l37j0xkGPscQ0IXpbhqMYUKw==", "dev": true, "dependencies": { "tslib": "2.6.2" @@ -3571,9 +3585,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", - "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", + "version": "29.5.9", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.9.tgz", + "integrity": "sha512-zJeWhqBwVoPm83sP8h1/SVntwWTu5lZbKQGCvBjxQOyEWnKnsaomt2y7SlV4KfwlrHAHHAn00Sh4IAWaIsGOgQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -3621,17 +3635,17 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "version": "20.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.3.tgz", + "integrity": "sha512-nk5wXLAXGBKfrhLB0cyHGbSqopS+nz0BUgZkUQqSHSSgdee0kssp1IAqlQOu333bW+gMNs2QREx7iynm19Abxw==", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/passport": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.15.tgz", - "integrity": "sha512-oHOgzPBp5eLI1U/7421qYV/ZySQXMYCBSfRkDe1tQ0YrIbLY/M/76qIXE7Bs7lFyvw1x5QqiNQ9imvh0fQHe9Q==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.16.tgz", + "integrity": "sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==", "dev": true, "dependencies": { "@types/express": "*" @@ -3681,9 +3695,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "node_modules/@types/serve-static": { @@ -3762,16 +3776,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz", - "integrity": "sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.12.0.tgz", + "integrity": "sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/type-utils": "6.11.0", - "@typescript-eslint/utils": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/type-utils": "6.12.0", + "@typescript-eslint/utils": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3797,15 +3811,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", - "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz", + "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/typescript-estree": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4" }, "engines": { @@ -3825,13 +3839,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", - "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz", + "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0" + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3842,13 +3856,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz", - "integrity": "sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.12.0.tgz", + "integrity": "sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.11.0", - "@typescript-eslint/utils": "6.11.0", + "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/utils": "6.12.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3869,9 +3883,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", - "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz", + "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3882,13 +3896,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", - "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz", + "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3909,17 +3923,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.11.0.tgz", - "integrity": "sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.12.0.tgz", + "integrity": "sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/typescript-estree": "6.12.0", "semver": "^7.5.4" }, "engines": { @@ -3934,12 +3948,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", - "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz", + "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/types": "6.12.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -5624,6 +5638,15 @@ "node": ">=6.0.0" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dotenv": { "version": "16.3.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", @@ -5769,15 +5792,15 @@ } }, "node_modules/eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", + "@eslint/js": "8.54.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -8218,6 +8241,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -8297,6 +8328,17 @@ "tmpl": "1.0.5" } }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -8581,6 +8623,15 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -9857,6 +9908,39 @@ "npm": ">= 3.0.0" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/snakecase-keys": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-5.5.0.tgz", + "integrity": "sha512-r3kRtnoPu3FxGJ3fny6PKNnU3pteb29o6qAa0ugzhSseKNWRkw1dw8nIjXMyyKaU9vQxxVIE62Mb3bKbdrgpiw==", + "dependencies": { + "map-obj": "^4.1.0", + "snake-case": "^3.0.4", + "type-fest": "^3.12.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/snakecase-keys/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/socks": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", @@ -10763,9 +10847,9 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -11427,13 +11511,13 @@ } }, "@aws-sdk/client-kinesis": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-kinesis/-/client-kinesis-3.451.0.tgz", - "integrity": "sha512-Wz2mQCmCWbcgtOwY7Rchyi2sVUEnqMPrQNnpovXZ9gceoVPyl+IHzHCFoqD+6tFrnDMOUOYG31gW4xz82OrUoQ==", + "version": "3.454.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kinesis/-/client-kinesis-3.454.0.tgz", + "integrity": "sha512-/1et4+3iasjCa1vg0IjQmon0hdUWqKj0rvXngiF+xs1LVC5jUK+3kvNpxWxGISJvpX0BxNg3JeEeJXyK1sy0NQ==", "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.451.0", + "@aws-sdk/client-sts": "3.454.0", "@aws-sdk/core": "3.451.0", "@aws-sdk/credential-provider-node": "3.451.0", "@aws-sdk/middleware-host-header": "3.451.0", @@ -11520,9 +11604,9 @@ } }, "@aws-sdk/client-sts": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.451.0.tgz", - "integrity": "sha512-48NcIRxWBdP1fom6RSjwn2R2u7SE7eeV3p+c4s7ukEOfrHhBxJfn3EpqBVQMGzdiU55qFImy+Fe81iA2lXq3Jw==", + "version": "3.454.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.454.0.tgz", + "integrity": "sha512-0fDvr8WeB6IYO8BUCzcivWmahgGl/zDbaYfakzGnt4mrl5ztYaXE875WI6b7+oFcKMRvN+KLvwu5TtyFuNY+GQ==", "requires": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -12377,9 +12461,9 @@ } }, "@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "dev": true }, "@golevelup/ts-jest": { @@ -12938,13 +13022,19 @@ "dev": true } } + }, + "typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true } } }, "@nestjs/common": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.2.8.tgz", - "integrity": "sha512-rmpwcdvq2IWMmsUVP8rsdKub6uDWk7dwCYo0aif50JTwcvcxzaP3iKVFKoSgvp0RKYu8h15+/AEOfaInmPpl0Q==", + "version": "10.2.10", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.2.10.tgz", + "integrity": "sha512-fwAk931rjW8CNH2Mgwawq/7HWHH1dxkOLdcgs7U52ddLk8CtHXjejm1cbNahewlSbNhvlOl7y1STLHutE6sUqw==", "requires": { "iterare": "1.2.1", "tslib": "2.6.2", @@ -12970,9 +13060,9 @@ } }, "@nestjs/core": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.2.8.tgz", - "integrity": "sha512-9+MZ2s8ixfY9Bl/M9ofChiyYymcwdK9ZWNH4GDMF7Am7XRAQ1oqde6MYGG05rhQwiVXuTwaYLlXciJKfsrg5qg==", + "version": "10.2.10", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.2.10.tgz", + "integrity": "sha512-+ckOI6BPi2ZMHikT9MCG4ctHDc4OnjhoIytrn7f2AYMMXI4bnutJhqyQKc30VDka5x3Wq6QAD57pgSP7y+JjJg==", "requires": { "@nuxtjs/opencollective": "0.3.2", "fast-safe-stringify": "2.1.1", @@ -13004,9 +13094,9 @@ "requires": {} }, "@nestjs/platform-express": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.2.8.tgz", - "integrity": "sha512-WoSSVtwIRc5AdGMHWVzWZK4JZLT0f4o2xW8P9gQvcX+omL8W1kXCfY8GQYXNBG84XmBNYH8r0FtC8oMe/lH5NQ==", + "version": "10.2.10", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.2.10.tgz", + "integrity": "sha512-U4KDgtMjH8TqEvt0RzC/POP8ABvL9bYoCScvlGtFSKgVGaMLBKkZ4+jHtbQx6qItYSlBBRUuz/dveMZCObfrkQ==", "requires": { "body-parser": "1.20.2", "cors": "2.8.5", @@ -13119,9 +13209,9 @@ } }, "@nestjs/testing": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.2.8.tgz", - "integrity": "sha512-9Kj5IQhM67/nj/MT6Wi2OmWr5YQnCMptwKVFrX1TDaikpY12196v7frk0jVjdT7wms7rV07GZle9I2z0aSjqtQ==", + "version": "10.2.10", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.2.10.tgz", + "integrity": "sha512-IVLUnPz/+fkBtPATYfqTIP+phN9yjkXejmj+JyhmcfPJZpxBmD1i9VSMqa4u54l37j0xkGPscQ0IXpbhqMYUKw==", "dev": true, "requires": { "tslib": "2.6.2" @@ -13924,9 +14014,9 @@ } }, "@types/jest": { - "version": "29.5.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", - "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", + "version": "29.5.9", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.9.tgz", + "integrity": "sha512-zJeWhqBwVoPm83sP8h1/SVntwWTu5lZbKQGCvBjxQOyEWnKnsaomt2y7SlV4KfwlrHAHHAn00Sh4IAWaIsGOgQ==", "dev": true, "requires": { "expect": "^29.0.0", @@ -13974,17 +14064,17 @@ "dev": true }, "@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "version": "20.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.3.tgz", + "integrity": "sha512-nk5wXLAXGBKfrhLB0cyHGbSqopS+nz0BUgZkUQqSHSSgdee0kssp1IAqlQOu333bW+gMNs2QREx7iynm19Abxw==", "requires": { "undici-types": "~5.26.4" } }, "@types/passport": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.15.tgz", - "integrity": "sha512-oHOgzPBp5eLI1U/7421qYV/ZySQXMYCBSfRkDe1tQ0YrIbLY/M/76qIXE7Bs7lFyvw1x5QqiNQ9imvh0fQHe9Q==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.16.tgz", + "integrity": "sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==", "dev": true, "requires": { "@types/express": "*" @@ -14034,9 +14124,9 @@ "dev": true }, "@types/semver": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "@types/serve-static": { @@ -14115,16 +14205,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz", - "integrity": "sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.12.0.tgz", + "integrity": "sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/type-utils": "6.11.0", - "@typescript-eslint/utils": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/type-utils": "6.12.0", + "@typescript-eslint/utils": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -14134,54 +14224,54 @@ } }, "@typescript-eslint/parser": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", - "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz", + "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/typescript-estree": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", - "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz", + "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0" + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0" } }, "@typescript-eslint/type-utils": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz", - "integrity": "sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.12.0.tgz", + "integrity": "sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.11.0", - "@typescript-eslint/utils": "6.11.0", + "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/utils": "6.12.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", - "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz", + "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", - "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz", + "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/visitor-keys": "6.12.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -14190,27 +14280,27 @@ } }, "@typescript-eslint/utils": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.11.0.tgz", - "integrity": "sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.12.0.tgz", + "integrity": "sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/scope-manager": "6.12.0", + "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/typescript-estree": "6.12.0", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", - "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz", + "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/types": "6.12.0", "eslint-visitor-keys": "^3.4.1" } }, @@ -15460,6 +15550,15 @@ "esutils": "^2.0.2" } }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "dotenv": { "version": "16.3.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", @@ -15569,15 +15668,15 @@ "dev": true }, "eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", + "@eslint/js": "8.54.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -17397,6 +17496,14 @@ "is-unicode-supported": "^0.1.0" } }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -17457,6 +17564,11 @@ "tmpl": "1.0.5" } }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -17660,6 +17772,15 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -18580,6 +18701,32 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, + "snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "snakecase-keys": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-5.5.0.tgz", + "integrity": "sha512-r3kRtnoPu3FxGJ3fny6PKNnU3pteb29o6qAa0ugzhSseKNWRkw1dw8nIjXMyyKaU9vQxxVIE62Mb3bKbdrgpiw==", + "requires": { + "map-obj": "^4.1.0", + "snake-case": "^3.0.4", + "type-fest": "^3.12.0" + }, + "dependencies": { + "type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==" + } + } + }, "socks": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", @@ -19155,9 +19302,9 @@ } }, "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "devOptional": true }, "uid": { diff --git a/package.json b/package.json index 871683b2..5485fb16 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nr-broker", - "version": "5.4.1", + "version": "5.5.0", "description": "", "author": "", "private": true, @@ -19,17 +19,18 @@ "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json" + "test:e2e": "jest --config ./test/jest-e2e.json", + "typeorm": "typeorm-ts-node-commonjs" }, "dependencies": { - "@aws-sdk/client-kinesis": "^3.451.0", + "@aws-sdk/client-kinesis": "^3.454.0", "@nestjs/axios": "^3.0.1", - "@nestjs/common": "^10.2.8", + "@nestjs/common": "^10.2.10", "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.2.8", + "@nestjs/core": "^10.2.10", "@nestjs/jwt": "^10.2.0", "@nestjs/passport": "^10.0.2", - "@nestjs/platform-express": "^10.2.8", + "@nestjs/platform-express": "^10.2.10", "@nestjs/schedule": "^4.0.0", "@nestjs/serve-static": "^4.0.0", "@nestjs/swagger": "^7.1.16", @@ -53,6 +54,7 @@ "reflect-metadata": "^0.1.13", "rimraf": "^5.0.5", "rxjs": "^7.8.1", + "snakecase-keys": "^5.5.0", "typeorm": "^0.3.17", "uuid": "^9.0.1" }, @@ -60,22 +62,22 @@ "@golevelup/ts-jest": "^0.4.0", "@nestjs/cli": "^10.2.1", "@nestjs/schematics": "^10.0.3", - "@nestjs/testing": "^10.2.8", + "@nestjs/testing": "^10.2.10", "@types/cron": "^2.4.0", "@types/ejs": "^3.1.5", "@types/express": "^4.17.21", "@types/express-session": "^1.17.10", - "@types/jest": "^29.5.8", + "@types/jest": "^29.5.9", "@types/lodash.merge": "^4.6.9", - "@types/node": "^20.9.0", - "@types/passport": "^1.0.15", + "@types/node": "^20.9.3", + "@types/passport": "^1.0.16", "@types/passport-http": "^0.3.11", "@types/passport-jwt": "^3.0.13", "@types/supertest": "^2.0.16", "@types/uuid": "^9.0.7", - "@typescript-eslint/eslint-plugin": "^6.11.0", - "@typescript-eslint/parser": "^6.11.0", - "eslint": "^8.53.0", + "@typescript-eslint/eslint-plugin": "^6.12.0", + "@typescript-eslint/parser": "^6.12.0", + "eslint": "^8.54.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.1", "jest": "^29.7.0", @@ -86,7 +88,7 @@ "ts-loader": "^9.5.1", "ts-node": "^10.0.0", "tsconfig-paths": "^4.2.0", - "typescript": "^5.2.2" + "typescript": "^5.3.2" }, "jest": { "moduleFileExtensions": [ diff --git a/scripts/provision-app-quick-build.sh b/scripts/provision-app-quick-build.sh index 0f63e3f6..028d6b14 100755 --- a/scripts/provision-app-quick-build.sh +++ b/scripts/provision-app-quick-build.sh @@ -4,6 +4,9 @@ cd "$this_dir" BUILD_VERSION="12.0.3" +sha256=($(echo $RANDOM $RANDOM $RANDOM | shasum -a 256)) +echo -n $sha256 > provision-app-quick-build.artifact.sha256 +echo "sha256: $sha256" echo "===> Intention open" # Open intention @@ -25,6 +28,8 @@ fi # Save intention token for later INTENTION_TOKEN=$(echo $RESPONSE | jq -r '.token') +BUILD_TRACE_ID=$(echo $RESPONSE | jq -r '.actions.build.trace_id') +echo -n $BUILD_TRACE_ID > provision-app-quick-build.trace.id # echo "Hashed transaction.id: $(echo -n $INTENTION_TOKEN | shasum -a 256)" echo "===> Build" @@ -37,7 +42,7 @@ ACTIONS_BUILD_TOKEN=$(echo $RESPONSE | jq -r '.actions.build.token') curl -s -X POST $BROKER_URL/v1/intention/action/artifact \ -H 'Content-Type: application/json' \ -H 'X-Broker-Token: '"$ACTIONS_BUILD_TOKEN"'' \ - -d '{"checksum": "sha256:1db1bf6ca413a9294ab0348fa8193d6646a8f201ebd8ac3a3de373d712900636", "name": "build.zip", "size": 1234 }' + -d '{"checksum": "sha256:'$sha256'", "name": "build.zip", "size": '$RANDOM', "type": "zip" }' echo "===> Intention close" diff --git a/scripts/provision-app-quick-install.json b/scripts/provision-app-quick-install.json new file mode 100644 index 00000000..f5ef678c --- /dev/null +++ b/scripts/provision-app-quick-install.json @@ -0,0 +1,25 @@ +{ + "event": { + "provider": "github-action-demo", + "reason": "Job triggered", + "url": "JOB_URL" + }, + "actions": [ + { + "action": "package-installation", + "id": "install", + "provision": [], + "service": { + "project": "superapp", + "name": "superapp-backend", + "environment": "development" + }, + "package": { + "type": "zip" + } + } + ], + "user": { + "name": "USER_ID@IDP" + } +} \ No newline at end of file diff --git a/scripts/provision-app-quick-install.sh b/scripts/provision-app-quick-install.sh new file mode 100755 index 00000000..0dc0e9a3 --- /dev/null +++ b/scripts/provision-app-quick-install.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +[ -n "$ZSH_VERSION" ] && this_dir=$(dirname "${(%):-%x}") \ + || this_dir=$(dirname "${BASH_SOURCE[0]:-$0}") +cd "$this_dir" + +BUILD_CHECKSUM="sha256:$(cat provision-app-quick-build.artifact.sha256)" +echo $BUILD_CHECKSUM +BUILD_GUID="$(cat provision-app-quick-build.trace.id)" +echo $BUILD_GUID + +echo "===> Intention open" +# Open intention +RESPONSE=$(curl -s -X POST $BROKER_URL/v1/intention/open?ttl=30\&quickstart=true \ + -H 'Content-Type: application/json' \ + -H "Authorization: Bearer $BROKER_JWT" \ + -d @<(cat provision-app-quick-install.json | \ + jq ".event.url=\"http://sample.com/job\" | \ + .user.name=\"hgoddard@idp\" | \ + (.actions[] | select(.id == \"install\") .package.buildGuid) |= \"$BUILD_GUID\" | \ + " \ + )) +echo "$BROKER_URL/v1/intention/open:" +echo $RESPONSE | jq '.' +if [ "$(echo $RESPONSE | jq '.error')" != "null" ]; then + echo "Exit: Error detected" + exit 0 +fi + +# Save intention token for later +INTENTION_TOKEN=$(echo $RESPONSE | jq -r '.token') +# echo "Hashed transaction.id: $(echo -n $INTENTION_TOKEN | shasum -a 256)" + +echo "===> Install" + +# Not shown: Install superapp +echo "===> ..." +echo "===> Install - Success!" +echo "===> Intention close" + +# Use saved intention token to close intention +curl -s -X POST $BROKER_URL/v1/intention/close -H 'X-Broker-Token: '"$INTENTION_TOKEN"'' diff --git a/scripts/setenv-backend-dev.sh b/scripts/setenv-backend-dev.sh index 2f935652..abcc0662 100755 --- a/scripts/setenv-backend-dev.sh +++ b/scripts/setenv-backend-dev.sh @@ -39,7 +39,7 @@ export ACTION_VALIDATE_TEAM_DBA=64fa194693b3afd6ee63aa99 export HOSTNAME=nr-broker-app-0 -export NESTJS_UI_ROOT_PATH=ui/dist/ui/browser +export NESTJS_UI_ROOT_PATH=../ui/dist/ui/browser export NESTJS_HELMET_HSTS=off export OAUTH2_CLIENT_REGISTRATION_LOGIN_REDIRECT_URI=http://localhost:3000/auth/callback diff --git a/src/audit/audit.service.ts b/src/audit/audit.service.ts index ce68b6fb..187e6f4a 100644 --- a/src/audit/audit.service.ts +++ b/src/audit/audit.service.ts @@ -2,6 +2,7 @@ import { BadRequestException, HttpException, Injectable } from '@nestjs/common'; import { from, map } from 'rxjs'; import merge from 'lodash.merge'; import os from 'os'; +import snakecaseKeys from 'snakecase-keys'; import { ActionDto } from '../intention/dto/action.dto'; import { IntentionDto } from '../intention/dto/intention.dto'; @@ -524,10 +525,10 @@ export class AuditService { ? action.service.target.project : action.service.project, }, - package: { + package: snakecaseKeys({ ...(artifact ?? {}), ...(action.package ?? {}), - }, + }), service: { target: { name: action.service.name, diff --git a/src/graph/graph.service.ts b/src/graph/graph.service.ts index d82fa38b..bbffd422 100644 --- a/src/graph/graph.service.ts +++ b/src/graph/graph.service.ts @@ -19,7 +19,7 @@ import { CollectionDtoUnion } from '../persistence/dto/collection-dto-union.type import { validate } from 'class-validator'; import { ValidatorUtil } from '../util/validator.util'; import { get, set } from 'radash'; -import { CollectionConfigDto } from 'src/persistence/dto/collection-config.dto'; +import { CollectionConfigDto } from '../persistence/dto/collection-config.dto'; @Injectable() export class GraphService { diff --git a/src/intention/action.service.ts b/src/intention/action.service.ts index 9c905f02..4194e648 100644 --- a/src/intention/action.service.ts +++ b/src/intention/action.service.ts @@ -16,6 +16,7 @@ import { UserDto } from '../persistence/dto/user.dto'; import { UserCollectionService } from '../collection/user-collection.service'; import { PersistenceUtilService } from '../persistence/persistence-util.service'; import { PackageInstallationActionDto } from './dto/package-installation-action.dto'; +import { IntentionRepository } from '../persistence/interfaces/intention.repository'; /** * Assists with the validation of intention actions @@ -27,6 +28,7 @@ export class ActionService { private readonly collectionRepository: CollectionRepository, private readonly userCollectionService: UserCollectionService, private readonly graphRepository: GraphRepository, + private readonly intentionRepository: IntentionRepository, private readonly persistenceUtil: PersistenceUtilService, ) {} @@ -66,6 +68,35 @@ export class ActionService { } } + public async annotate(action: ActionDto) { + if (action.action === 'package-installation') { + if (action.package) { + const foundArtifact = await this.intentionRepository.searchArtifacts( + action.package.buildGuid, + action.package.checksum, + action.package.name, + action.package.type, + action.service.name, + 0, + 1, + ); + if ( + foundArtifact.meta.total !== 1 && + foundArtifact.artifacts.length !== 1 + ) { + // Skip: Could not uniquely identify artifact based on package + return; + } + + action.package = { + ...(foundArtifact.artifacts[0].action.package ?? {}), + ...foundArtifact.artifacts[0].artifact, + ...action.package, + }; + } + } + } + public async validate( intention: IntentionDto, action: ActionDto, diff --git a/src/intention/dto/artifact-search-query.dto.ts b/src/intention/dto/artifact-search-query.dto.ts new file mode 100644 index 00000000..73cad207 --- /dev/null +++ b/src/intention/dto/artifact-search-query.dto.ts @@ -0,0 +1,31 @@ +import { Type } from 'class-transformer'; +import { IsInt, IsOptional, IsString } from 'class-validator'; + +export class ArtifactSearchQuery { + @IsString() + @IsOptional() + buildGuid?: string; + + @IsString() + @IsOptional() + checksum?: string; + + @IsString() + @IsOptional() + name?: string; + + @IsString() + service: string; + + @IsInt() + @Type(() => Number) + offset: number; + + @IsString() + @IsOptional() + type?: string; + + @IsInt() + @Type(() => Number) + limit: number; +} diff --git a/src/intention/dto/artifact-search-result.dto.ts b/src/intention/dto/artifact-search-result.dto.ts new file mode 100644 index 00000000..821a3649 --- /dev/null +++ b/src/intention/dto/artifact-search-result.dto.ts @@ -0,0 +1,17 @@ +// Shared DTO: Copy in back-end and front-end should be identical + +import { ActionDto } from './action.dto'; +import { ArtifactDto } from './artifact.dto'; +import { IntentionDto } from './intention.dto'; + +export class ArtifactActionCombo { + action!: ActionDto; + artifact!: ArtifactDto; +} +export class ArtifactSearchResult { + data!: IntentionDto[]; + artifacts!: ArtifactActionCombo[]; + meta!: { + total: number; + }; +} diff --git a/src/intention/dto/artifact.dto.ts b/src/intention/dto/artifact.dto.ts index 8aeb9295..781d7671 100644 --- a/src/intention/dto/artifact.dto.ts +++ b/src/intention/dto/artifact.dto.ts @@ -44,4 +44,9 @@ export class ArtifactDto { @IsDefined() @IsNumber() size: number; + + @Column() + @IsDefined() + @IsString() + type: string; } diff --git a/src/intention/dto/intention.dto.ts b/src/intention/dto/intention.dto.ts index c505b1b1..fd1a885e 100644 --- a/src/intention/dto/intention.dto.ts +++ b/src/intention/dto/intention.dto.ts @@ -27,6 +27,7 @@ import { ServerAccessActionDto } from './server-access-action.dto'; import { UrlDto } from './url.dto'; @Entity({ name: 'intention' }) +// @Index(['actions.transaction.hash']) export class IntentionDto { static projectAction( intention: IntentionDto, diff --git a/src/intention/dto/package.dto.ts b/src/intention/dto/package.dto.ts index 1ba799dd..f2d3fb6d 100644 --- a/src/intention/dto/package.dto.ts +++ b/src/intention/dto/package.dto.ts @@ -8,6 +8,16 @@ export class PackageDto { @Column() architecture?: string; + @IsString() + @IsOptional() + @Column() + buildGuid?: string; + + @IsNumber() + @IsOptional() + @Column() + buildNumber?: number; + @IsString() @IsOptional() @Column() @@ -59,6 +69,7 @@ export class PackageDto { type?: string; @IsString() + @IsOptional() @Column() - version: string; + version?: string; } diff --git a/src/intention/intention.controller.ts b/src/intention/intention.controller.ts index 0484d037..657d77c1 100644 --- a/src/intention/intention.controller.ts +++ b/src/intention/intention.controller.ts @@ -22,6 +22,7 @@ import { BrokerCombinedAuthGuard } from '../auth/broker-combined-auth.guard'; import { IntentionSearchQuery } from './dto/intention-search-query.dto'; import { IntentionCloseDto } from './dto/intention-close.dto'; import { ArtifactDto } from './dto/artifact.dto'; +import { ArtifactSearchQuery } from './dto/artifact-search-query.dto'; @Controller({ path: 'intention', @@ -136,7 +137,7 @@ export class IntentionController { 'Artifacts can only be attached to backup or package-build actions', }); } - await this.intentionService.actionArtifactRegister( + return await this.intentionService.actionArtifactRegister( request, request.brokerIntentionDto, request.brokerActionDto, @@ -144,6 +145,22 @@ export class IntentionController { ); } + @Post('artifact-search') + @UseGuards(BrokerCombinedAuthGuard) + @ApiBearerAuth() + @UsePipes(new ValidationPipe({ transform: true })) + async artifactSearch(@Query() query: ArtifactSearchQuery) { + return await this.intentionService.artifactSearch( + query.buildGuid, + query.checksum, + query.name, + query.type, + query.service, + query.offset, + query.limit, + ); + } + @Post('action/start') @ApiHeader({ name: HEADER_BROKER_TOKEN, required: true }) @UseGuards(ActionGuard) diff --git a/src/intention/intention.service.ts b/src/intention/intention.service.ts index 45e228ae..eba34657 100644 --- a/src/intention/intention.service.ts +++ b/src/intention/intention.service.ts @@ -165,9 +165,9 @@ export class IntentionService { ); targetServices = targetSearch.map((t) => t.collection.name); - console.log(targetServices); } } + await this.actionService.annotate(action); const validationResult = await this.actionService.validate( intentionDto, action, @@ -301,6 +301,37 @@ export class IntentionService { } } + public async artifactSearch( + packageGuid: string | null, + artifactChecksum: string | null, + artifactName: string | null, + artifactType: string | null, + service: string | null, + offset = 0, + limit = 5, + ) { + try { + // must await to catch error + const result = await this.intentionRepository.searchArtifacts( + packageGuid, + artifactChecksum, + artifactName, + artifactType, + service, + offset, + limit, + ); + return result; + } catch (e) { + console.log(e); + throw new BadRequestException({ + statusCode: 400, + message: 'Illegal search arguement', + error: `Check parameters for errors`, + }); + } + } + private async finalizeIntention( intention: IntentionDto, outcome: 'failure' | 'success' | 'unknown', @@ -309,15 +340,18 @@ export class IntentionService { ): Promise { const endDate = new Date(); const startDate = new Date(intention.transaction.start); - intention.transaction.end = endDate.toISOString(); - intention.transaction.duration = endDate.valueOf() - startDate.valueOf(); - intention.transaction.outcome = outcome; for (const action of intention.actions) { if (action.lifecycle === 'started') { await this.actionLifecycle(req, intention, action, outcome, 'end'); + intention = await this.intentionRepository.getIntentionByToken( + intention.transaction.token, + ); } } + intention.transaction.end = endDate.toISOString(); + intention.transaction.duration = endDate.valueOf() - startDate.valueOf(); + intention.transaction.outcome = outcome; this.auditService.recordIntentionClose(req, intention, reason); if (outcome === 'success') { @@ -411,7 +445,7 @@ export class IntentionService { action.trace.token, artifact, ); - return true; + return action.package?.buildGuid; } /** diff --git a/src/persistence/interfaces/intention.repository.ts b/src/persistence/interfaces/intention.repository.ts index 7168a913..ff80d17b 100644 --- a/src/persistence/interfaces/intention.repository.ts +++ b/src/persistence/interfaces/intention.repository.ts @@ -2,7 +2,8 @@ import { FindOptionsWhere } from 'typeorm'; import { ActionDto } from '../../intention/dto/action.dto'; import { IntentionDto } from '../../intention/dto/intention.dto'; import { IntentionSearchResult } from '../../intention/dto/intention-search-result.dto'; -import { ArtifactDto } from 'src/intention/dto/artifact.dto'; +import { ArtifactDto } from '../../intention/dto/artifact.dto'; +import { ArtifactSearchResult } from '../../intention/dto/artifact-search-result.dto'; export abstract class IntentionRepository { public abstract addIntention(intention: IntentionDto): Promise; @@ -43,4 +44,14 @@ export abstract class IntentionRepository { offset: number, limit: number, ): Promise; + + public abstract searchArtifacts( + traceHash: string | null, + artifactChecksum: string | null, + artifactName: string | null, + artifactType: string | null, + service: string | null, + offset: number, + limit: number, + ): Promise; } diff --git a/src/persistence/mongo/intention-mongo.repository.ts b/src/persistence/mongo/intention-mongo.repository.ts index 57e90070..3cde5ace 100644 --- a/src/persistence/mongo/intention-mongo.repository.ts +++ b/src/persistence/mongo/intention-mongo.repository.ts @@ -7,7 +7,8 @@ import { IntentionRepository } from '../interfaces/intention.repository'; import { extractId } from './mongo.util'; import { IntentionSearchResult } from '../../intention/dto/intention-search-result.dto'; import { ObjectId } from 'mongodb'; -import { ArtifactDto } from 'src/intention/dto/artifact.dto'; +import { ArtifactDto } from '../../intention/dto/artifact.dto'; +import { ArtifactSearchResult } from '../../intention/dto/artifact-search-result.dto'; @Injectable() export class IntentionMongoRepository implements IntentionRepository { @@ -190,4 +191,63 @@ export class IntentionMongoRepository implements IntentionRepository { } }); } + + public async searchArtifacts( + traceHash: string | null, + artifactChecksum: string | null, + artifactName: string | null, + artifactType: string | null, + service: string | null, + offset: number, + limit: number, + ): Promise { + const result = await this.searchIntentions( + { + 'actions.artifacts': { $exists: true }, + ...(service ? { 'actions.service.name': service } : {}), + ...(traceHash ? { 'actions.trace.hash': traceHash } : {}), + ...(artifactChecksum + ? { 'actions.artifacts.checksum': artifactChecksum } + : {}), + ...(artifactName ? { 'actions.artifacts.name': artifactName } : {}), + ...(artifactType ? { 'actions.artifacts.type': artifactType } : {}), + } as FindOptionsWhere, + offset, + limit, + ); + + return { + artifacts: result.data + .map((intention) => { + return this.findArtifacts( + intention, + artifactChecksum, + artifactName, + artifactType, + ); + }) + .reduce((pv, cv) => pv.concat(cv), []), + ...result, + }; + } + + private findArtifacts( + intention: IntentionDto | null, + artifactChecksum: string | null, + artifactName: string | null, + artifactType: string | null, + ): { action: ActionDto; artifact: ArtifactDto }[] { + for (const action of intention.actions) { + if (!action.artifacts) { + return; + } + const artifacts = action.artifacts.filter( + (artifact) => + (!artifactChecksum || artifact.checksum === artifactChecksum) && + (!artifactName || artifact.name === artifactName) && + (!artifactType || artifact.type === artifactType), + ); + return artifacts.map((artifact) => ({ action, artifact })); + } + } } diff --git a/src/preference/preference.controller.ts b/src/preference/preference.controller.ts index 4e251f33..71cc66fd 100644 --- a/src/preference/preference.controller.ts +++ b/src/preference/preference.controller.ts @@ -12,7 +12,7 @@ import { Request as ExpressRequest } from 'express'; import { OAUTH2_CLIENT_MAP_GUID } from '../constants'; import { PreferenceService } from './preference.service'; import { BrokerOidcAuthGuard } from '../auth/broker-oidc-auth.guard'; -import { PreferenceRestDto } from 'src/persistence/dto/preference-rest.dto'; +import { PreferenceRestDto } from '../persistence/dto/preference-rest.dto'; import { get } from 'radash'; @Controller({ diff --git a/src/provision/provision.controller.ts b/src/provision/provision.controller.ts index 4c7fbc75..1e63da0a 100644 --- a/src/provision/provision.controller.ts +++ b/src/provision/provision.controller.ts @@ -24,7 +24,7 @@ export class ProvisionController { @SetMetadata('provision', [ACTION_PROVISION_APPROLE_SECRET_ID]) @UseGuards(ActionGuard, VaultRoleGuard, ProvisionGuard) @ApiHeader({ name: HEADER_BROKER_TOKEN, required: true }) - @ApiHeader({ name: HEADER_VAULT_ROLE_ID, required: true }) + @ApiHeader({ name: HEADER_VAULT_ROLE_ID }) async provisionIntentionSecretId(@Req() request: ActionGuardRequest) { return this.provisionService.generateSecretId( request, @@ -38,7 +38,7 @@ export class ProvisionController { @SetMetadata('provision', [ACTION_PROVISION_TOKEN_SELF]) @UseGuards(ActionGuard, VaultRoleGuard, ProvisionGuard) @ApiHeader({ name: HEADER_BROKER_TOKEN, required: true }) - @ApiHeader({ name: HEADER_VAULT_ROLE_ID, required: true }) + @ApiHeader({ name: HEADER_VAULT_ROLE_ID }) async provisionIntentionToken(@Req() request: ActionGuardRequest) { const roleHeader = request.headers[HEADER_VAULT_ROLE_ID]; const roleId = typeof roleHeader === 'string' ? roleHeader : roleHeader[0]; diff --git a/ui/package-lock.json b/ui/package-lock.json index e6d5262e..36f01e6c 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -9,16 +9,16 @@ "version": "0.0.0", "license": "Apache-2.0", "dependencies": { - "@angular/animations": "^17.0.3", - "@angular/cdk": "^17.0.0", - "@angular/common": "^17.0.3", - "@angular/compiler": "^17.0.3", - "@angular/core": "^17.0.3", - "@angular/forms": "^17.0.3", - "@angular/material": "^17.0.0", - "@angular/platform-browser": "^17.0.3", - "@angular/platform-browser-dynamic": "^17.0.3", - "@angular/router": "^17.0.3", + "@angular/animations": "^17.0.4", + "@angular/cdk": "^17.0.1", + "@angular/common": "^17.0.4", + "@angular/compiler": "^17.0.4", + "@angular/core": "^17.0.4", + "@angular/forms": "^17.0.4", + "@angular/material": "^17.0.1", + "@angular/platform-browser": "^17.0.4", + "@angular/platform-browser-dynamic": "^17.0.4", + "@angular/router": "^17.0.4", "@bcgov/bc-sans": "^2.1.0", "class-validator": "^0.14.0", "echarts": "^5.4.3", @@ -31,10 +31,10 @@ "zone.js": "^0.14.2" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.0.1", - "@angular/cli": "^17.0.1", - "@angular/compiler-cli": "^17.0.3", - "@types/jasmine": "^5.1.2", + "@angular-devkit/build-angular": "^17.0.2", + "@angular/cli": "^17.0.2", + "@angular/compiler-cli": "^17.0.4", + "@types/jasmine": "^5.1.3", "@types/url-regex-safe": "^1.0.2", "@types/uuid": "^9.0.7", "jasmine-core": "^5.1.1", @@ -60,12 +60,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1700.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.1.tgz", - "integrity": "sha512-w84luzQNRjlt7XxX3+jyzcwBBv3gAjjvFWTjN1E5mlpDCUXgYmQ3CMowFHeu0U06HD5Sapap9p2l6GoajuZK5Q==", + "version": "0.1700.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.2.tgz", + "integrity": "sha512-N/m0KRdc0Bk3JIVTDKgVJ1f7rELE6ejaYaTanybZFD76lJfAeuTTzZ1HJfeeXso+O/9CGRD42bRowYv3hgM+eA==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.0.1", + "@angular-devkit/core": "17.0.2", "rxjs": "7.8.1" }, "engines": { @@ -75,15 +75,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.1.tgz", - "integrity": "sha512-OomGAeBg/OOxzPpoU7EkdD3WwhKip+0Giy/cGtkalSgQ5vWTuZhf8UnxwTf7xEXW5LtvfoTtv7sKmb1dJT7FzA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.2.tgz", + "integrity": "sha512-SFg8hTKs1aIW7DBaVAwq6W2HIreI4MRf7S3jDDzITnGZS2NB1qukFk2KHRMa7A+J61Z8wry0z44CCwXmINosKQ==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1700.1", - "@angular-devkit/build-webpack": "0.1700.1", - "@angular-devkit/core": "17.0.1", + "@angular-devkit/architect": "0.1700.2", + "@angular-devkit/build-webpack": "0.1700.2", + "@angular-devkit/core": "17.0.2", "@babel/core": "7.23.2", "@babel/generator": "7.23.0", "@babel/helper-annotate-as-pure": "7.22.5", @@ -94,7 +94,7 @@ "@babel/preset-env": "7.23.2", "@babel/runtime": "7.23.2", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.0.1", + "@ngtools/webpack": "17.0.2", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.16", @@ -633,12 +633,12 @@ "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1700.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.1.tgz", - "integrity": "sha512-u9LTcG9Kg2J6WkF1WSoBLdDabhbKxcuHY24SouAJTwg33j6YksglL7qnofOsNxny3Gdnze2BhCjQ1GS9Y8ovXw==", + "version": "0.1700.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.2.tgz", + "integrity": "sha512-hvUJaHwU59usxmX08/6hdIeN/sB8PgeqV0g/fP5bgr0J0la6ojYl8WS5Ndsp9hmol1Q4bIVpQTV8BUa4U8/wYA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1700.1", + "@angular-devkit/architect": "0.1700.2", "rxjs": "7.8.1" }, "engines": { @@ -652,9 +652,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.1.tgz", - "integrity": "sha512-UjNx9fZW0oU7UaeoB0HblYz/Nm8MWtinAe39XkY+zjECLWqKAcHPotfYjucXiky1UlBUOScIKbwjMDdEY8xkuw==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.2.tgz", + "integrity": "sha512-wmQyiXIqmdm9KSiB7d5SnDaqqRZSsZ7Oy2kEI4gUyLr2y9icj/4zpTpYvsqKyhF1NMU8ElZ5b4s1ru2pirlDVg==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -691,12 +691,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.1.tgz", - "integrity": "sha512-bwgdGviRZC5X8Tl4QcjtIJAcC0p8yIhOyYVFrq4PWYvI+DfV9P6w3OFuoS6rwEoiIQR90+12iKBYMt1MfL/c0Q==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.2.tgz", + "integrity": "sha512-NOGC/TN6M+Vt2vSR3D1t3v8RNn2lm02nkm8UniACkwqnCjod5Npt1CfdweOSLEDaO5TR6xemG2+0gl0yGRXJ7w==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.0.1", + "@angular-devkit/core": "17.0.2", "jsonc-parser": "3.2.0", "magic-string": "0.30.5", "ora": "5.4.1", @@ -709,9 +709,9 @@ } }, "node_modules/@angular/animations": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.0.3.tgz", - "integrity": "sha512-aBLVJ0HHYdIZCAXymQDP6UGuz/5oM/3uLCFVHx32vhibLByjw0jNCvy2lzmPLU5gUU6wEWX2b3ZtnzFqhmo4+A==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.0.4.tgz", + "integrity": "sha512-XHkTBZAoYf1t4Hb06RkYa6cgtjEA5JGq1ArXu/DckOS6G/ZuY+dwWULEmaf9ejJem8O78ol223ZQ5d7sXqpixQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -719,13 +719,13 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.0.3" + "@angular/core": "17.0.4" } }, "node_modules/@angular/cdk": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.0.0.tgz", - "integrity": "sha512-8F1z0YhDjKWqB29+AUh33OKr2Ts5PVUUogVXEVmmPipPDtj82iIQLbtBnR6xpWvmsw9mS3oD76EwBoUhHQgi6g==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.0.1.tgz", + "integrity": "sha512-0hrXm2D0s0/vUtDoLFRWTs75k5WY/hQmfnsaJXHeqinbE3eKOxmQxL1i7ymnMSQthEWzgRAhzS3Nfs7Alw3dQA==", "dependencies": { "tslib": "^2.3.0" }, @@ -751,15 +751,15 @@ } }, "node_modules/@angular/cli": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.1.tgz", - "integrity": "sha512-3iJWw+bpr/8y1ZY1m0wGfukffQVmD6DJUNubB297NCq1bJyUj+uwBuDnpIH+vidJvPBEEY+9XPJr0Jnd6+i7rg==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.2.tgz", + "integrity": "sha512-ebKFDtyRZHLKqr1f8cOKDWVybNPfo5JVctRWCJ+FghVDQARl6gsZaJG4twkf3DIgBaSShtHK4JSjTrHtG2RWjg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1700.1", - "@angular-devkit/core": "17.0.1", - "@angular-devkit/schematics": "17.0.1", - "@schematics/angular": "17.0.1", + "@angular-devkit/architect": "0.1700.2", + "@angular-devkit/core": "17.0.2", + "@angular-devkit/schematics": "17.0.2", + "@schematics/angular": "17.0.2", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -818,9 +818,9 @@ "dev": true }, "node_modules/@angular/common": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.3.tgz", - "integrity": "sha512-AD/d1n0hNisHDhIeBsW2ERZI9ChjiOuZ3IiGwcYKmlcOHTrZTJPAh/ZMgahv24rArlNVax7bT+Ik8+sJedGcEQ==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.4.tgz", + "integrity": "sha512-/y38PbuiaWOuOmP5ZELTlJSjZGijc6Nq2XQloT5pKsaH935prxPjyWazwlY6cUnJMQgSRU644/ULosDJec7Zxw==", "dependencies": { "tslib": "^2.3.0" }, @@ -828,14 +828,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.0.3", + "@angular/core": "17.0.4", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.3.tgz", - "integrity": "sha512-ryUcj8Vc+Q4jMrjrmsEIsGLXeWSmNE/KoTyURPCH+NWq9GBMbjv4oe0/oFSBMN2ZtRMVCvqv2Nq+Z2KRDRGB0A==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.4.tgz", + "integrity": "sha512-OweJui9EWCa1ZcZjkJHS5z1gqICqyryR1Gdmyr8vIa6HD8wU/5BaeBJPCDgYgt+qJkvcT/sPxgZQsc2pVeUwbQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -843,7 +843,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.0.3" + "@angular/core": "17.0.4" }, "peerDependenciesMeta": { "@angular/core": { @@ -852,9 +852,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.3.tgz", - "integrity": "sha512-oj7KJBFgs6ulT1/A/xkkDHBOB0c7o9HV2Mn5pUosXBo2VgcGYeuJeXffC+mFr5FyiRO1sUanw4vSWnLzK1U0pQ==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.4.tgz", + "integrity": "sha512-ywj8XNI+hvHHYGcNWvXaVHSRtcd3S7MqJNgXWfnb0JjAb282oGSvjEc7wnH4ERqkvnSrpk1kQ2Fj3uJ2P5zfmQ==", "dev": true, "dependencies": { "@babel/core": "7.23.2", @@ -875,14 +875,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.0.3", + "@angular/compiler": "17.0.4", "typescript": ">=5.2 <5.3" } }, "node_modules/@angular/core": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.3.tgz", - "integrity": "sha512-zY4yhPiphuktrodaM+GiP8G07qnUlmwKElLjYazeIR8A+kF51RQRpSf/pWe5M0uJIn5Oja+RdO9kzhDI9QvOcA==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.4.tgz", + "integrity": "sha512-zk+z5sYPZd87pLxECx27quB5FvSmoi9PjJlcSlaBwwqaGnh/tPJI14u3q1dRY/CoZgP9egEiwc428+DzvOzJew==", "dependencies": { "tslib": "^2.3.0" }, @@ -895,9 +895,9 @@ } }, "node_modules/@angular/forms": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.0.3.tgz", - "integrity": "sha512-slCUGe5nVOrA0Su9pkmgPXBVzkgh4stvVFBb6ic9/+GlmtRi8h1v5jAFhR4B0R4iaaIoF+TTpRKhZShwtFSqSg==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.0.4.tgz", + "integrity": "sha512-R5J87dfJNWwi5SESD7tRkZnqG4u8KNAT4vImX4oG70/6vWioKUSWpLoSp1gpzy9UW51E85AKb8DNvIex7LclSg==", "dependencies": { "tslib": "^2.3.0" }, @@ -905,16 +905,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.0.3", - "@angular/core": "17.0.3", - "@angular/platform-browser": "17.0.3", + "@angular/common": "17.0.4", + "@angular/core": "17.0.4", + "@angular/platform-browser": "17.0.4", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-17.0.0.tgz", - "integrity": "sha512-rd7H7NhkDPDiyLHADm2FHOJlmgaWV7ZYNYPe/4yTXlt++GTSLhKus+PTCZYVsKGlA3mxDhNnC1RY+fdjtx/G2A==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-17.0.1.tgz", + "integrity": "sha512-avicxHCJAeg26Tg8z6+g54tMTQZPP5kaaRmkd97QGtJn3wKiAen6WOgmEhlrA4jPJ71CsdyxcUruEX+BHB6X4Q==", "dependencies": { "@material/animation": "15.0.0-canary.a246a4439.0", "@material/auto-init": "15.0.0-canary.a246a4439.0", @@ -967,7 +967,7 @@ }, "peerDependencies": { "@angular/animations": "^17.0.0 || ^18.0.0", - "@angular/cdk": "17.0.0", + "@angular/cdk": "17.0.1", "@angular/common": "^17.0.0 || ^18.0.0", "@angular/core": "^17.0.0 || ^18.0.0", "@angular/forms": "^17.0.0 || ^18.0.0", @@ -976,9 +976,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.3.tgz", - "integrity": "sha512-4SoW0yeAxgfcLIekKsvZVg/WgI5aQZyz9HGOoyBcVQ8coYoZmM9bAYQi+9zvyweqoWc+jgw72X1E8wtmMXt7Aw==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.4.tgz", + "integrity": "sha512-lApUzVPfCEz/4aot77qzWUNg7yQgT0JSzy3BrBm95+2TbgH894J9Fswhig0sEN9jxGSkc3A5Yp5fs1HJcPqUiw==", "dependencies": { "tslib": "^2.3.0" }, @@ -986,9 +986,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.0.3", - "@angular/common": "17.0.3", - "@angular/core": "17.0.3" + "@angular/animations": "17.0.4", + "@angular/common": "17.0.4", + "@angular/core": "17.0.4" }, "peerDependenciesMeta": { "@angular/animations": { @@ -997,9 +997,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.3.tgz", - "integrity": "sha512-Ab6ZeGG63z9Ilv8r4lHcmSirVaw8quRrPjDbT8cgIteHbj0SbwgDzxX0ve+fjjubFUluNSNtc6OYglWMHJ/g7Q==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.4.tgz", + "integrity": "sha512-mZZNH+iFzFug0z7rBQKdFz375sR6Y4iBbHu2aJD2BpgA2/SJaZ0WHGlF4bHbtpCYkZi3f4wKF2+Cwe4G5ebPOQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -1007,16 +1007,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.0.3", - "@angular/compiler": "17.0.3", - "@angular/core": "17.0.3", - "@angular/platform-browser": "17.0.3" + "@angular/common": "17.0.4", + "@angular/compiler": "17.0.4", + "@angular/core": "17.0.4", + "@angular/platform-browser": "17.0.4" } }, "node_modules/@angular/router": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.0.3.tgz", - "integrity": "sha512-zw31XXMqLJ1CcHxDtEl2/FTJXeRbbnLM8oHtCPzbbxTkhAlnXxSYxjds0+1IMmpzz/v9qGBhYvUt8ZfZhqDBHQ==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.0.4.tgz", + "integrity": "sha512-hQ+T+h6YE9NqyOmjqAIHe/k8xtW+yh0Mp8FCcl8REBezNyLXmOdsScCIOOc7GeFtbjRnQyJrBo4QxZ81acHP7Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -1024,9 +1024,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.0.3", - "@angular/core": "17.0.3", - "@angular/platform-browser": "17.0.3", + "@angular/common": "17.0.4", + "@angular/core": "17.0.4", + "@angular/platform-browser": "17.0.4", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -4088,9 +4088,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.1.tgz", - "integrity": "sha512-IfiWIBY1GntfJFV/U1CSOHZ7zF5p0zFMFzux7/iGXUXit299LTdJ5mZTe9++lFcH6dPHgEPWlinuYAfzorY4ng==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.2.tgz", + "integrity": "sha512-6pRp00NLdbXopqmNSSnMsliMW4soEVkICmkUJ7STm0Tc/9Bd6h2iaNSoNOUDq5EyV1+kJCRWjBWjlHoD66BJHA==", "dev": true, "engines": { "node": "^18.13.0 || >=20.9.0", @@ -4345,13 +4345,13 @@ } }, "node_modules/@schematics/angular": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.1.tgz", - "integrity": "sha512-BacI1fQsEXNYkfJzDJn3CsUSc9A4M7nhXtvt3XjceUhOqUp2AR4uIeUwDOrpLnkRwv5+rZLafUnRN3k01WUJOw==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.2.tgz", + "integrity": "sha512-orJx36TzDBBNcKGi2POg4b2nHxypS0iM+cFAOQkrmuuXTdBvaPOp7WEUQYDGzVpleqXmkqhRyrhVCXBZ9MbekQ==", "dev": true, "dependencies": { - "@angular-devkit/core": "17.0.1", - "@angular-devkit/schematics": "17.0.1", + "@angular-devkit/core": "17.0.2", + "@angular-devkit/schematics": "17.0.2", "jsonc-parser": "3.2.0" }, "engines": { @@ -4465,9 +4465,9 @@ } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz", - "integrity": "sha512-6mfQ6iNvhSKCZJoY6sIG3m0pKkdUcweVNOLuBBKvoWGzl2yRxOJcYOTRyLKt3nxXvBLJWa6QkW//tgbIwJehmA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -4555,9 +4555,9 @@ } }, "node_modules/@types/jasmine": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.2.tgz", - "integrity": "sha512-GJzYZWAr7aZuVsQwo77ErgdnqiXiz1lwsXXKgsJEwMlAxWQqjpiTGh0JOpLGXSlIFvIAFbgZTHs0u+jBzh/GFg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.3.tgz", + "integrity": "sha512-p86WqZZDuj3WGkf8Ltz+9OoRITkek4uk6GCz5zvbtWKHvEt2+Ib0xIbeD1/KfA5QmWe1G5YCrAtC8K0/CGJJHA==", "dev": true }, "node_modules/@types/json-schema": { @@ -4579,9 +4579,9 @@ "dev": true }, "node_modules/@types/node-forge": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.9.tgz", - "integrity": "sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==", + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", + "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", "dev": true, "dependencies": { "@types/node": "*" @@ -4662,9 +4662,9 @@ "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==" }, "node_modules/@types/ws": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", - "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "dependencies": { "@types/node": "*" @@ -13851,25 +13851,25 @@ } }, "@angular-devkit/architect": { - "version": "0.1700.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.1.tgz", - "integrity": "sha512-w84luzQNRjlt7XxX3+jyzcwBBv3gAjjvFWTjN1E5mlpDCUXgYmQ3CMowFHeu0U06HD5Sapap9p2l6GoajuZK5Q==", + "version": "0.1700.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.2.tgz", + "integrity": "sha512-N/m0KRdc0Bk3JIVTDKgVJ1f7rELE6ejaYaTanybZFD76lJfAeuTTzZ1HJfeeXso+O/9CGRD42bRowYv3hgM+eA==", "dev": true, "requires": { - "@angular-devkit/core": "17.0.1", + "@angular-devkit/core": "17.0.2", "rxjs": "7.8.1" } }, "@angular-devkit/build-angular": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.1.tgz", - "integrity": "sha512-OomGAeBg/OOxzPpoU7EkdD3WwhKip+0Giy/cGtkalSgQ5vWTuZhf8UnxwTf7xEXW5LtvfoTtv7sKmb1dJT7FzA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.2.tgz", + "integrity": "sha512-SFg8hTKs1aIW7DBaVAwq6W2HIreI4MRf7S3jDDzITnGZS2NB1qukFk2KHRMa7A+J61Z8wry0z44CCwXmINosKQ==", "dev": true, "requires": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1700.1", - "@angular-devkit/build-webpack": "0.1700.1", - "@angular-devkit/core": "17.0.1", + "@angular-devkit/architect": "0.1700.2", + "@angular-devkit/build-webpack": "0.1700.2", + "@angular-devkit/core": "17.0.2", "@babel/core": "7.23.2", "@babel/generator": "7.23.0", "@babel/helper-annotate-as-pure": "7.22.5", @@ -13880,7 +13880,7 @@ "@babel/preset-env": "7.23.2", "@babel/runtime": "7.23.2", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.0.1", + "@ngtools/webpack": "17.0.2", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.16", @@ -14152,19 +14152,19 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1700.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.1.tgz", - "integrity": "sha512-u9LTcG9Kg2J6WkF1WSoBLdDabhbKxcuHY24SouAJTwg33j6YksglL7qnofOsNxny3Gdnze2BhCjQ1GS9Y8ovXw==", + "version": "0.1700.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.2.tgz", + "integrity": "sha512-hvUJaHwU59usxmX08/6hdIeN/sB8PgeqV0g/fP5bgr0J0la6ojYl8WS5Ndsp9hmol1Q4bIVpQTV8BUa4U8/wYA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1700.1", + "@angular-devkit/architect": "0.1700.2", "rxjs": "7.8.1" } }, "@angular-devkit/core": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.1.tgz", - "integrity": "sha512-UjNx9fZW0oU7UaeoB0HblYz/Nm8MWtinAe39XkY+zjECLWqKAcHPotfYjucXiky1UlBUOScIKbwjMDdEY8xkuw==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.2.tgz", + "integrity": "sha512-wmQyiXIqmdm9KSiB7d5SnDaqqRZSsZ7Oy2kEI4gUyLr2y9icj/4zpTpYvsqKyhF1NMU8ElZ5b4s1ru2pirlDVg==", "dev": true, "requires": { "ajv": "8.12.0", @@ -14184,12 +14184,12 @@ } }, "@angular-devkit/schematics": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.1.tgz", - "integrity": "sha512-bwgdGviRZC5X8Tl4QcjtIJAcC0p8yIhOyYVFrq4PWYvI+DfV9P6w3OFuoS6rwEoiIQR90+12iKBYMt1MfL/c0Q==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.2.tgz", + "integrity": "sha512-NOGC/TN6M+Vt2vSR3D1t3v8RNn2lm02nkm8UniACkwqnCjod5Npt1CfdweOSLEDaO5TR6xemG2+0gl0yGRXJ7w==", "dev": true, "requires": { - "@angular-devkit/core": "17.0.1", + "@angular-devkit/core": "17.0.2", "jsonc-parser": "3.2.0", "magic-string": "0.30.5", "ora": "5.4.1", @@ -14197,17 +14197,17 @@ } }, "@angular/animations": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.0.3.tgz", - "integrity": "sha512-aBLVJ0HHYdIZCAXymQDP6UGuz/5oM/3uLCFVHx32vhibLByjw0jNCvy2lzmPLU5gUU6wEWX2b3ZtnzFqhmo4+A==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.0.4.tgz", + "integrity": "sha512-XHkTBZAoYf1t4Hb06RkYa6cgtjEA5JGq1ArXu/DckOS6G/ZuY+dwWULEmaf9ejJem8O78ol223ZQ5d7sXqpixQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/cdk": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.0.0.tgz", - "integrity": "sha512-8F1z0YhDjKWqB29+AUh33OKr2Ts5PVUUogVXEVmmPipPDtj82iIQLbtBnR6xpWvmsw9mS3oD76EwBoUhHQgi6g==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.0.1.tgz", + "integrity": "sha512-0hrXm2D0s0/vUtDoLFRWTs75k5WY/hQmfnsaJXHeqinbE3eKOxmQxL1i7ymnMSQthEWzgRAhzS3Nfs7Alw3dQA==", "requires": { "parse5": "^7.1.2", "tslib": "^2.3.0" @@ -14225,15 +14225,15 @@ } }, "@angular/cli": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.1.tgz", - "integrity": "sha512-3iJWw+bpr/8y1ZY1m0wGfukffQVmD6DJUNubB297NCq1bJyUj+uwBuDnpIH+vidJvPBEEY+9XPJr0Jnd6+i7rg==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.2.tgz", + "integrity": "sha512-ebKFDtyRZHLKqr1f8cOKDWVybNPfo5JVctRWCJ+FghVDQARl6gsZaJG4twkf3DIgBaSShtHK4JSjTrHtG2RWjg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1700.1", - "@angular-devkit/core": "17.0.1", - "@angular-devkit/schematics": "17.0.1", - "@schematics/angular": "17.0.1", + "@angular-devkit/architect": "0.1700.2", + "@angular-devkit/core": "17.0.2", + "@angular-devkit/schematics": "17.0.2", + "@schematics/angular": "17.0.2", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.1", @@ -14277,25 +14277,25 @@ } }, "@angular/common": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.3.tgz", - "integrity": "sha512-AD/d1n0hNisHDhIeBsW2ERZI9ChjiOuZ3IiGwcYKmlcOHTrZTJPAh/ZMgahv24rArlNVax7bT+Ik8+sJedGcEQ==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.4.tgz", + "integrity": "sha512-/y38PbuiaWOuOmP5ZELTlJSjZGijc6Nq2XQloT5pKsaH935prxPjyWazwlY6cUnJMQgSRU644/ULosDJec7Zxw==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.3.tgz", - "integrity": "sha512-ryUcj8Vc+Q4jMrjrmsEIsGLXeWSmNE/KoTyURPCH+NWq9GBMbjv4oe0/oFSBMN2ZtRMVCvqv2Nq+Z2KRDRGB0A==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.4.tgz", + "integrity": "sha512-OweJui9EWCa1ZcZjkJHS5z1gqICqyryR1Gdmyr8vIa6HD8wU/5BaeBJPCDgYgt+qJkvcT/sPxgZQsc2pVeUwbQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.3.tgz", - "integrity": "sha512-oj7KJBFgs6ulT1/A/xkkDHBOB0c7o9HV2Mn5pUosXBo2VgcGYeuJeXffC+mFr5FyiRO1sUanw4vSWnLzK1U0pQ==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.4.tgz", + "integrity": "sha512-ywj8XNI+hvHHYGcNWvXaVHSRtcd3S7MqJNgXWfnb0JjAb282oGSvjEc7wnH4ERqkvnSrpk1kQ2Fj3uJ2P5zfmQ==", "dev": true, "requires": { "@babel/core": "7.23.2", @@ -14309,25 +14309,25 @@ } }, "@angular/core": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.3.tgz", - "integrity": "sha512-zY4yhPiphuktrodaM+GiP8G07qnUlmwKElLjYazeIR8A+kF51RQRpSf/pWe5M0uJIn5Oja+RdO9kzhDI9QvOcA==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.4.tgz", + "integrity": "sha512-zk+z5sYPZd87pLxECx27quB5FvSmoi9PjJlcSlaBwwqaGnh/tPJI14u3q1dRY/CoZgP9egEiwc428+DzvOzJew==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.0.3.tgz", - "integrity": "sha512-slCUGe5nVOrA0Su9pkmgPXBVzkgh4stvVFBb6ic9/+GlmtRi8h1v5jAFhR4B0R4iaaIoF+TTpRKhZShwtFSqSg==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.0.4.tgz", + "integrity": "sha512-R5J87dfJNWwi5SESD7tRkZnqG4u8KNAT4vImX4oG70/6vWioKUSWpLoSp1gpzy9UW51E85AKb8DNvIex7LclSg==", "requires": { "tslib": "^2.3.0" } }, "@angular/material": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-17.0.0.tgz", - "integrity": "sha512-rd7H7NhkDPDiyLHADm2FHOJlmgaWV7ZYNYPe/4yTXlt++GTSLhKus+PTCZYVsKGlA3mxDhNnC1RY+fdjtx/G2A==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-17.0.1.tgz", + "integrity": "sha512-avicxHCJAeg26Tg8z6+g54tMTQZPP5kaaRmkd97QGtJn3wKiAen6WOgmEhlrA4jPJ71CsdyxcUruEX+BHB6X4Q==", "requires": { "@material/animation": "15.0.0-canary.a246a4439.0", "@material/auto-init": "15.0.0-canary.a246a4439.0", @@ -14380,25 +14380,25 @@ } }, "@angular/platform-browser": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.3.tgz", - "integrity": "sha512-4SoW0yeAxgfcLIekKsvZVg/WgI5aQZyz9HGOoyBcVQ8coYoZmM9bAYQi+9zvyweqoWc+jgw72X1E8wtmMXt7Aw==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.4.tgz", + "integrity": "sha512-lApUzVPfCEz/4aot77qzWUNg7yQgT0JSzy3BrBm95+2TbgH894J9Fswhig0sEN9jxGSkc3A5Yp5fs1HJcPqUiw==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.3.tgz", - "integrity": "sha512-Ab6ZeGG63z9Ilv8r4lHcmSirVaw8quRrPjDbT8cgIteHbj0SbwgDzxX0ve+fjjubFUluNSNtc6OYglWMHJ/g7Q==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.4.tgz", + "integrity": "sha512-mZZNH+iFzFug0z7rBQKdFz375sR6Y4iBbHu2aJD2BpgA2/SJaZ0WHGlF4bHbtpCYkZi3f4wKF2+Cwe4G5ebPOQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.0.3.tgz", - "integrity": "sha512-zw31XXMqLJ1CcHxDtEl2/FTJXeRbbnLM8oHtCPzbbxTkhAlnXxSYxjds0+1IMmpzz/v9qGBhYvUt8ZfZhqDBHQ==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.0.4.tgz", + "integrity": "sha512-hQ+T+h6YE9NqyOmjqAIHe/k8xtW+yh0Mp8FCcl8REBezNyLXmOdsScCIOOc7GeFtbjRnQyJrBo4QxZ81acHP7Q==", "requires": { "tslib": "^2.3.0" } @@ -16683,9 +16683,9 @@ } }, "@ngtools/webpack": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.1.tgz", - "integrity": "sha512-IfiWIBY1GntfJFV/U1CSOHZ7zF5p0zFMFzux7/iGXUXit299LTdJ5mZTe9++lFcH6dPHgEPWlinuYAfzorY4ng==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.2.tgz", + "integrity": "sha512-6pRp00NLdbXopqmNSSnMsliMW4soEVkICmkUJ7STm0Tc/9Bd6h2iaNSoNOUDq5EyV1+kJCRWjBWjlHoD66BJHA==", "dev": true, "requires": {} }, @@ -16870,13 +16870,13 @@ "optional": true }, "@schematics/angular": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.1.tgz", - "integrity": "sha512-BacI1fQsEXNYkfJzDJn3CsUSc9A4M7nhXtvt3XjceUhOqUp2AR4uIeUwDOrpLnkRwv5+rZLafUnRN3k01WUJOw==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.2.tgz", + "integrity": "sha512-orJx36TzDBBNcKGi2POg4b2nHxypS0iM+cFAOQkrmuuXTdBvaPOp7WEUQYDGzVpleqXmkqhRyrhVCXBZ9MbekQ==", "dev": true, "requires": { - "@angular-devkit/core": "17.0.1", - "@angular-devkit/schematics": "17.0.1", + "@angular-devkit/core": "17.0.2", + "@angular-devkit/schematics": "17.0.2", "jsonc-parser": "3.2.0" } }, @@ -16967,9 +16967,9 @@ } }, "@types/connect-history-api-fallback": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz", - "integrity": "sha512-6mfQ6iNvhSKCZJoY6sIG3m0pKkdUcweVNOLuBBKvoWGzl2yRxOJcYOTRyLKt3nxXvBLJWa6QkW//tgbIwJehmA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, "requires": { "@types/express-serve-static-core": "*", @@ -17057,9 +17057,9 @@ } }, "@types/jasmine": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.2.tgz", - "integrity": "sha512-GJzYZWAr7aZuVsQwo77ErgdnqiXiz1lwsXXKgsJEwMlAxWQqjpiTGh0JOpLGXSlIFvIAFbgZTHs0u+jBzh/GFg==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.3.tgz", + "integrity": "sha512-p86WqZZDuj3WGkf8Ltz+9OoRITkek4uk6GCz5zvbtWKHvEt2+Ib0xIbeD1/KfA5QmWe1G5YCrAtC8K0/CGJJHA==", "dev": true }, "@types/json-schema": { @@ -17081,9 +17081,9 @@ "dev": true }, "@types/node-forge": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.9.tgz", - "integrity": "sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==", + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", + "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", "dev": true, "requires": { "@types/node": "*" @@ -17164,9 +17164,9 @@ "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==" }, "@types/ws": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", - "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "requires": { "@types/node": "*" diff --git a/ui/package.json b/ui/package.json index 7a30b0b5..c6f3a020 100644 --- a/ui/package.json +++ b/ui/package.json @@ -12,16 +12,16 @@ "private": true, "license": "Apache-2.0", "dependencies": { - "@angular/animations": "^17.0.3", - "@angular/cdk": "^17.0.0", - "@angular/common": "^17.0.3", - "@angular/compiler": "^17.0.3", - "@angular/core": "^17.0.3", - "@angular/forms": "^17.0.3", - "@angular/material": "^17.0.0", - "@angular/platform-browser": "^17.0.3", - "@angular/platform-browser-dynamic": "^17.0.3", - "@angular/router": "^17.0.3", + "@angular/animations": "^17.0.4", + "@angular/cdk": "^17.0.1", + "@angular/common": "^17.0.4", + "@angular/compiler": "^17.0.4", + "@angular/core": "^17.0.4", + "@angular/forms": "^17.0.4", + "@angular/material": "^17.0.1", + "@angular/platform-browser": "^17.0.4", + "@angular/platform-browser-dynamic": "^17.0.4", + "@angular/router": "^17.0.4", "@bcgov/bc-sans": "^2.1.0", "class-validator": "^0.14.0", "echarts": "^5.4.3", @@ -34,10 +34,10 @@ "zone.js": "^0.14.2" }, "devDependencies": { - "@angular-devkit/build-angular": "^17.0.1", - "@angular/cli": "^17.0.1", - "@angular/compiler-cli": "^17.0.3", - "@types/jasmine": "^5.1.2", + "@angular-devkit/build-angular": "^17.0.2", + "@angular/cli": "^17.0.2", + "@angular/compiler-cli": "^17.0.4", + "@types/jasmine": "^5.1.3", "@types/url-regex-safe": "^1.0.2", "@types/uuid": "^9.0.7", "jasmine-core": "^5.1.1", @@ -48,4 +48,4 @@ "karma-jasmine-html-reporter": "^2.1.0", "typescript": "5.2.2" } -} \ No newline at end of file +}