From a895365c408d53530a2f155d83d5494c2e2891a8 Mon Sep 17 00:00:00 2001 From: Tyagi-Sunny Date: Thu, 26 Sep 2024 17:50:33 +0530 Subject: [PATCH] feat(tenant-management): add keycloak idp configuration add keycloak idp configuration BREAKING CHANGE: yes 43 --- package-lock.json | 1120 ++++++++--------- ...20240925102459-add-table-tenant-configs.js | 53 + ...25102459-add-table-tenant-configs-down.sql | 1 + ...0925102459-add-table-tenant-configs-up.sql | 17 + .../src/component.ts | 8 +- .../src/controllers/idp.controller.ts | 66 + .../src/controllers/index.ts | 2 + .../tenant-config-tenant.controller.ts | 38 + .../controllers/tenant-config.controller.ts | 150 +++ .../tenant-management-service/src/keys.ts | 26 +- .../src/models/dtos/idp-details-dto.model.ts | 31 + .../src/models/dtos/tenant-dto.model.ts | 33 + .../src/models/index.ts | 1 + .../src/models/tenant-config.model.ts | 46 + .../providers/idp/idp-keycloak.provider.ts | 138 ++ .../src/providers/idp/index.ts | 0 .../src/repositories/index.ts | 1 + .../repositories/tenant-config.repository.ts | 27 + .../src/types/i-idp.interface.ts | 15 + .../src/types/index.ts | 1 + .../src/webhook.component.ts | 13 +- 21 files changed, 1186 insertions(+), 601 deletions(-) create mode 100644 services/tenant-management-service/migrations/pg/migrations/20240925102459-add-table-tenant-configs.js create mode 100644 services/tenant-management-service/migrations/pg/migrations/sqls/20240925102459-add-table-tenant-configs-down.sql create mode 100644 services/tenant-management-service/migrations/pg/migrations/sqls/20240925102459-add-table-tenant-configs-up.sql create mode 100644 services/tenant-management-service/src/controllers/idp.controller.ts create mode 100644 services/tenant-management-service/src/controllers/tenant-config-tenant.controller.ts create mode 100644 services/tenant-management-service/src/controllers/tenant-config.controller.ts create mode 100644 services/tenant-management-service/src/models/dtos/idp-details-dto.model.ts create mode 100644 services/tenant-management-service/src/models/dtos/tenant-dto.model.ts create mode 100644 services/tenant-management-service/src/models/tenant-config.model.ts create mode 100644 services/tenant-management-service/src/providers/idp/idp-keycloak.provider.ts create mode 100644 services/tenant-management-service/src/providers/idp/index.ts create mode 100644 services/tenant-management-service/src/repositories/tenant-config.repository.ts create mode 100644 services/tenant-management-service/src/types/i-idp.interface.ts diff --git a/package-lock.json b/package-lock.json index bf1f958..9f0236f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,9 +53,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -107,12 +107,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "dev": true, "dependencies": { - "@babel/types": "^7.25.0", + "@babel/types": "^7.25.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -233,13 +233,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", "dev": true, "dependencies": { "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/types": "^7.25.6" }, "engines": { "node": ">=6.9.0" @@ -332,12 +332,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", "dev": true, "dependencies": { - "@babel/types": "^7.25.2" + "@babel/types": "^7.25.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -347,9 +347,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -373,16 +373,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", + "@babel/types": "^7.25.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -400,9 +400,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.24.8", @@ -414,9 +414,9 @@ } }, "node_modules/@codegenie/serverless-express": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@codegenie/serverless-express/-/serverless-express-4.14.1.tgz", - "integrity": "sha512-B90/1OmA9mf9bEJnplLj7FGf+N2v2ikB68c/9W9uXmCa4ep/V00ymCiivwGLyeuzQRW33tcj4+KxZ2utfmu39Q==", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@codegenie/serverless-express/-/serverless-express-4.15.0.tgz", + "integrity": "sha512-adnKbnW1Tg5LAe0lcbyoRchu8G6+gLwP1rvgwfHvTbCwvBQNfhsgnzq4cKkLn7ZKn2sa4JZNis/Gn/2jWBWa4A==", "dev": true, "engines": { "node": ">=12" @@ -738,9 +738,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -792,9 +792,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -856,13 +856,13 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -938,9 +938,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "engines": { "node": ">=12" }, @@ -1526,17 +1526,17 @@ } }, "node_modules/@loopback/boot": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@loopback/boot/-/boot-7.0.4.tgz", - "integrity": "sha512-LWF2EOMu2U5uoJGGx6eA0fbvztWSmlmjaCag+xVbB2yAohW6QMwVXpjlk0WauGGlwmGwKfKSbGUScdFKl2VeEQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@loopback/boot/-/boot-7.0.6.tgz", + "integrity": "sha512-xMe2gLHHjkN2s0mMgaGjvSAhLe1elyk3HXcTru1sMUDKIEvJLer59yrTI57GQbsmJT/3rLe6AQhzSmzxGOcSkg==", "dependencies": { - "@loopback/model-api-builder": "^6.0.4", - "@loopback/repository": "^7.0.4", - "@loopback/service-proxy": "^7.0.4", + "@loopback/model-api-builder": "^6.0.6", + "@loopback/repository": "^7.0.6", + "@loopback/service-proxy": "^7.0.6", "@types/debug": "^4.1.12", "@types/glob": "^8.1.0", - "debug": "^4.3.5", - "glob": "^10.4.2", + "debug": "^4.3.7", + "glob": "^10.4.5", "tslib": "^2.6.3" }, "engines": { @@ -1547,23 +1547,23 @@ } }, "node_modules/@loopback/build": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@loopback/build/-/build-11.0.4.tgz", - "integrity": "sha512-Ilm7GabuRqinsyZDh/rLJc0PeY0X7gbFZ3LZnuwfok0ywrFA38DnP6/PU24A+2XkypufJOm0MaWVgiHJRGWu2w==", + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/@loopback/build/-/build-11.0.6.tgz", + "integrity": "sha512-9m2k0hkL9q6uwqFXNComp+r8Qar2GZIenlQET36nkFxkzXi/Nex+u4+0/FIo8QN0sLC56Eek9+5vt2/XVBBtJw==", "dev": true, "dependencies": { - "@loopback/eslint-config": "^15.0.3", + "@loopback/eslint-config": "^15.0.4", "@types/mocha": "^10.0.7", "@types/node": "^16.18.101", "cross-spawn": "^7.0.3", - "debug": "^4.3.5", + "debug": "^4.3.7", "eslint": "^8.57.0", "fs-extra": "^11.2.0", - "glob": "^10.4.2", + "glob": "^10.4.5", "lodash": "^4.17.21", "mocha": "^10.6.0", "nyc": "^17.0.0", - "prettier": "^3.2.5", + "prettier": "^3.3.2", "rimraf": "^5.0.7", "source-map-support": "^0.5.21", "typescript": "~5.2.2" @@ -1582,9 +1582,9 @@ } }, "node_modules/@loopback/build/node_modules/@types/node": { - "version": "16.18.104", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.104.tgz", - "integrity": "sha512-OF3keVCbfPlkzxnnDBUZJn1RiCJzKeadjiW0xTEb0G1SUJ5gDVb3qnzZr2T4uIFvsbKJbXy1v2DN7e2zaEY7jQ==", + "version": "16.18.108", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.108.tgz", + "integrity": "sha512-fj42LD82fSv6yN9C6Q4dzS+hujHj+pTv0IpRR3kI20fnYeS0ytBpjFO9OjmDowSPPt4lNKN46JLaKbCyP+BW2A==", "dev": true }, "node_modules/@loopback/build/node_modules/brace-expansion": { @@ -1621,19 +1621,6 @@ "node": ">=8" } }, - "node_modules/@loopback/build/node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@loopback/build/node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", @@ -1713,9 +1700,9 @@ } }, "node_modules/@loopback/build/node_modules/nyc": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.0.0.tgz", - "integrity": "sha512-ISp44nqNCaPugLLGGfknzQwSwt10SSS5IMoPR7GLoMAyS18Iw5js8U7ga2VF9lYuMZ42gOHr3UddZw4WZltxKg==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", + "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", "dev": true, "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", @@ -1725,7 +1712,7 @@ "decamelize": "^1.2.0", "find-cache-dir": "^3.2.0", "find-up": "^4.1.0", - "foreground-child": "^2.0.0", + "foreground-child": "^3.3.0", "get-package-type": "^0.1.0", "glob": "^7.1.6", "istanbul-lib-coverage": "^3.0.0", @@ -1910,13 +1897,13 @@ } }, "node_modules/@loopback/context": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@loopback/context/-/context-7.0.4.tgz", - "integrity": "sha512-NWtXJ2mH3Akj+Qlj4hPd4RZXyIkF4vS0DOZZXsHorPFAmvMdNi32SOXjUm/Je59k5xHBMQEW53tey8P+9iJXHQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@loopback/context/-/context-7.0.6.tgz", + "integrity": "sha512-a9NvaNfSxbgm8bs75ZyqHyqlptULqehcfAXpZq8TDMHyyJ4jVk7KpAab2YwVztzJUbgeagVv1IAHL1Gz0Qwr3g==", "dependencies": { - "@loopback/metadata": "^7.0.4", + "@loopback/metadata": "^7.0.6", "@types/debug": "^4.1.12", - "debug": "^4.3.5", + "debug": "^4.3.7", "hyperid": "^3.2.0", "p-event": "^4.2.0", "tslib": "^2.6.3", @@ -1927,12 +1914,12 @@ } }, "node_modules/@loopback/core": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@loopback/core/-/core-6.1.1.tgz", - "integrity": "sha512-gphIDW8sT1+0f6QqPc1h+P3l92oaMfMd1VK8DHtyCZwrbBGJkbuZC2BgzGOQyPXhgoLbIVO07shjmjgygaV2sg==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@loopback/core/-/core-6.1.3.tgz", + "integrity": "sha512-rFs16z00cavqQeXdvFRx9CnyinPTI4qWvtnDJ/PsZSCWuvG9qBbK69aub9J+PPX/SHIgHsMExB9uNjyMycnieg==", "dependencies": { - "@loopback/context": "^7.0.4", - "debug": "^4.3.5", + "@loopback/context": "^7.0.6", + "debug": "^4.3.7", "tslib": "^2.6.3" }, "engines": { @@ -1940,13 +1927,13 @@ } }, "node_modules/@loopback/eslint-config": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@loopback/eslint-config/-/eslint-config-15.0.3.tgz", - "integrity": "sha512-Rv/o0qtEXMTIhLU2IFY9Mgp2eKDv732bG3UuVPXYROrM5P3AJkCO6tuonCDDrm6w4KTAL2xoJ9V+Fzcb8opxog==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@loopback/eslint-config/-/eslint-config-15.0.4.tgz", + "integrity": "sha512-ZmCd/2qoSQrKzvM4pBmSJJ1KAecVvFFimGQjZgafmxe7J5Jfb1bamLoDYMcMI1DmKCRxd77nweX1PJHC4AmGtg==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "^7.10.0", - "@typescript-eslint/parser": "^7.10.0", + "@typescript-eslint/eslint-plugin": "^7.16.0", + "@typescript-eslint/parser": "^7.16.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-eslint-plugin": "^5.5.1", "eslint-plugin-mocha": "^10.4.3" @@ -1959,17 +1946,17 @@ } }, "node_modules/@loopback/express": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@loopback/express/-/express-7.0.4.tgz", - "integrity": "sha512-JraWV1WD5FHX3/8HEMfu7BC7GcS5kK/o4NwV0fuNiiv9sD+4mnWy7mgo+w3TbyfDSxq5BKspPWSoGMsUXYnwAw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@loopback/express/-/express-7.0.6.tgz", + "integrity": "sha512-zey+J7ateOHrXIv9yq7F2RlS3Hk4lkc+fAqtORCdkoEJWblQ/oe1/gm4hYQWKnO3KDQ0pktfa3EEZlGzU0mG9Q==", "dependencies": { - "@loopback/http-server": "^6.0.4", + "@loopback/http-server": "^6.0.6", "@types/body-parser": "^1.19.5", "@types/express": "^4.17.21", "@types/express-serve-static-core": "^4.17.37", "@types/http-errors": "^2.0.4", - "body-parser": "^1.20.2", - "debug": "^4.3.5", + "body-parser": "^1.20.3", + "debug": "^4.3.7", "express": "^4.19.2", "http-errors": "^2.0.0", "on-finished": "^2.4.1", @@ -1984,9 +1971,9 @@ } }, "node_modules/@loopback/filter": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@loopback/filter/-/filter-5.0.4.tgz", - "integrity": "sha512-16SdyFe+mh8b6JIgbnS1NIiop+6vhh62BQ0hOBfRVnffCf1NEE3mrERNsbMNou9eMx/OOIBMfhoAoFwfSfyJdw==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@loopback/filter/-/filter-5.0.6.tgz", + "integrity": "sha512-rGQaVrUtJGtUvZ/4bRS+4dbAqPOziGY1GyM6dsLalM0xR9paZVTZSvNSYK1cK0eagzdgUjFbVHwhaJ0pdjIYCQ==", "dependencies": { "tslib": "^2.6.3" }, @@ -1995,11 +1982,11 @@ } }, "node_modules/@loopback/http-server": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@loopback/http-server/-/http-server-6.0.4.tgz", - "integrity": "sha512-e5QyUeX4ime9mbnPOO8la7AccRCJ9Iyw/+HSRDoFV0ufOCZFwVkzu8NLM/NJPyFTPcMe+jTddvgH0+KcmBYCwA==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@loopback/http-server/-/http-server-6.0.6.tgz", + "integrity": "sha512-3GhrLWHi87VVL2jGSpFocfsKYGjBIjoJ8r017/kuMi4UGweNrbSBrL8ly5tKQ6APGjx+/j9qEuFC1IaaXo4FCw==", "dependencies": { - "debug": "^4.3.5", + "debug": "^4.3.7", "stoppable": "^1.1.0", "tslib": "^2.6.3" }, @@ -2008,9 +1995,9 @@ } }, "node_modules/@loopback/logging": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/@loopback/logging/-/logging-0.12.4.tgz", - "integrity": "sha512-+30PxdR2F8V9mrUxTD7eHjhV46LgAyVbZfv4+C9Sjrpa81+e2V/uXBai8o6Ir1pJsQo6fm97EohLttYV3LrNUA==", + "version": "0.12.6", + "resolved": "https://registry.npmjs.org/@loopback/logging/-/logging-0.12.6.tgz", + "integrity": "sha512-v6HpSCVCOzpq7gS9bx6bO42oMa4kKD9NhXfZ1nUJAr6M2ErSzwxdQI1m67CW5DYr8OoziQfO9GSFcqpbXsPI7w==", "dev": true, "dependencies": { "fluent-logger": "^3.4.1", @@ -2028,11 +2015,11 @@ } }, "node_modules/@loopback/metadata": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@loopback/metadata/-/metadata-7.0.4.tgz", - "integrity": "sha512-PMR9FYnWbx9FcnF/oy5ukY852l2xl7eUU1WMOVeiYU66vpXdCXb1bOoTZjMOAuqZcSlQUjqwk15cZzydU/ITxw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@loopback/metadata/-/metadata-7.0.6.tgz", + "integrity": "sha512-NlSx6VcGC97qFiC4yR+3UcT7n7FpEGpyqPwYmbLPiIyKsbv/s5TwCUy/1QprJAx9ZFrM/mkd0nW2z01Ek6PnUw==", "dependencies": { - "debug": "^4.3.5", + "debug": "^4.3.7", "lodash": "^4.17.21", "reflect-metadata": "^0.2.1", "tslib": "^2.6.3" @@ -2042,9 +2029,9 @@ } }, "node_modules/@loopback/model-api-builder": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@loopback/model-api-builder/-/model-api-builder-6.0.4.tgz", - "integrity": "sha512-Or3vS/q76FPZ3voLkvLTP0j3kewa+gM4A3sf0wzGVFEe2/mq2Kkvx2e5hMe/siKEe9VfythQ2SSvf4uJz0zFhg==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@loopback/model-api-builder/-/model-api-builder-6.0.6.tgz", + "integrity": "sha512-KqluBGENq/VRhgFriyLFPzMAtCEmUbgZ3PUpiFWVzNRLmGccQwl+zfPKNwhl8Q8A5yXNS3y7ANzxcKo/1i2chA==", "dependencies": { "tslib": "^2.6.3" }, @@ -2057,12 +2044,12 @@ } }, "node_modules/@loopback/openapi-v3": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/@loopback/openapi-v3/-/openapi-v3-10.0.4.tgz", - "integrity": "sha512-ZZSKd7pMNDP7BgvHcWUeAV3DqTA9g89C6Ra4wCmCHnpvQdxoqoNWI10wupRFKFgbLr/x9YK/Pf9CnwN+WZQIMQ==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@loopback/openapi-v3/-/openapi-v3-10.0.6.tgz", + "integrity": "sha512-pOmYzuv58t5eA0gZKuAeT6GcTBV0+n25OSUjx5CpwhXnq9hfFku7USWUfJLgwEuE75XsTQ7dUUmmBYvpaFCw2Q==", "dependencies": { - "@loopback/repository-json-schema": "^8.0.4", - "debug": "^4.3.5", + "@loopback/repository-json-schema": "^8.0.6", + "debug": "^4.3.7", "http-status": "^1.7.4", "json-merge-patch": "^1.0.2", "lodash": "^4.17.21", @@ -2077,13 +2064,13 @@ } }, "node_modules/@loopback/repository": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@loopback/repository/-/repository-7.0.4.tgz", - "integrity": "sha512-SP9i/38N/S3p8eBhrWSv2or+hRXFkZ6o5bFFr2QvuZtMEFP6OUR1bTUfSlElWGddOAUOpwh7COnn5evezwRhdQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@loopback/repository/-/repository-7.0.6.tgz", + "integrity": "sha512-yxImM2VqC4sD7e++y4KTP9Clp6SymRS2EgTYCUMZ+k+dQ3LqIjQwg6Ro5g0VuQpJMNBr3d0qDW16rPRV9o5VFw==", "dependencies": { - "@loopback/filter": "^5.0.4", + "@loopback/filter": "^5.0.6", "@types/debug": "^4.1.12", - "debug": "^4.3.5", + "debug": "^4.3.7", "lodash": "^4.17.21", "loopback-datasource-juggler": "^5.0.11", "tslib": "^2.6.3" @@ -2096,12 +2083,12 @@ } }, "node_modules/@loopback/repository-json-schema": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@loopback/repository-json-schema/-/repository-json-schema-8.0.4.tgz", - "integrity": "sha512-WUWEQIw66rsw6EHVcsel7Bty/MV93E0HUvn8dcSHexKhoGv/9oae1EYUsaThkjb4hnG2iYZt4ZNDL4SyMJ6aXg==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@loopback/repository-json-schema/-/repository-json-schema-8.0.6.tgz", + "integrity": "sha512-oYVURgSIHLhzwuL3J4CwokDQ4Pki1OKnGZerR/Z3sZhcBdP/CwJk1AwZ3XuxTBHS2ebfW7H1Kg9EoOoHRrojtA==", "dependencies": { "@types/json-schema": "^7.0.15", - "debug": "^4.3.5", + "debug": "^4.3.7", "tslib": "^2.6.3" }, "engines": { @@ -2113,13 +2100,13 @@ } }, "node_modules/@loopback/rest": { - "version": "14.0.4", - "resolved": "https://registry.npmjs.org/@loopback/rest/-/rest-14.0.4.tgz", - "integrity": "sha512-1oQBJ1J+i7i4NsA9WzhGZJ2R9CK/aK2VTbQb6wlIgeSg5t65uSqUYUYgcY/Gt1wOJudZQ6l0CQJKhK1sdZj7+A==", + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/@loopback/rest/-/rest-14.0.6.tgz", + "integrity": "sha512-/YPSwhzCNnvkkc3kMhATkg2CeMy4rklGd9dTvXHNLJgZ/KplvwKRlI+IKAKYeUcnc5m51eDD3YcUBjlAlg9wfQ==", "dependencies": { - "@loopback/express": "^7.0.4", - "@loopback/http-server": "^6.0.4", - "@loopback/openapi-v3": "^10.0.4", + "@loopback/express": "^7.0.6", + "@loopback/http-server": "^6.0.6", + "@loopback/openapi-v3": "^10.0.6", "@openapi-contrib/openapi-schema-to-json-schema": "^5.1.0", "@types/body-parser": "^1.19.5", "@types/cors": "^2.8.17", @@ -2133,9 +2120,9 @@ "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0", - "body-parser": "^1.20.2", + "body-parser": "^1.20.3", "cors": "^2.8.5", - "debug": "^4.3.5", + "debug": "^4.3.7", "express": "^4.19.2", "http-errors": "^2.0.0", "js-yaml": "^4.1.0", @@ -2143,7 +2130,7 @@ "lodash": "^4.17.21", "on-finished": "^2.4.1", "path-to-regexp": "^6.2.2", - "qs": "^6.12.2", + "qs": "^6.12.3", "strong-error-handler": "^5.0.10", "tslib": "^2.6.3", "type-is": "^1.6.18", @@ -2157,9 +2144,9 @@ } }, "node_modules/@loopback/rest-explorer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@loopback/rest-explorer/-/rest-explorer-7.0.4.tgz", - "integrity": "sha512-qz9gdjVIQ7YzH48iDBaL/lW4B40faR+Peg6AnJE0yetLG6DBi2Sm4yjzSFU7IGz4PbPG5wt1lDxdrutWK632lA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@loopback/rest-explorer/-/rest-explorer-7.0.6.tgz", + "integrity": "sha512-YU8bRw+oNIXubFoIgZWVwGXWweSl+N+vyvVmcv6c+pcT8aaLc+HWT1OAiRiVIl1U6EzdAvC6igBpKUsFbjHwtA==", "dependencies": { "ejs": "^3.1.10", "swagger-ui-dist": "5.17.14", @@ -2213,9 +2200,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/@loopback/service-proxy": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@loopback/service-proxy/-/service-proxy-7.0.4.tgz", - "integrity": "sha512-Nw1S71eqNszN874AwmoRLQcT7aocD7E6aomB0Nff5jTTDONkZpIE+Zancyn0EtVp58DTVa2K+x9sPfiaL1XwYQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@loopback/service-proxy/-/service-proxy-7.0.6.tgz", + "integrity": "sha512-MS57pxCMQl9G5w22Hf2bGGjTaaA+JwjdloOjrqo5oroJXtjgMaGbZZ+h7FM59WQb3LP9qTlUCg4xtXrU04uMlw==", "dependencies": { "loopback-datasource-juggler": "^5.0.11", "tslib": "^2.6.3" @@ -2228,9 +2215,9 @@ } }, "node_modules/@loopback/testlab": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@loopback/testlab/-/testlab-7.0.4.tgz", - "integrity": "sha512-8ZuiyMpdSuIHyA3Hxe+XyH9vEEndKTr093uPsSwevmks+oInCwMB9Y7Op5t2Ef9SEU+p8iSpfW8ikf2cp8VJ0g==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@loopback/testlab/-/testlab-7.0.6.tgz", + "integrity": "sha512-pRYqTKB7HpDRJrM1pHapMSnBDWWzD9cs2BFSXcYcq061xFGYjqyZuMi7BWT1vz4iVGQ0zKt+qyqmCVWONmqalw==", "dev": true, "dependencies": { "@hapi/shot": "^6.0.1", @@ -3006,18 +2993,13 @@ } }, "node_modules/@openapi-contrib/openapi-schema-to-json-schema/node_modules/@types/node": { - "version": "20.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", - "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", + "version": "20.16.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, - "node_modules/@openapi-contrib/openapi-schema-to-json-schema/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, "node_modules/@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", @@ -3028,9 +3010,9 @@ } }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", - "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.26.0.tgz", + "integrity": "sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg==", "engines": { "node": ">=14" }, @@ -3039,11 +3021,11 @@ } }, "node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" @@ -3053,13 +3035,13 @@ } }, "node_modules/@opentelemetry/exporter-jaeger": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.25.1.tgz", - "integrity": "sha512-6/HwzrwUx0fpkFXrouF0IJp+hpN8xkx8RqEk+BZfeoMAHydpyigyYsKyAtAZRwfJe45WWJbJUqoK8aBjiC9iLQ==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.26.0.tgz", + "integrity": "sha512-l5NMFwFr5NWWRNcURUS8/RdkBmR3+dPGE33f51XfamKXsEfZUkRC8V1L2D7hzKhXxcFmYLcprg4/sYpeKtYoAQ==", "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0", "jaeger-client": "^3.15.0" }, "engines": { @@ -3262,11 +3244,11 @@ } }, "node_modules/@opentelemetry/propagator-b3": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.25.1.tgz", - "integrity": "sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.26.0.tgz", + "integrity": "sha512-vvVkQLQ/lGGyEy9GT8uFnI047pajSOVnZI2poJqVGD3nJ+B9sFGdlHNnQKophE3lHfnIH0pw2ubrCTjZCgIj+Q==", "dependencies": { - "@opentelemetry/core": "1.25.1" + "@opentelemetry/core": "1.26.0" }, "engines": { "node": ">=14" @@ -3276,11 +3258,11 @@ } }, "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.25.1.tgz", - "integrity": "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.26.0.tgz", + "integrity": "sha512-DelFGkCdaxA1C/QA0Xilszfr0t4YbGd3DjxiCDPh34lfnFr+VkkrjV9S8ZTJvAzfdKERXhfOxIKBoGPJwoSz7Q==", "dependencies": { - "@opentelemetry/core": "1.25.1" + "@opentelemetry/core": "1.26.0" }, "engines": { "node": ">=14" @@ -3290,12 +3272,12 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" @@ -3305,13 +3287,13 @@ } }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", + "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" @@ -3321,15 +3303,15 @@ } }, "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz", - "integrity": "sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==", - "dependencies": { - "@opentelemetry/context-async-hooks": "1.25.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/propagator-b3": "1.25.1", - "@opentelemetry/propagator-jaeger": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.26.0.tgz", + "integrity": "sha512-Fj5IVKrj0yeUwlewCRwzOVcr5avTuNnMHWf7GPc1t6WaT78J6CJyF3saZ/0RkZfdeNO8IcBl/bNcWMVZBMRW8Q==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.26.0", + "@opentelemetry/core": "1.26.0", + "@opentelemetry/propagator-b3": "1.26.0", + "@opentelemetry/propagator-jaeger": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0", "semver": "^7.5.2" }, "engines": { @@ -3351,9 +3333,9 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", "engines": { "node": ">=14" } @@ -3652,29 +3634,29 @@ } }, "node_modules/@sinonjs/samsam": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", - "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz", + "integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0", + "@sinonjs/commons": "^3.0.1", "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "type-detect": "^4.1.0" } }, - "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "node_modules/@sinonjs/samsam/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, - "dependencies": { - "type-detect": "4.0.8" + "engines": { + "node": ">=4" } }, "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", "dev": true }, "node_modules/@sourceloop/core": { @@ -3831,9 +3813,9 @@ } }, "node_modules/@types/aws-lambda": { - "version": "8.10.142", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.142.tgz", - "integrity": "sha512-wy2y/2hQKrS6myOS++koXg3N1Hg+LLyPjaggCFajczSHZPqBnOMuT2sdH3kiASrmdBYyM3pmjyz5SoWraRllCQ==", + "version": "8.10.145", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.145.tgz", + "integrity": "sha512-dtByW6WiFk5W5Jfgz1VM+YPA21xMXTuSFoLYIDY0L44jDLLflVPtZkYuu3/YxpGcvjzKFBZLU+GyKjR0HOYtyw==", "dev": true }, "node_modules/@types/body-parser": { @@ -3942,9 +3924,9 @@ } }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", - "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", + "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", "dependencies": { "@types/node": "*" } @@ -3977,9 +3959,9 @@ "dev": true }, "node_modules/@types/mocha": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", - "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.8.tgz", + "integrity": "sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw==", "dev": true }, "node_modules/@types/moment": { @@ -3998,11 +3980,11 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", - "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", "dependencies": { - "undici-types": "~6.13.0" + "undici-types": "~6.19.2" } }, "node_modules/@types/normalize-package-data": { @@ -4026,18 +4008,18 @@ "dev": true }, "node_modules/@types/pdfkit": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/@types/pdfkit/-/pdfkit-0.13.4.tgz", - "integrity": "sha512-ixGNDHYJCCKuamY305wbfYSphZ2WPe8FPkjn8oF4fHV+PgPV4V+hecPh2VOS2h4RNtpSB3zQcR4sCpNvvrEb1A==", + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/@types/pdfkit/-/pdfkit-0.13.5.tgz", + "integrity": "sha512-cR4gZA3xiMVDUf/O/ijVr6aIguvN72ZmCDLcWwM0ycqn5P8XDSjMX9PixzWEoDnlINoofxo2LCdV4KvdD9Waqg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/pg": { - "version": "8.11.6", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", - "integrity": "sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==", + "version": "8.11.10", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.10.tgz", + "integrity": "sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==", "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -4050,9 +4032,9 @@ "integrity": "sha512-uALowNG2TSM1HNPMMOR0AJwv4aPYPhqB0xlEhkeRTMuto5hjoSPZkvgu1nbPUkz3gEPAHv4sy4DmKsurZiEfRQ==" }, "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==" }, "node_modules/@types/range-parser": { "version": "1.2.7", @@ -4103,9 +4085,9 @@ "dev": true }, "node_modules/@types/superagent": { - "version": "8.1.8", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.8.tgz", - "integrity": "sha512-nTqHJ2OTa7PFEpLahzSEEeFeqbMpmcN7OeayiOc7v+xk+/vyTKljRe+o4MPqSnPeRCMvtxuLG+5QqluUVQJOnA==", + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", "dev": true, "dependencies": { "@types/cookiejar": "^2.1.5", @@ -4417,12 +4399,11 @@ "dev": true }, "node_modules/accept-language": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/accept-language/-/accept-language-3.0.18.tgz", - "integrity": "sha512-sUofgqBPzgfcF20sPoBYGQ1IhQLt2LSkxTnlQSuLF3n5gPEqd5AimbvOvHEi0T1kLMiGVqPWzI5a9OteBRth3A==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/accept-language/-/accept-language-3.0.20.tgz", + "integrity": "sha512-xklPzRma4aoDEPk0ZfMjeuxB2FP4JBYlAR25OFUqCoOYDjYo6wGwAs49SnTN/MoB5VpnNX9tENfZ+vEIFmHQMQ==", "dependencies": { - "bcp47": "^1.1.2", - "stable": "^0.1.6" + "bcp47": "^1.1.2" } }, "node_modules/accepts": { @@ -4459,9 +4440,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "dependencies": { "acorn": "^8.11.0" @@ -4789,9 +4770,9 @@ } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -4844,15 +4825,15 @@ } }, "node_modules/aws4": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.0.tgz", - "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", "peer": true }, "node_modules/axios": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", - "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -4957,11 +4938,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/bl/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, "node_modules/bl/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -4995,9 +4971,9 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -5007,7 +4983,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -5030,20 +5006,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", @@ -5478,9 +5440,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001649", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", - "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", + "version": "1.0.30001663", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz", + "integrity": "sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==", "dev": true, "funding": [ { @@ -6985,11 +6947,11 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -7071,6 +7033,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -7409,9 +7376,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", - "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==", + "version": "1.5.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.27.tgz", + "integrity": "sha512-o37j1vZqCoEgBuWWXLHQgTN/KDKe7zwpiY5CPeq2RvUqOyJw9xnrULzZAEVQ5p4h+zjMk7hgtOoPdnLxr7m/jw==", "dev": true }, "node_modules/emoji-regex": { @@ -7425,9 +7392,9 @@ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { "node": ">= 0.8" } @@ -7617,6 +7584,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", @@ -7664,9 +7636,9 @@ "dev": true }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { "node": ">=6" } @@ -7689,16 +7661,16 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -7999,36 +7971,36 @@ "dev": true }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -8064,23 +8036,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "node_modules/expression-eval": { "version": "5.0.1", @@ -8289,12 +8247,12 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -8524,9 +8482,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -8567,9 +8525,9 @@ } }, "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -8867,12 +8825,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/get-pkg-repo/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, "node_modules/get-pkg-repo/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -9598,9 +9550,9 @@ } }, "node_modules/hyperid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.2.0.tgz", - "integrity": "sha512-PdTtDo+Rmza9nEhTunaDSUKwbC69TIzLEpZUwiB6f+0oqmY0UPfhyHCPt6K1NQ4WFv5yJBTG5vELztVWP+nEVQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.3.0.tgz", + "integrity": "sha512-7qhCVT4MJIoEsNcbhglhdmBKb09QtcmJNiIQGq7js/Khf5FtQQ9bzcAuloeqBeee7XD7JqDeve9KNlQya5tSGQ==", "dependencies": { "buffer": "^5.2.1", "uuid": "^8.3.2", @@ -9665,9 +9617,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -10079,9 +10031,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dependencies": { "hasown": "^2.0.2" }, @@ -10463,9 +10415,9 @@ } }, "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", @@ -11827,9 +11779,9 @@ } }, "node_modules/loopback-connector-postgresql": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/loopback-connector-postgresql/-/loopback-connector-postgresql-7.1.3.tgz", - "integrity": "sha512-MaRNOLbjEDz3VGqP32CGI0DdtvJc/f2OOCYeXkizPCFhFElOxL81qPlN4h9RMVoFuLF7AYdxgGQhev6sOv2psw==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/loopback-connector-postgresql/-/loopback-connector-postgresql-7.1.5.tgz", + "integrity": "sha512-WKKd5rXSEu5GorEUJjIx/Q35qjHhidlu2e/hwudu7ha4k2zGeKnFBbE2fS5RUB5iC/2u+dG23VPl4B4s/KdNKg==", "dependencies": { "async": "^3.2.0", "bluebird": "^3.4.6", @@ -11845,13 +11797,13 @@ } }, "node_modules/loopback-connector-postgresql/node_modules/loopback-connector": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-6.1.7.tgz", - "integrity": "sha512-Mc5EkBjOfiCu2d+xlS094oIT8BaT50IohJeOCGB55Gj8iM6EWZOthhEtID0IUHq+7v+/okkf6OhvqILybIIyMw==", + "version": "6.1.9", + "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-6.1.9.tgz", + "integrity": "sha512-Ii4CAHnY4ChKj/2bsiV2Ck59QWcYHTE2HbU3028D2nFWg7N5SAdkkjnhdvqUhzvdt+Vpb0WlEgaR4SKASHqXEw==", "dependencies": { - "async": "^3.2.5", + "async": "^3.2.6", "bluebird": "^3.7.2", - "debug": "^4.3.5", + "debug": "^4.3.7", "msgpack5": "^4.5.1", "strong-globalize": "^6.0.6", "uuid": "^10.0.0" @@ -11907,20 +11859,20 @@ } }, "node_modules/loopback-datasource-juggler": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/loopback-datasource-juggler/-/loopback-datasource-juggler-5.0.11.tgz", - "integrity": "sha512-qPgJA4VbrsclgesjPMkuzCpa+emuVTrmgY89zO7zmWvLnBzCPkIISxhoCAIo6Z3n6VSXkgzNKcstj7lwgbqXhw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/loopback-datasource-juggler/-/loopback-datasource-juggler-5.1.0.tgz", + "integrity": "sha512-oHQ6S4r8/65tR5JfjjDke7Z9QdbBXO21/iy2LqkmvHTGPTa3A61r8mwTOGQtDHpVRJijt+eDHbrufVLzITZEsw==", "dependencies": { - "async": "^3.2.5", + "async": "^3.2.6", "change-case": "^4.1.2", - "debug": "^4.3.5", + "debug": "^4.3.7", "depd": "^2.0.0", "inflection": "^3.0.0", "lodash": "^4.17.21", - "loopback-connector": "^6.1.7", - "minimatch": "^9.0.5", + "loopback-connector": "^6.1.9", + "minimatch": "^10.0.1", "nanoid": "^3.3.7", - "qs": "^6.12.2", + "qs": "^6.13.0", "strong-globalize": "^6.0.6", "traverse": "^0.6.9", "uuid": "^10.0.0" @@ -11938,13 +11890,13 @@ } }, "node_modules/loopback-datasource-juggler/node_modules/loopback-connector": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-6.1.7.tgz", - "integrity": "sha512-Mc5EkBjOfiCu2d+xlS094oIT8BaT50IohJeOCGB55Gj8iM6EWZOthhEtID0IUHq+7v+/okkf6OhvqILybIIyMw==", + "version": "6.1.9", + "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-6.1.9.tgz", + "integrity": "sha512-Ii4CAHnY4ChKj/2bsiV2Ck59QWcYHTE2HbU3028D2nFWg7N5SAdkkjnhdvqUhzvdt+Vpb0WlEgaR4SKASHqXEw==", "dependencies": { - "async": "^3.2.5", + "async": "^3.2.6", "bluebird": "^3.7.2", - "debug": "^4.3.5", + "debug": "^4.3.7", "msgpack5": "^4.5.1", "strong-globalize": "^6.0.6", "uuid": "^10.0.0" @@ -11953,6 +11905,20 @@ "node": ">=18" } }, + "node_modules/loopback-datasource-juggler/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/loopback4-authentication": { "version": "12.0.2", "resolved": "https://registry.npmjs.org/loopback4-authentication/-/loopback4-authentication-12.0.2.tgz", @@ -12452,9 +12418,12 @@ "dev": true }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -12479,9 +12448,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { "braces": "^3.0.3", @@ -12766,9 +12735,9 @@ } }, "node_modules/mocha": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.0.tgz", - "integrity": "sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA==", + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", "dev": true, "dependencies": { "ansi-colors": "^4.1.3", @@ -12843,12 +12812,6 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -13082,9 +13045,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/msgpack-lite": { "version": "0.1.26", @@ -13101,12 +13064,6 @@ "msgpack": "bin/msgpack" } }, - "node_modules/msgpack-lite/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, "node_modules/msgpack5": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/msgpack5/-/msgpack5-4.5.1.tgz", @@ -13118,11 +13075,6 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/msgpack5/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, "node_modules/msgpack5/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -13264,16 +13216,34 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/nise": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", - "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz", + "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==", "dev": true, "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/text-encoding": "^0.7.2", + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.1", + "@sinonjs/text-encoding": "^0.7.3", "just-extend": "^6.2.0", - "path-to-regexp": "^6.2.1" + "path-to-regexp": "^8.1.0" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.2.tgz", + "integrity": "sha512-4Bb+oqXZTSTZ1q27Izly9lv8B9dlV61CROxPiVtywwzv5SnytJqhvYe6FclHYuXml4cd1VHPo1zd5PmTeJozvA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.1.0.tgz", + "integrity": "sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ==", + "dev": true, + "engines": { + "node": ">=16" } }, "node_modules/no-case": { @@ -13366,9 +13336,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", - "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", "dev": true, "bin": { "node-gyp-build": "bin.js", @@ -15604,9 +15574,9 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==" }, "node_modules/path-type": { "version": "4.0.0", @@ -15641,13 +15611,13 @@ "peer": true }, "node_modules/pg": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", - "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.0.tgz", + "integrity": "sha512-34wkUTh3SxTClfoHB3pQ7bIMvw9dpFU1audQQeZG837fmHfHpr14n/AELVDoOYVDW2h5RDWU78tFjkD+erSBsw==", "dependencies": { - "pg-connection-string": "^2.6.4", - "pg-pool": "^3.6.2", - "pg-protocol": "^1.6.1", + "pg-connection-string": "^2.7.0", + "pg-pool": "^3.7.0", + "pg-protocol": "^1.7.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, @@ -15673,9 +15643,9 @@ "optional": true }, "node_modules/pg-connection-string": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", - "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", + "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==" }, "node_modules/pg-int8": { "version": "1.0.1", @@ -15694,17 +15664,17 @@ } }, "node_modules/pg-pool": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", - "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", + "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", - "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", + "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==" }, "node_modules/pg-types": { "version": "4.0.2", @@ -15790,9 +15760,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true }, "node_modules/picomatch": { @@ -15937,9 +15907,9 @@ "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==" }, "node_modules/postman-request": { - "version": "2.88.1-postman.37", - "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.37.tgz", - "integrity": "sha512-TpHeMnvO5xvlYCYp8QntLR1Fq0hohWGOLbf9RBqO5JTMdPWZpGBbR8xs11tHsZRVMDXWFg4m960ItkcDxiaWSA==", + "version": "2.88.1-postman.40", + "resolved": "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.40.tgz", + "integrity": "sha512-uE4AiIqhjtHKp4pj9ei7fkdfNXEX9IqDBlK1plGAQne6y79UUlrTdtYLhwXoO0AMOvqyl9Ar+BU6Eo6P/MPgfg==", "peer": true, "dependencies": { "@postman/form-data": "~3.1.1", @@ -16198,9 +16168,9 @@ "dev": true }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -17018,6 +16988,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -17059,9 +17034,9 @@ } }, "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "engines": { "node": ">=10" } @@ -17098,9 +17073,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -17133,6 +17108,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -17144,11 +17127,6 @@ "node": ">=4" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, "node_modules/sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", @@ -17169,14 +17147,14 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -17547,13 +17525,13 @@ } }, "node_modules/sinon": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.0.tgz", - "integrity": "sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA==", + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.1.tgz", + "integrity": "sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.1", - "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/fake-timers": "11.2.2", "@sinonjs/samsam": "^8.0.0", "diff": "^5.2.0", "nise": "^6.0.0", @@ -17805,9 +17783,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "dev": true }, "node_modules/split": { @@ -17910,12 +17888,6 @@ "node": ">=8" } }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" - }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -18123,12 +18095,12 @@ } }, "node_modules/strong-error-handler": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/strong-error-handler/-/strong-error-handler-5.0.10.tgz", - "integrity": "sha512-bSjeWSHizlsefxweVeFv2Pha7z78XL1EVmuMSBkypjBJyYgHgvrqFgjwmKiCBTYt9C15xNnJjUfkRVkuSZTyNw==", + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/strong-error-handler/-/strong-error-handler-5.0.11.tgz", + "integrity": "sha512-OVvvpTHg3BmNWBsg3St33ADHqBPSRAsAVlwIUyBFNib0fXuY5dCjKyuJAiT2LW9Y1DB182xRFkt6IblcwTbBbw==", "dependencies": { "accepts": "^1.3.8", - "debug": "^4.3.4", + "debug": "^4.3.7", "fast-safe-stringify": "^2.1.1", "handlebars": "^4.7.8", "http-status": "^1.7.4", @@ -18259,6 +18231,61 @@ "prom-client": ">= 10 <= 14" } }, + "node_modules/swagger-stats/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/swagger-stats/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/swagger-stats/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/swagger-stats/node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/swagger-stats/node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/swagger-stats/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -18642,9 +18669,9 @@ "dev": true }, "node_modules/traverse": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.9.tgz", - "integrity": "sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==", + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.10.tgz", + "integrity": "sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==", "dependencies": { "gopd": "^1.0.1", "typedarray.prototype.slice": "^1.0.3", @@ -18771,9 +18798,9 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/tsscmp": { "version": "1.0.6", @@ -19148,9 +19175,9 @@ } }, "node_modules/uglify-js": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz", - "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -19201,9 +19228,9 @@ } }, "node_modules/undici-types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "node_modules/unicode-properties": { "version": "1.4.1", @@ -19561,9 +19588,9 @@ } }, "node_modules/winston": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.1.tgz", - "integrity": "sha512-SvZit7VFNvXRzbqGHsv5KSmgbEYR5EiQfDAL9gxYkRqa934Hnk++zze0wANKtMHcy/gI4W/3xmSDwlhf865WGw==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.14.2.tgz", + "integrity": "sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg==", "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", @@ -20028,108 +20055,19 @@ } }, "services/orchestrator-service/node_modules/@types/node": { - "version": "18.19.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.43.tgz", - "integrity": "sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==", + "version": "18.19.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.50.tgz", + "integrity": "sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, - "services/orchestrator-service/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "services/orchestrator-service/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "services/orchestrator-service/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "services/orchestrator-service/node_modules/nodemon": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "services/orchestrator-service/node_modules/semver": { - "version": "7.6.3", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "services/orchestrator-service/node_modules/simple-update-notifier": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "services/orchestrator-service/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "services/orchestrator-service/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, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -20195,9 +20133,10 @@ } }, "services/subscription-service/node_modules/@types/node": { - "version": "18.19.31", + "version": "18.19.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.50.tgz", + "integrity": "sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==", "dev": true, - "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } @@ -20278,9 +20217,10 @@ } }, "services/tenant-management-service/node_modules/@types/node": { - "version": "18.19.31", + "version": "18.19.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.50.tgz", + "integrity": "sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==", "dev": true, - "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } diff --git a/services/tenant-management-service/migrations/pg/migrations/20240925102459-add-table-tenant-configs.js b/services/tenant-management-service/migrations/pg/migrations/20240925102459-add-table-tenant-configs.js new file mode 100644 index 0000000..2052c51 --- /dev/null +++ b/services/tenant-management-service/migrations/pg/migrations/20240925102459-add-table-tenant-configs.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20240925102459-add-table-tenant-configs-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20240925102459-add-table-tenant-configs-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/services/tenant-management-service/migrations/pg/migrations/sqls/20240925102459-add-table-tenant-configs-down.sql b/services/tenant-management-service/migrations/pg/migrations/sqls/20240925102459-add-table-tenant-configs-down.sql new file mode 100644 index 0000000..3284c15 --- /dev/null +++ b/services/tenant-management-service/migrations/pg/migrations/sqls/20240925102459-add-table-tenant-configs-down.sql @@ -0,0 +1 @@ +drop table main.tenant_configs; \ No newline at end of file diff --git a/services/tenant-management-service/migrations/pg/migrations/sqls/20240925102459-add-table-tenant-configs-up.sql b/services/tenant-management-service/migrations/pg/migrations/sqls/20240925102459-add-table-tenant-configs-up.sql new file mode 100644 index 0000000..fa27218 --- /dev/null +++ b/services/tenant-management-service/migrations/pg/migrations/sqls/20240925102459-add-table-tenant-configs-up.sql @@ -0,0 +1,17 @@ +CREATE TABLE IF NOT EXISTS main.tenant_configs +( + id uuid NOT NULL DEFAULT (md5(((random())::text || (clock_timestamp())::text)))::uuid, + config_key varchar(100) NOT NULL, + config_value jsonb NOT NULL, + created_on timestamptz DEFAULT CURRENT_TIMESTAMP, + modified_on timestamptz, + created_by uuid, + modified_by uuid, + deleted boolean DEFAULT FALSE NOT NULL, + deleted_by uuid, + deleted_on timestamptz, + tenant_id uuid NOT NULL, + CONSTRAINT pk_tenant_configs_id PRIMARY KEY (id), + CONSTRAINT fk_tenant_configs_tenants FOREIGN KEY (tenant_id) + REFERENCES main.tenants(id) +) \ No newline at end of file diff --git a/services/tenant-management-service/src/component.ts b/services/tenant-management-service/src/component.ts index 33fc487..3b702bc 100644 --- a/services/tenant-management-service/src/component.ts +++ b/services/tenant-management-service/src/component.ts @@ -60,6 +60,7 @@ import { TenantOnboardDTO, VerifyLeadResponseDTO, WebhookDTO, + TenantConfig, } from './models'; import { AddressRepository, @@ -70,6 +71,7 @@ import { ResourceRepository, TenantRepository, WebhookSecretRepository, + TenantConfigRepository, } from './repositories'; import {LeadTokenVerifierProvider, SystemUserProvider} from './providers'; import { @@ -81,6 +83,8 @@ import { OnboardingService, ProvisioningService, } from './services'; +import { IdpController } from './controllers/idp.controller'; +import { KeycloakIdpProvider } from './providers/idp/idp-keycloak.provider'; export class TenantManagementServiceComponent implements Component { constructor( @inject(CoreBindings.APPLICATION_INSTANCE) @@ -120,6 +124,7 @@ export class TenantManagementServiceComponent implements Component { ResourceRepository, TenantRepository, WebhookSecretRepository, + TenantConfigRepository ]; this.models = [ @@ -136,6 +141,7 @@ export class TenantManagementServiceComponent implements Component { TenantOnboardDTO, VerifyLeadResponseDTO, WebhookDTO, + TenantConfig ]; this.controllers = [ @@ -145,7 +151,7 @@ export class TenantManagementServiceComponent implements Component { LeadTenantController, LeadController, PingController, - TenantController, + TenantController ]; this.bindings = [ diff --git a/services/tenant-management-service/src/controllers/idp.controller.ts b/services/tenant-management-service/src/controllers/idp.controller.ts new file mode 100644 index 0000000..358c55f --- /dev/null +++ b/services/tenant-management-service/src/controllers/idp.controller.ts @@ -0,0 +1,66 @@ +import { extensions, Getter, inject, intercept } from '@loopback/core'; +import { getModelSchemaRef, post, requestBody } from '@loopback/rest'; +import { + CONTENT_TYPE, + OPERATION_SECURITY_SPEC, + rateLimitKeyGenPublic, + STATUS_CODE, +} from '@sourceloop/core'; +import { authorize } from 'loopback4-authorization'; +import { ratelimit } from 'loopback4-ratelimiter'; +import { TenantManagementServiceBindings, WEBHOOK_VERIFIER } from '../keys'; +import { IdpDetailsDTO } from '../models/dtos/idp-details-dto.model'; +import { ConfigureIdpFunc, IdPKey, IWebhookHandler } from '../types'; +import { KeycloakIdpProvider } from '../providers/idp/idp-keycloak.provider'; + +const basePath = '/manage/users'; +export class IdpController { + constructor( + @inject(TenantManagementServiceBindings.IDP_KEYCLOAK) + private readonly idpKeycloakProvider:ConfigureIdpFunc + ) { } + @intercept(WEBHOOK_VERIFIER) + @ratelimit(true, { + max: parseInt(process.env.WEBHOOK_API_MAX_ATTEMPTS ?? '10'), + keyGenerator: rateLimitKeyGenPublic, + }) + @authorize({ + permissions: ['*'], + }) + @post(`${basePath}`, { + security: OPERATION_SECURITY_SPEC, + responses: { + [STATUS_CODE.NO_CONTENT]: { + description: 'Webhook success', + }, + }, + }) + async idpConfigure( + @requestBody({ + content: { + [CONTENT_TYPE.JSON]: { + schema: getModelSchemaRef(IdpDetailsDTO, { + title: 'IdpDetailsDTO', + }), + }, + }, + }) + payload: IdpDetailsDTO, + ): Promise { + switch (payload.identityProvider) { + case IdPKey.AUTH0: + + break; + case IdPKey.COGNITO: + + break; + case IdPKey.KEYCLOAK: + await this.idpKeycloakProvider(payload); + break; + + default: + break; + } + + } +} diff --git a/services/tenant-management-service/src/controllers/index.ts b/services/tenant-management-service/src/controllers/index.ts index 8406aab..90a9866 100644 --- a/services/tenant-management-service/src/controllers/index.ts +++ b/services/tenant-management-service/src/controllers/index.ts @@ -6,3 +6,5 @@ export * from './lead-tenant.controller'; export * from './tenant.controller'; export * from './webhook.controller'; export * from './invoice.controller'; +export * from './tenant-config.controller'; +export * from './tenant-config-tenant.controller'; diff --git a/services/tenant-management-service/src/controllers/tenant-config-tenant.controller.ts b/services/tenant-management-service/src/controllers/tenant-config-tenant.controller.ts new file mode 100644 index 0000000..fe79d87 --- /dev/null +++ b/services/tenant-management-service/src/controllers/tenant-config-tenant.controller.ts @@ -0,0 +1,38 @@ +import { + repository, +} from '@loopback/repository'; +import { + param, + get, + getModelSchemaRef, +} from '@loopback/rest'; +import { + TenantConfig, + Tenant, +} from '../models'; +import {TenantConfigRepository} from '../repositories'; + +export class TenantConfigTenantController { + constructor( + @repository(TenantConfigRepository) + public tenantConfigRepository: TenantConfigRepository, + ) { } + + @get('/tenant-configs/{id}/tenant', { + responses: { + '200': { + description: 'Tenant belonging to TenantConfig', + content: { + 'application/json': { + schema: getModelSchemaRef(Tenant), + }, + }, + }, + }, + }) + async getTenant( + @param.path.string('id') id: typeof TenantConfig.prototype.id, + ): Promise { + return this.tenantConfigRepository.tenant(id); + } +} diff --git a/services/tenant-management-service/src/controllers/tenant-config.controller.ts b/services/tenant-management-service/src/controllers/tenant-config.controller.ts new file mode 100644 index 0000000..b1bbcdf --- /dev/null +++ b/services/tenant-management-service/src/controllers/tenant-config.controller.ts @@ -0,0 +1,150 @@ +import { + Count, + CountSchema, + Filter, + FilterExcludingWhere, + repository, + Where, +} from '@loopback/repository'; +import { + post, + param, + get, + getModelSchemaRef, + patch, + put, + del, + requestBody, + response, +} from '@loopback/rest'; +import {TenantConfig} from '../models'; +import {TenantConfigRepository} from '../repositories'; + +export class TenantConfigController { + constructor( + @repository(TenantConfigRepository) + public tenantConfigRepository : TenantConfigRepository, + ) {} + + @post('/tenant-configs') + @response(200, { + description: 'TenantConfig model instance', + content: {'application/json': {schema: getModelSchemaRef(TenantConfig)}}, + }) + async create( + @requestBody({ + content: { + 'application/json': { + schema: getModelSchemaRef(TenantConfig, { + title: 'NewTenantConfig', + exclude: ['id'], + }), + }, + }, + }) + tenantConfig: Omit, + ): Promise { + return this.tenantConfigRepository.create(tenantConfig); + } + + @get('/tenant-configs/count') + @response(200, { + description: 'TenantConfig model count', + content: {'application/json': {schema: CountSchema}}, + }) + async count( + @param.where(TenantConfig) where?: Where, + ): Promise { + return this.tenantConfigRepository.count(where); + } + + @get('/tenant-configs') + @response(200, { + description: 'Array of TenantConfig model instances', + content: { + 'application/json': { + schema: { + type: 'array', + items: getModelSchemaRef(TenantConfig, {includeRelations: true}), + }, + }, + }, + }) + async find( + @param.filter(TenantConfig) filter?: Filter, + ): Promise { + return this.tenantConfigRepository.find(filter); + } + + @patch('/tenant-configs') + @response(200, { + description: 'TenantConfig PATCH success count', + content: {'application/json': {schema: CountSchema}}, + }) + async updateAll( + @requestBody({ + content: { + 'application/json': { + schema: getModelSchemaRef(TenantConfig, {partial: true}), + }, + }, + }) + tenantConfig: TenantConfig, + @param.where(TenantConfig) where?: Where, + ): Promise { + return this.tenantConfigRepository.updateAll(tenantConfig, where); + } + + @get('/tenant-configs/{id}') + @response(200, { + description: 'TenantConfig model instance', + content: { + 'application/json': { + schema: getModelSchemaRef(TenantConfig, {includeRelations: true}), + }, + }, + }) + async findById( + @param.path.string('id') id: string, + @param.filter(TenantConfig, {exclude: 'where'}) filter?: FilterExcludingWhere + ): Promise { + return this.tenantConfigRepository.findById(id, filter); + } + + @patch('/tenant-configs/{id}') + @response(204, { + description: 'TenantConfig PATCH success', + }) + async updateById( + @param.path.string('id') id: string, + @requestBody({ + content: { + 'application/json': { + schema: getModelSchemaRef(TenantConfig, {partial: true}), + }, + }, + }) + tenantConfig: TenantConfig, + ): Promise { + await this.tenantConfigRepository.updateById(id, tenantConfig); + } + + @put('/tenant-configs/{id}') + @response(204, { + description: 'TenantConfig PUT success', + }) + async replaceById( + @param.path.string('id') id: string, + @requestBody() tenantConfig: TenantConfig, + ): Promise { + await this.tenantConfigRepository.replaceById(id, tenantConfig); + } + + @del('/tenant-configs/{id}') + @response(204, { + description: 'TenantConfig DELETE success', + }) + async deleteById(@param.path.string('id') id: string): Promise { + await this.tenantConfigRepository.deleteById(id); + } +} diff --git a/services/tenant-management-service/src/keys.ts b/services/tenant-management-service/src/keys.ts index d9edad1..a1be917 100644 --- a/services/tenant-management-service/src/keys.ts +++ b/services/tenant-management-service/src/keys.ts @@ -1,27 +1,35 @@ -import {VerifyFunction} from 'loopback4-authentication'; +import { VerifyFunction } from 'loopback4-authentication'; import { + ConfigureIdpFunc, ITenantManagementServiceConfig, LeadUser, WebhookConfig, WebhookNotificationServiceType, } from './types'; -import {IAuthUser} from 'loopback4-authorization'; -import {AnyObject} from '@loopback/repository'; -import {WebhookController} from './controllers'; +import { IAuthUser } from 'loopback4-authorization'; +import { AnyObject } from '@loopback/repository'; +import { WebhookController } from './controllers'; import { BindingKey, BindingTemplate, Interceptor, extensionFor, } from '@loopback/core'; -import {BINDING_PREFIX} from '@sourceloop/core'; -import {IEventConnector} from './types/i-event-connector.interface'; +import { BINDING_PREFIX } from '@sourceloop/core'; +import { IEventConnector } from './types/i-event-connector.interface'; +import { ValueOrPromise } from '@loopback/context'; export namespace TenantManagementServiceBindings { export const Config = BindingKey.create( `${BINDING_PREFIX}.chat.config`, ); + /** + * Binding key for the Idp keycloak provider. + */ + export const IDP_KEYCLOAK = BindingKey.create< + ConfigureIdpFunc + >('sf.user.idp.keycloak'); } /** @@ -31,6 +39,10 @@ export const LEAD_TOKEN_VERIFIER = BindingKey.create< VerifyFunction.BearerFn >('sf.user.lead.verifier'); + + + + /** * Binding key for the system user. */ @@ -63,7 +75,7 @@ export const WebhookHandlerEP = BindingKey.create>( */ export const asWebhookHandler: BindingTemplate = binding => { extensionFor(WebhookHandlerEP.key)(binding); - binding.tag({namespace: WebhookHandlerEP.key}); + binding.tag({ namespace: WebhookHandlerEP.key }); }; export const WebhookNotificationService = diff --git a/services/tenant-management-service/src/models/dtos/idp-details-dto.model.ts b/services/tenant-management-service/src/models/dtos/idp-details-dto.model.ts new file mode 100644 index 0000000..c12cac6 --- /dev/null +++ b/services/tenant-management-service/src/models/dtos/idp-details-dto.model.ts @@ -0,0 +1,31 @@ +import { getJsonSchema } from '@loopback/openapi-v3'; +import { Model, model, property } from '@loopback/repository'; +import { IdpDetails, IdPKey } from '../../types'; +import { TenantDto } from './tenant-dto.model'; + +@model({ + description: 'model describing payload for IDP controller', +}) +export class IdpDetailsDTO extends Model implements IdpDetails { + @property({ + type: 'string', + description: 'identity provider - auth0 , keycloak , cognito', + required: true, + default: IdPKey.AUTH0, + jsonSchema: { + enum: Object.values(IdPKey), + }, + }) + identityProvider: IdPKey; + + @property({ + type: 'object', + description: 'address object to be created for the lead', + jsonSchema: getJsonSchema(TenantDto), + }) + tenant: TenantDto; + + constructor(data?: Partial) { + super(data); + } +} diff --git a/services/tenant-management-service/src/models/dtos/tenant-dto.model.ts b/services/tenant-management-service/src/models/dtos/tenant-dto.model.ts new file mode 100644 index 0000000..7d3c1f1 --- /dev/null +++ b/services/tenant-management-service/src/models/dtos/tenant-dto.model.ts @@ -0,0 +1,33 @@ +import {getJsonSchema} from '@loopback/openapi-v3'; +import {model, property} from '@loopback/repository'; +import {Address} from '../address.model'; +import {Lead} from '../lead.model'; +import { Tenant } from '../tenant.model'; +import { Contact } from '../contact.model'; + +@model({ + description: 'model describing payload used to create a lead', +}) +export class TenantDto extends Tenant { + @property({ + type: 'object', + description: 'address object to be created for the lead', + jsonSchema: getJsonSchema(Address), + }) + address: Address; + + @property({ + type: 'array', + itemType: 'object', + description: 'Array of contact objects', + jsonSchema: { + type: 'object', + items: getJsonSchema(Contact), + }, + }) + contacts: Contact[]; + + constructor(data?: Partial) { + super(data); + } +} diff --git a/services/tenant-management-service/src/models/index.ts b/services/tenant-management-service/src/models/index.ts index 02b5768..10cb796 100644 --- a/services/tenant-management-service/src/models/index.ts +++ b/services/tenant-management-service/src/models/index.ts @@ -7,3 +7,4 @@ export * from './resource.model'; export * from './invoice.model'; export * from './address.model'; export * from './lead-token.model'; +export * from './tenant-config.model'; \ No newline at end of file diff --git a/services/tenant-management-service/src/models/tenant-config.model.ts b/services/tenant-management-service/src/models/tenant-config.model.ts new file mode 100644 index 0000000..815d64d --- /dev/null +++ b/services/tenant-management-service/src/models/tenant-config.model.ts @@ -0,0 +1,46 @@ +import {Entity, model, property, belongsTo} from '@loopback/repository'; +import { UserModifiableEntity } from '@sourceloop/core'; +import {Tenant} from './tenant.model'; + +@model({ + name: 'tenant_configs', + description: 'tenant_configs to save any tenant specific data related to idP' +}) +export class TenantConfig extends UserModifiableEntity { + @property({ + type: 'string', + id: true, + generated: true, + }) + id: string; + + @property({ + type: 'string', + required: true, + name: 'config_key' + }) + configKey: string; + + @property({ + type: 'object', + required: true, + name: 'config_value' + }) + configValue: object; + + @belongsTo( + () => Tenant, + {keyTo: 'id'}, + { + type: 'string', + name: 'tenant_id', + description: 'id of the tenant this invoice is generated for', + required: true, + }, + ) + tenantId: string; + + constructor(data?: Partial) { + super(data); + } +} diff --git a/services/tenant-management-service/src/providers/idp/idp-keycloak.provider.ts b/services/tenant-management-service/src/providers/idp/idp-keycloak.provider.ts new file mode 100644 index 0000000..0a1c73a --- /dev/null +++ b/services/tenant-management-service/src/providers/idp/idp-keycloak.provider.ts @@ -0,0 +1,138 @@ +import { Provider, ValueOrPromise } from "@loopback/context"; +import axios from 'axios'; +import qs from 'qs'; +import { ConfigureIdpFunc, IdpDetails } from "../../types"; + +interface TokenResponse { + access_token: string; +} + +interface Credentials { + type: string; + value: string; + temporary: boolean; +} + +export class KeycloakIdpProvider implements Provider>{ + constructor(){} + + value(): ConfigureIdpFunc { + return (payload)=>this.configure(payload); + } + async configure(payload: IdpDetails): Promise { + const { tenant } = payload; + + try { + const token=await this.authenticateAdmin(); + // 1. Create a new realm using the tenant key + await this.createRealm(tenant.key,token); + + // 2. Create a new client within the realm + const clientId = `client-${tenant.key}`; // You can customize this as needed + await this.createClient(tenant.key, clientId,token); + + // 3. Create a new admin user for the tenant + const adminUsername = `${tenant.key}-admin`; // Customize this as needed + const adminPassword = 'your-secure-password'; // This can be dynamic or set in the environment + await this.createUser(tenant.key, adminUsername, adminPassword,token); + + console.log(`Successfully configured Keycloak for tenant: ${tenant.name}`); + } catch (error) { + console.error(`Error configuring Keycloak for tenant: ${tenant.name}`, error); + throw new Error(`Failed to configure Keycloak for tenant: ${tenant.name}`); + } + } + + + + + async authenticateAdmin(): Promise { + const response = await axios.post( + `${process.env.KEYCLOAK_HOST}/realms/master/protocol/openid-connect/token`, + qs.stringify({ + username: process.env.KEYCLOAK_ADMIN_USERNAME, + password: process.env.KEYCLOAK_ADMIN_PASSWORD, + grant_type: 'password', + client_id: 'admin-cli', + }), + { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + } + ); + + return response.data.access_token; + } + + async createRealm(realmName: string,token:string): Promise { + // const token = await this.authenticateAdmin(); + + const response = await axios.post( + `${process.env.KEYCLOAK_HOST}/admin/realms`, + { + realm: realmName, + enabled: true, + }, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + + console.log('Realm created:', response.data); + } + + async createClient(realmName: string, clientId: string,token:string): Promise { + // const token = await this.authenticateAdmin(); + + const response = await axios.post( + `${process.env.KEYCLOAK_HOST}/admin/realms/${realmName}/clients`, + { + clientId: clientId, + publicClient: true, + directAccessGrantsEnabled: true, + protocol: 'openid-connect', + enabled: true, + }, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + + console.log('Client created:', response.data); + } + + async createUser(realmName: string, username: string, password: string,token:string): Promise { + // const token = await this.authenticateAdmin(); + + const response = await axios.post( + `${process.env.KEYCLOAK_HOST}/admin/realms/${realmName}/users`, + { + username: username, + enabled: true, + credentials: [ + { + type: 'password', + value: password, + temporary: false, + }, + ] as Credentials[], + }, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + + console.log('User created:', response.data); + } + + +} + + diff --git a/services/tenant-management-service/src/providers/idp/index.ts b/services/tenant-management-service/src/providers/idp/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/services/tenant-management-service/src/repositories/index.ts b/services/tenant-management-service/src/repositories/index.ts index 5c5157a..543778d 100644 --- a/services/tenant-management-service/src/repositories/index.ts +++ b/services/tenant-management-service/src/repositories/index.ts @@ -6,3 +6,4 @@ export * from './resource.repository'; export * from './invoice.repository'; export * from './address.repository'; export * from './lead-token.repository'; +export * from './tenant-config.repository'; \ No newline at end of file diff --git a/services/tenant-management-service/src/repositories/tenant-config.repository.ts b/services/tenant-management-service/src/repositories/tenant-config.repository.ts new file mode 100644 index 0000000..34c158b --- /dev/null +++ b/services/tenant-management-service/src/repositories/tenant-config.repository.ts @@ -0,0 +1,27 @@ +import {Getter, inject} from '@loopback/core'; +import {DefaultCrudRepository, juggler, repository, BelongsToAccessor} from '@loopback/repository'; +import {TenantConfig, Tenant} from '../models'; +import { DefaultUserModifyCrudRepository, IAuthUserWithPermissions } from '@sourceloop/core'; +import { SYSTEM_USER } from '../keys'; +import { TenantManagementDbSourceName } from '../types'; +import {TenantRepository} from './tenant.repository'; + +export class TenantConfigRepository extends DefaultUserModifyCrudRepository< + TenantConfig, + typeof TenantConfig.prototype.id, + {} +> { + + public readonly tenant: BelongsToAccessor; + + constructor( + @inject.getter(SYSTEM_USER) + public readonly getCurrentUser: Getter, + @inject(`datasources.${TenantManagementDbSourceName}`) + dataSource: juggler.DataSource, @repository.getter('TenantRepository') protected tenantRepositoryGetter: Getter, + ) { + super(TenantConfig, dataSource,getCurrentUser); + this.tenant = this.createBelongsToAccessorFor('tenant', tenantRepositoryGetter,); + this.registerInclusionResolver('tenant', this.tenant.inclusionResolver); + } +} diff --git a/services/tenant-management-service/src/types/i-idp.interface.ts b/services/tenant-management-service/src/types/i-idp.interface.ts new file mode 100644 index 0000000..1b0f3fe --- /dev/null +++ b/services/tenant-management-service/src/types/i-idp.interface.ts @@ -0,0 +1,15 @@ +import { Tenant } from "../models"; + +export enum IdPKey { + AUTH0 = 'auth0', + COGNITO = 'cognito', + KEYCLOAK = 'keycloak', + } + +export type ConfigureIdpFunc=(payload:IdpDetails)=>Promise; + + export interface IdpDetails { + identityProvider: IdPKey; + tenant: Tenant; + } + \ No newline at end of file diff --git a/services/tenant-management-service/src/types/index.ts b/services/tenant-management-service/src/types/index.ts index 9cea043..16f8603 100644 --- a/services/tenant-management-service/src/types/index.ts +++ b/services/tenant-management-service/src/types/index.ts @@ -38,3 +38,4 @@ export * from './resource.type'; export * from './i-provisioning-service.interface'; export * from './i-subscription.interface'; export * from './i-event-connector.interface'; +export * from './i-idp.interface'; \ No newline at end of file diff --git a/services/tenant-management-service/src/webhook.component.ts b/services/tenant-management-service/src/webhook.component.ts index 959e5f7..1871e6e 100644 --- a/services/tenant-management-service/src/webhook.component.ts +++ b/services/tenant-management-service/src/webhook.component.ts @@ -35,7 +35,7 @@ import { WEBHOOK_VERIFIER, } from './keys'; import {ITenantManagementServiceConfig} from './types'; -import {WebhookController} from './controllers'; +import {TenantConfigController, TenantConfigTenantController, WebhookController} from './controllers'; import { Address, Contact, @@ -50,6 +50,7 @@ import { TenantOnboardDTO, VerifyLeadResponseDTO, WebhookDTO, + TenantConfig, } from './models'; import { AddressRepository, @@ -60,6 +61,7 @@ import { ResourceRepository, TenantRepository, WebhookSecretRepository, + TenantConfigRepository, } from './repositories'; import {WebhookVerifierProvider} from './interceptors'; import {SystemUserProvider} from './providers'; @@ -70,6 +72,8 @@ import { DEFAULT_TIMESTAMP_TOLERANCE, } from './utils'; import {ProvisioningWebhookHandler} from './services/webhook'; +import { KeycloakIdpProvider } from './providers/idp/idp-keycloak.provider'; +import { IdpController } from './controllers/idp.controller'; export class WebhookTenantManagementServiceComponent implements Component { constructor( @@ -110,6 +114,7 @@ export class WebhookTenantManagementServiceComponent implements Component { ResourceRepository, TenantRepository, WebhookSecretRepository, + TenantConfigRepository ]; this.models = [ @@ -126,12 +131,14 @@ export class WebhookTenantManagementServiceComponent implements Component { TenantOnboardDTO, VerifyLeadResponseDTO, WebhookDTO, + TenantConfig ]; - this.controllers = [WebhookController]; + this.controllers = [WebhookController,IdpController,TenantConfigController,TenantConfigTenantController]; this.bindings = [ - Binding.bind(WEBHOOK_VERIFIER).toProvider(WebhookVerifierProvider), + Binding.bind(WEBHOOK_VERIFIER).toProvider(WebhookVerifierProvider),Binding.bind(TenantManagementServiceBindings.IDP_KEYCLOAK).toProvider(KeycloakIdpProvider), + Binding.bind(SYSTEM_USER).toProvider(SystemUserProvider), Binding.bind(WEBHOOK_CONFIG).to({ signatureHeaderName: DEFAULT_SIGNATURE_HEADER,