diff --git a/.github/workflows/analysis.yml b/.github/workflows/analysis.yml index dd48c06393..c848f00b2f 100644 --- a/.github/workflows/analysis.yml +++ b/.github/workflows/analysis.yml @@ -161,11 +161,11 @@ jobs: APP_SESSION_SECRET: null APP_ROUTECACHE_AUTHTOKEN: null AWS_REGION: fr-par - KC_BOT_CLIENT: pdc-bot - KC_BOT_CLIENT_SECRET: so_secret_000 - KC_ADMIN_CLIENT: pdc-manager - KC_ADMIN_CLIENT_SECRET: so_secret_000 ETL_MIRROR_URL: https://geo-datasets-mirror.s3.fr-par.scw.cloud ETL_ARCHIVES_URL: https://geo-datasets-archives.s3.fr-par.scw.cloud + PRO_CONNECT_CLIENT_ID: ${{ secrets.PRO_CONNECT_CLIENT_ID }} + PRO_CONNECT_CLIENT_SECRET: ${{ secrets.PRO_CONNECT_CLIENT_SECRET }} + APP_AUTH_CLIENT_ID: secret + APP_AUTH_CLIENT_SECRET: secret run: just ci_test_integration working-directory: api diff --git a/api/deno.lock b/api/deno.lock index be7321abe3..b754bffc2d 100644 --- a/api/deno.lock +++ b/api/deno.lock @@ -2,16 +2,12 @@ "version": "3", "packages": { "specifiers": { - "jsr:@std/collections@1": "jsr:@std/collections@1.0.9", + "jsr:@std/collections@1": "jsr:@std/collections@1.0.10", "jsr:@std/crypto@1": "jsr:@std/crypto@1.0.4", - "jsr:@std/crypto@1.0.4": "jsr:@std/crypto@1.0.4", - "jsr:@std/encoding": "jsr:@std/encoding@1.0.7", "jsr:@std/encoding@1": "jsr:@std/encoding@1.0.7", - "jsr:@std/encoding@1.0.7": "jsr:@std/encoding@1.0.7", "jsr:@std/semver@1": "jsr:@std/semver@1.0.3", "jsr:@superstruct/core@^2": "jsr:@superstruct/core@2.0.2", "npm:@faker-js/faker@^8.4": "npm:@faker-js/faker@8.4.1", - "npm:@keycloak/keycloak-admin-client@^25.0": "npm:@keycloak/keycloak-admin-client@25.0.1", "npm:@sentry/node@^8.2": "npm:@sentry/node@8.10.0_@opentelemetry+api@1.9.0_@opentelemetry+core@1.25.1__@opentelemetry+api@1.9.0_@opentelemetry+instrumentation@0.52.1__@opentelemetry+api@1.9.0_@opentelemetry+sdk-trace-base@1.25.1__@opentelemetry+api@1.9.0_@opentelemetry+semantic-conventions@1.25.1", "npm:@turf/boolean-point-in-polygon": "npm:@turf/boolean-point-in-polygon@7.0.0", "npm:@turf/distance": "npm:@turf/distance@7.0.0", @@ -20,9 +16,8 @@ "npm:@types/cors@^2.8": "npm:@types/cors@2.8.17", "npm:@types/express-session@^1.18": "npm:@types/express-session@1.18.0", "npm:@types/jsonwebtoken@^9": "npm:@types/jsonwebtoken@9.0.6", - "npm:@types/node": "npm:@types/node@18.16.19", "npm:@types/node-7z@^2": "npm:@types/node-7z@2.1.8", - "npm:@types/node@^20": "npm:@types/node@20.14.7", + "npm:@types/node@^20": "npm:@types/node@20.17.17", "npm:@types/nodemailer@^6.4": "npm:@types/nodemailer@6.4.15", "npm:@types/pg-cursor@^2.7": "npm:@types/pg-cursor@2.7.2", "npm:@types/pg@^8.11": "npm:@types/pg@8.11.6", @@ -52,7 +47,7 @@ "npm:helmet@^7.1": "npm:helmet@7.1.0", "npm:ibantools@^4.5": "npm:ibantools@4.5.1", "npm:inversify@^6": "npm:inversify@6.0.2", - "npm:ioredis@^5.3": "npm:ioredis@5.4.1", + "npm:ioredis@^5.3": "npm:ioredis@5.5.0", "npm:jsonwebtoken@^9": "npm:jsonwebtoken@9.0.2", "npm:libphonenumber-js@^1.11": "npm:libphonenumber-js@1.11.4", "npm:mapshaper@^0.6": "npm:mapshaper@0.6.98", @@ -68,13 +63,12 @@ "npm:rate-limit-redis@^4.2": "npm:rate-limit-redis@4.2.0_express-rate-limit@7.3.1__express@4.19.2_express@4.19.2", "npm:reflect-metadata@^0.2": "npm:reflect-metadata@0.2.2", "npm:sinon@^18": "npm:sinon@18.0.0", - "npm:stream-json@^1.8": "npm:stream-json@1.8.0", "npm:supertest@^7": "npm:supertest@7.0.0", "npm:xss@^1": "npm:xss@1.0.15" }, "jsr": { - "@std/collections@1.0.9": { - "integrity": "4f58104ead08a04a2199374247f07befe50ba01d9cca8cbb23ab9a0419921e71" + "@std/collections@1.0.10": { + "integrity": "903af106a3d92970d74e20f7ebff77d9658af9bef4403f1dc42a7801c0575899" }, "@std/crypto@1.0.4": { "integrity": "cee245c453bd5366207f4d8aa25ea3e9c86cecad2be3fefcaa6cb17203d79340" @@ -138,14 +132,6 @@ "wrap-ansi-cjs": "wrap-ansi@7.0.0" } }, - "@keycloak/keycloak-admin-client@25.0.1": { - "integrity": "sha512-FzJ7OSa6MvBfJbiH/+vlH6Kjz9b74z5eVMPWm4kZmUg1+M4bH3oeSsC2y1Yis72Yrtt62PmlaE2ddaaz+iGi/Q==", - "dependencies": { - "camelize-ts": "camelize-ts@3.0.0", - "url-join": "url-join@5.0.0", - "url-template": "url-template@3.1.1" - } - }, "@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3": { "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", "dependencies": {} @@ -267,7 +253,7 @@ "@opentelemetry/core": "@opentelemetry/core@1.25.0_@opentelemetry+api@1.9.0", "@opentelemetry/instrumentation": "@opentelemetry/instrumentation@0.52.0_@opentelemetry+api@1.9.0", "@opentelemetry/semantic-conventions": "@opentelemetry/semantic-conventions@1.25.0", - "semver": "semver@7.6.2" + "semver": "semver@7.7.1" } }, "@opentelemetry/instrumentation-ioredis@0.41.0_@opentelemetry+api@1.9.0": { @@ -359,9 +345,9 @@ "dependencies": { "@opentelemetry/api": "@opentelemetry/api@1.9.0", "@types/shimmer": "@types/shimmer@1.0.5", - "import-in-the-middle": "import-in-the-middle@1.4.2_acorn@8.12.0", + "import-in-the-middle": "import-in-the-middle@1.4.2_acorn@8.14.0", "require-in-the-middle": "require-in-the-middle@7.3.0", - "semver": "semver@7.6.2", + "semver": "semver@7.7.1", "shimmer": "shimmer@1.2.1" } }, @@ -371,9 +357,9 @@ "@opentelemetry/api": "@opentelemetry/api@1.9.0", "@opentelemetry/api-logs": "@opentelemetry/api-logs@0.51.1", "@types/shimmer": "@types/shimmer@1.0.5", - "import-in-the-middle": "import-in-the-middle@1.7.4_acorn@8.12.0", + "import-in-the-middle": "import-in-the-middle@1.7.4_acorn@8.14.0", "require-in-the-middle": "require-in-the-middle@7.3.0", - "semver": "semver@7.6.2", + "semver": "semver@7.7.1", "shimmer": "shimmer@1.2.1" } }, @@ -383,9 +369,9 @@ "@opentelemetry/api": "@opentelemetry/api@1.9.0", "@opentelemetry/api-logs": "@opentelemetry/api-logs@0.52.0", "@types/shimmer": "@types/shimmer@1.0.5", - "import-in-the-middle": "import-in-the-middle@1.8.0_acorn@8.12.0", + "import-in-the-middle": "import-in-the-middle@1.8.0_acorn@8.14.0", "require-in-the-middle": "require-in-the-middle@7.3.0", - "semver": "semver@7.6.2", + "semver": "semver@7.7.1", "shimmer": "shimmer@1.2.1" } }, @@ -395,9 +381,9 @@ "@opentelemetry/api": "@opentelemetry/api@1.9.0", "@opentelemetry/api-logs": "@opentelemetry/api-logs@0.52.1", "@types/shimmer": "@types/shimmer@1.0.5", - "import-in-the-middle": "import-in-the-middle@1.8.1_acorn@8.12.0", + "import-in-the-middle": "import-in-the-middle@1.8.1_acorn@8.14.0", "require-in-the-middle": "require-in-the-middle@7.3.0", - "semver": "semver@7.6.2", + "semver": "semver@7.7.1", "shimmer": "shimmer@1.2.1" } }, @@ -579,7 +565,7 @@ "@turf/helpers": "@turf/helpers@7.0.0", "@turf/invariant": "@turf/invariant@7.0.0", "point-in-polygon-hao": "point-in-polygon-hao@1.1.0", - "tslib": "tslib@2.6.3" + "tslib": "tslib@2.8.1" } }, "@turf/distance@7.0.0": { @@ -587,21 +573,21 @@ "dependencies": { "@turf/helpers": "@turf/helpers@7.0.0", "@turf/invariant": "@turf/invariant@7.0.0", - "tslib": "tslib@2.6.3" + "tslib": "tslib@2.8.1" } }, "@turf/helpers@7.0.0": { "integrity": "sha512-vwZvxRuyjGpGXvhXSbT9mX6FK92dBMLWbMbDJ/MXQUPx17ReVPFc+6N6IcxAzZfkiCnqy7vpuq0c+/TTrQxIiA==", "dependencies": { "deep-equal": "deep-equal@2.2.3", - "tslib": "tslib@2.6.3" + "tslib": "tslib@2.8.1" } }, "@turf/invariant@7.0.0": { "integrity": "sha512-Kayszfz3W8yJ1/cIA3/aNSzAuw7QgSp+IwsSmhLAfp4DbjV0o6sjxRZXRY2gRstZHqkNHSSEeir8V/icdO8sjA==", "dependencies": { "@turf/helpers": "@turf/helpers@7.0.0", - "tslib": "tslib@2.6.3" + "tslib": "tslib@2.8.1" } }, "@types/accepts@1.3.7": { @@ -767,10 +753,10 @@ "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", "dependencies": {} }, - "@types/node@20.14.7": { - "integrity": "sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ==", + "@types/node@20.17.17": { + "integrity": "sha512-/WndGO4kIfMicEQLTi/mDANUu/iVUhT7KboZPdEqqHQ4aTS+3qT3U5gIqWDFV+XouorjfgGqvKILJeHhuQgFYg==", "dependencies": { - "undici-types": "undici-types@5.26.5" + "undici-types": "undici-types@6.19.2" } }, "@types/node@7.10.14": { @@ -879,20 +865,20 @@ "negotiator": "negotiator@0.6.3" } }, - "acorn-import-assertions@1.9.0_acorn@8.12.0": { + "acorn-import-assertions@1.9.0_acorn@8.14.0": { "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dependencies": { - "acorn": "acorn@8.12.0" + "acorn": "acorn@8.14.0" } }, - "acorn-import-attributes@1.9.5_acorn@8.12.0": { + "acorn-import-attributes@1.9.5_acorn@8.14.0": { "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dependencies": { - "acorn": "acorn@8.12.0" + "acorn": "acorn@8.14.0" } }, - "acorn@8.12.0": { - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "acorn@8.14.0": { + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dependencies": {} }, "adm-zip@0.5.14": { @@ -935,8 +921,8 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dependencies": {} }, - "ansi-regex@6.0.1": { - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "ansi-regex@6.1.0": { + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dependencies": {} }, "ansi-styles@4.3.0": { @@ -1154,10 +1140,6 @@ "upper-case": "upper-case@1.1.3" } }, - "camelize-ts@3.0.0": { - "integrity": "sha512-cgRwKKavoDKLTjO4FQTs3dRBePZp/2Y9Xpud0FhuCOTE86M2cniKN4CCXgRnsyXNMmQMifVHcv6SPaMtTx6ofQ==", - "dependencies": {} - }, "caseless@0.12.0": { "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dependencies": {} @@ -1187,7 +1169,7 @@ "domhandler": "domhandler@5.0.3", "domutils": "domutils@3.1.0", "htmlparser2": "htmlparser2@8.0.2", - "parse5": "parse5@7.1.2", + "parse5": "parse5@7.2.1", "parse5-htmlparser2-tree-adapter": "parse5-htmlparser2-tree-adapter@7.0.0" } }, @@ -1433,10 +1415,10 @@ "ms": "ms@2.0.0" } }, - "debug@4.3.5": { - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "debug@4.4.0": { + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dependencies": { - "ms": "ms@2.1.2" + "ms": "ms@2.1.3" } }, "deep-equal@2.2.3": { @@ -1595,7 +1577,7 @@ "@one-ini/wasm": "@one-ini/wasm@0.1.1", "commander": "commander@10.0.1", "minimatch": "minimatch@9.0.1", - "semver": "semver@7.6.2" + "semver": "semver@7.7.1" } }, "ee-first@1.1.1": { @@ -1745,7 +1727,7 @@ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dependencies": { "@types/yauzl": "@types/yauzl@2.10.3", - "debug": "debug@4.3.5", + "debug": "debug@4.4.0", "get-stream": "get-stream@5.2.0", "yauzl": "yauzl@2.10.0" } @@ -2103,38 +2085,38 @@ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "dependencies": {} }, - "import-in-the-middle@1.4.2_acorn@8.12.0": { + "import-in-the-middle@1.4.2_acorn@8.14.0": { "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==", "dependencies": { - "acorn": "acorn@8.12.0", - "acorn-import-assertions": "acorn-import-assertions@1.9.0_acorn@8.12.0", + "acorn": "acorn@8.14.0", + "acorn-import-assertions": "acorn-import-assertions@1.9.0_acorn@8.14.0", "cjs-module-lexer": "cjs-module-lexer@1.3.1", "module-details-from-path": "module-details-from-path@1.0.3" } }, - "import-in-the-middle@1.7.4_acorn@8.12.0": { + "import-in-the-middle@1.7.4_acorn@8.14.0": { "integrity": "sha512-Lk+qzWmiQuRPPulGQeK5qq0v32k2bHnWrRPFgqyvhw7Kkov5L6MOLOIU3pcWeujc9W4q54Cp3Q2WV16eQkc7Bg==", "dependencies": { - "acorn": "acorn@8.12.0", - "acorn-import-attributes": "acorn-import-attributes@1.9.5_acorn@8.12.0", + "acorn": "acorn@8.14.0", + "acorn-import-attributes": "acorn-import-attributes@1.9.5_acorn@8.14.0", "cjs-module-lexer": "cjs-module-lexer@1.3.1", "module-details-from-path": "module-details-from-path@1.0.3" } }, - "import-in-the-middle@1.8.0_acorn@8.12.0": { + "import-in-the-middle@1.8.0_acorn@8.14.0": { "integrity": "sha512-/xQjze8szLNnJ5rvHSzn+dcVXqCAU6Plbk4P24U/jwPmg1wy7IIp9OjKIO5tYue8GSPhDpPDiApQjvBUmWwhsQ==", "dependencies": { - "acorn": "acorn@8.12.0", - "acorn-import-attributes": "acorn-import-attributes@1.9.5_acorn@8.12.0", + "acorn": "acorn@8.14.0", + "acorn-import-attributes": "acorn-import-attributes@1.9.5_acorn@8.14.0", "cjs-module-lexer": "cjs-module-lexer@1.3.1", "module-details-from-path": "module-details-from-path@1.0.3" } }, - "import-in-the-middle@1.8.1_acorn@8.12.0": { + "import-in-the-middle@1.8.1_acorn@8.14.0": { "integrity": "sha512-yhRwoHtiLGvmSozNOALgjRPFI6uYsds60EoMqqnXyyv+JOIW/BrrLejuTGBt+bq0T5tLzOHrN0T7xYTm4Qt/ng==", "dependencies": { - "acorn": "acorn@8.12.0", - "acorn-import-attributes": "acorn-import-attributes@1.9.5_acorn@8.12.0", + "acorn": "acorn@8.14.0", + "acorn-import-attributes": "acorn-import-attributes@1.9.5_acorn@8.14.0", "cjs-module-lexer": "cjs-module-lexer@1.3.1", "module-details-from-path": "module-details-from-path@1.0.3" } @@ -2166,12 +2148,12 @@ "integrity": "sha512-i9m8j/7YIv4mDuYXUAcrpKPSaju/CIly9AHK5jvCBeoiM/2KEsuCQTTP+rzSWWpLYWRukdXFSl6ZTk2/uumbiA==", "dependencies": {} }, - "ioredis@5.4.1": { - "integrity": "sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==", + "ioredis@5.5.0": { + "integrity": "sha512-7CutT89g23FfSa8MDoIFs2GYYa0PaNiW/OrT+nRyjRXHDZd17HmIgy+reOQ/yhh72NznNjGuS8kbCAcA4Ro4mw==", "dependencies": { "@ioredis/commands": "@ioredis/commands@1.2.0", "cluster-key-slot": "cluster-key-slot@1.1.2", - "debug": "debug@4.3.5", + "debug": "debug@4.4.0", "denque": "denque@2.1.0", "lodash.defaults": "lodash.defaults@4.2.0", "lodash.isarguments": "lodash.isarguments@3.1.0", @@ -2358,7 +2340,7 @@ "lodash.isstring": "lodash.isstring@4.0.1", "lodash.once": "lodash.once@4.1.1", "ms": "ms@2.1.3", - "semver": "semver@7.6.2" + "semver": "semver@7.7.1" } }, "jszip@3.10.1": { @@ -2541,8 +2523,8 @@ "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", "dependencies": {} }, - "lru-cache@10.2.2": { - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "lru-cache@10.4.3": { + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dependencies": {} }, "mapshaper@0.6.98": { @@ -2966,10 +2948,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dependencies": {} }, - "ms@2.1.2": { - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dependencies": {} - }, "ms@2.1.3": { "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dependencies": {} @@ -3019,7 +2997,7 @@ "nock@13.5.4": { "integrity": "sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw==", "dependencies": { - "debug": "debug@4.3.5", + "debug": "debug@4.4.0", "json-stringify-safe": "json-stringify-safe@5.0.1", "propagate": "propagate@2.0.1" } @@ -3027,7 +3005,7 @@ "node-7z@3.0.0": { "integrity": "sha512-KIznWSxIkOYO/vOgKQfJEaXd7rgoFYKZbaurainCEdMhYc7V7mRHX+qdf2HgbpQFcdJL/Q6/XOPrDLoBeTfuZA==", "dependencies": { - "debug": "debug@4.3.5", + "debug": "debug@4.4.0", "lodash.defaultsdeep": "lodash.defaultsdeep@4.6.1", "lodash.defaultto": "lodash.defaultto@4.14.0", "lodash.flattendeep": "lodash.flattendeep@4.4.0", @@ -3152,11 +3130,11 @@ "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", "dependencies": { "domhandler": "domhandler@5.0.3", - "parse5": "parse5@7.1.2" + "parse5": "parse5@7.2.1" } }, - "parse5@7.1.2": { - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "parse5@7.2.1": { + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dependencies": { "entities": "entities@4.5.0" } @@ -3180,7 +3158,7 @@ "path-scurry@1.11.1": { "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { - "lru-cache": "lru-cache@10.2.2", + "lru-cache": "lru-cache@10.4.3", "minipass": "minipass@7.1.2" } }, @@ -3474,7 +3452,7 @@ "require-in-the-middle@7.3.0": { "integrity": "sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==", "dependencies": { - "debug": "debug@4.3.5", + "debug": "debug@4.4.0", "module-details-from-path": "module-details-from-path@1.0.3", "resolve": "resolve@1.22.8" } @@ -3519,8 +3497,8 @@ "xmlchars": "xmlchars@2.2.0" } }, - "semver@7.6.2": { - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "semver@7.7.1": { + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dependencies": {} }, "send@0.18.0": { @@ -3642,16 +3620,6 @@ "internal-slot": "internal-slot@1.0.7" } }, - "stream-chain@2.2.5": { - "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", - "dependencies": {} - }, - "stream-json@1.8.0": { - "integrity": "sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==", - "dependencies": { - "stream-chain": "stream-chain@2.2.5" - } - }, "string-width@4.2.3": { "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { @@ -3689,7 +3657,7 @@ "strip-ansi@7.1.0": { "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "ansi-regex": "ansi-regex@6.0.1" + "ansi-regex": "ansi-regex@6.1.0" } }, "superagent@9.0.2": { @@ -3697,7 +3665,7 @@ "dependencies": { "component-emitter": "component-emitter@1.3.1", "cookiejar": "cookiejar@2.1.4", - "debug": "debug@4.3.5", + "debug": "debug@4.4.0", "fast-safe-stringify": "fast-safe-stringify@2.1.1", "form-data": "form-data@4.0.0", "formidable": "formidable@3.5.1", @@ -3803,8 +3771,8 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dependencies": {} }, - "tslib@2.6.3": { - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "tslib@2.8.1": { + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dependencies": {} }, "tsscmp@1.0.6": { @@ -3836,8 +3804,8 @@ "random-bytes": "random-bytes@1.0.0" } }, - "undici-types@5.26.5": { - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "undici-types@6.19.2": { + "integrity": "sha512-jvI+p8VJnrOIQ8AU4PyB1ytW68EyrLnI2xvCO3e5umm3nmhNjpugMD1wo+X994PyvUT9dWS/k3vO1wwRIh730Q==", "dependencies": {} }, "unpipe@1.0.0": { @@ -3869,14 +3837,6 @@ "punycode": "punycode@2.3.1" } }, - "url-join@5.0.0": { - "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", - "dependencies": {} - }, - "url-template@3.1.1": { - "integrity": "sha512-4oszoaEKE/mQOtAmdMWqIRHmkxWkUZMnXFnjQ5i01CuRSK3uluxcH1MRVVVWmhlnzT1SCDfKxxficm2G37qzCA==", - "dependencies": {} - }, "util-deprecate@1.0.2": { "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dependencies": {} @@ -4030,278 +3990,8 @@ } } }, - "redirects": { - "https://esm.sh/v135/@types/stream-json@~1/filters/Pick~.d.ts": "https://esm.sh/v135/@types/stream-json@1.7.8/filters/Pick~.d.ts" - }, "remote": { "https://cdn.sheetjs.com/xlsx-0.20.3/package/xlsx.mjs": "1a0fb062ee9781b13f6687371b202aaefc53b6ce55b530c027e01f9c087b77db", - "https://deno.land/std@0.132.0/_deno_unstable.ts": "23a1a36928f1b6d3b0170aaa67de09af12aa998525f608ff7331b9fb364cbde6", - "https://deno.land/std@0.132.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", - "https://deno.land/std@0.132.0/_util/os.ts": "49b92edea1e82ba295ec946de8ffd956ed123e2948d9bd1d3e901b04e4307617", - "https://deno.land/std@0.132.0/_wasm_crypto/crypto.mjs": "3b383eb715e8bfe61b4450ef0644b2653429c88d494807c86c5235979f62e56b", - "https://deno.land/std@0.132.0/_wasm_crypto/crypto.wasm.mjs": "0ad9ecc0d03ca8a083d9109db22e7507f019f63cf55b82ea618ab58855617577", - "https://deno.land/std@0.132.0/_wasm_crypto/mod.ts": "30a93c8b6b6c5b269e96a3e95d2c045d86a496814a8737443b77cad941d6a0b5", - "https://deno.land/std@0.132.0/async/abortable.ts": "87aa7230be8360c24ad437212311c9e8d4328854baec27b4c7abb26e85515c06", - "https://deno.land/std@0.132.0/async/deadline.ts": "48ac998d7564969f3e6ec6b6f9bf0217ebd00239b1b2292feba61272d5dd58d0", - "https://deno.land/std@0.132.0/async/debounce.ts": "564273ef242bcfcda19a439132f940db8694173abffc159ea34f07d18fc42620", - "https://deno.land/std@0.132.0/async/deferred.ts": "bc18e28108252c9f67dfca2bbc4587c3cbf3aeb6e155f8c864ca8ecff992b98a", - "https://deno.land/std@0.132.0/async/delay.ts": "cbbdf1c87d1aed8edc7bae13592fb3e27e3106e0748f089c263390d4f49e5f6c", - "https://deno.land/std@0.132.0/async/mod.ts": "2240c6841157738414331f47dee09bb8c0482c5b1980b6e3234dd03515c8132f", - "https://deno.land/std@0.132.0/async/mux_async_iterator.ts": "f4d1d259b0c694d381770ddaaa4b799a94843eba80c17f4a2ec2949168e52d1e", - "https://deno.land/std@0.132.0/async/pool.ts": "97b0dd27c69544e374df857a40902e74e39532f226005543eabacb551e277082", - "https://deno.land/std@0.132.0/async/tee.ts": "1341feb1f5b1a96f8628d0f8fc07d8c43d3813423f18a63bf1b4785568d21b1f", - "https://deno.land/std@0.132.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d", - "https://deno.land/std@0.132.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9", - "https://deno.land/std@0.132.0/bytes/mod.ts": "d3b455c0dbd4804644159d1e25946ade5ee385d2359894de49e2c6101b18b7a9", - "https://deno.land/std@0.132.0/encoding/base64.ts": "c8c16b4adaa60d7a8eee047c73ece26844435e8f7f1328d74593dbb2dd58ea4f", - "https://deno.land/std@0.132.0/encoding/base64url.ts": "55f9d13df02efac10c6f96169daa3e702606a64e8aa27c0295f645f198c27130", - "https://deno.land/std@0.132.0/encoding/hex.ts": "7f023e1e51cfd6b189682e602e8640939e7be71a300a2fcf3daf8f84dc609bbc", - "https://deno.land/std@0.132.0/flags/mod.ts": "430cf2d1c26e00286373b2647ebdca637f7558505e88e9c108a4742cd184c916", - "https://deno.land/std@0.132.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37", - "https://deno.land/std@0.132.0/fmt/printf.ts": "e2c0f72146aed1efecf0c39ab928b26ae493a2278f670a871a0fbdcf36ff3379", - "https://deno.land/std@0.132.0/fs/eol.ts": "b92f0b88036de507e7e6fbedbe8f666835ea9dcbf5ac85917fa1fadc919f83a5", - "https://deno.land/std@0.132.0/fs/exists.ts": "cb734d872f8554ea40b8bff77ad33d4143c1187eac621a55bf37781a43c56f6d", - "https://deno.land/std@0.132.0/hash/sha256.ts": "803846c7a5a8a5a97f31defeb37d72f519086c880837129934f5d6f72102a8e8", - "https://deno.land/std@0.132.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", - "https://deno.land/std@0.132.0/node/_buffer.mjs": "f4a7df481d4eed06dc0151b833177d8ef74fc3a96dd4d2b073e690b6ced9474d", - "https://deno.land/std@0.132.0/node/_core.ts": "568d277be2e086af996cbdd599fec569f5280e9a494335ca23ad392b130d7bb9", - "https://deno.land/std@0.132.0/node/_crypto/constants.ts": "49011c87be4e45407ef5e99e96bde3f08656ebd8e6dfc99048c703dd0ce53952", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/base/buffer.js": "73beb8294eb29bd61458bbaaeeb51dfad4ec9c9868a62207a061d908f1637261", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/base/node.js": "4b777980d2a23088698fd2ff065bb311a2c713497d359e674cb6ef6baf267a0f", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/base/reporter.js": "8e4886e8ae311c9a92caf58bbbd8670326ceeae97430f4884e558e4acf8e8598", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/constants/der.js": "354b255479bff22a31d25bf08b217a295071700e37d0991cc05cac9f95e5e7ca", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/decoders/der.js": "c6faf66761daa43fbf79221308443893587c317774047b508a04c570713b76fb", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/decoders/pem.js": "8316ef7ce2ce478bc3dc1e9df1b75225d1eb8fb5d1378f8adf0cf19ecea5b501", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/encoders/der.js": "408336c88d17c5605ea64081261cf42267d8f9fda90098cb560aa6635bb00877", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/encoders/pem.js": "42a00c925b68c0858d6de0ba41ab89935b39fae9117bbf72a9abb2f4b755a2e7", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/asn1.js/mod.js": "7b78859707be10a0a1e4faccdd28cd5a4f71ad74a3e7bebda030757da97cd232", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/bn.js/bn.js": "abd1badd659fd0ae54e6a421a573a25aef4e795edc392178360cf716b144286d", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/aes.js": "1cf4c354c5bb341ffc9ab7207f471229835b021947225bce2e1642f26643847a", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/auth_cipher.js": "19b4dbb903e8406eb733176e6318d5e1a3bd382b67b72f7cf8e1c46cc6321ba4", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/decrypter.js": "05c1676942fd8e95837115bc2d1371bcf62e9bf19f6c3348870961fc64ddad0b", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/encrypter.js": "93ec98ab26fbeb5969eae2943e42fb66780f377b9b0ff0ecc32a9ed11201b142", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/ghash.js": "667b64845764a84f0096ef8cf7debed1a5f15ac9af26b379848237be57da399a", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/incr32.js": "4a7f0107753e4390b4ccc4dbd5200c5527d43f894f768e131903df30a09dfd67", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/mod.js": "d8eb88e7a317467831473621f32e60d7db9d981f6a2ae45d2fb2af170eab2d22", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/cbc.js": "9790799cff181a074686c885708cb8eb473aeb3c86ff2e8d0ff911ae6c1e4431", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/cfb.js": "a4e36ede6f26d8559d8f0528a134592761c706145a641bd9ad1100763e831cdb", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/cfb1.js": "c6372f4973a68ca742682e81d1165e8869aaabf0091a8b963d4d60e5ee8e6f6a", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/cfb8.js": "bd29eebb89199b056ff2441f7fb5e0300f458e13dcaaddbb8bc00cbdb199db67", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/ctr.js": "9c2cbac1fc8f9b58334faacb98e6c57e8c3712f673ea4cf2d528a2894998ab2f", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/ecb.js": "9629d193433688f0cfc432eca52838db0fb28d9eb4f45563df952bde50b59763", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/mod.js": "7d8516ef8a20565539eb17cad5bb70add02ac06d1891e8f47cb981c22821787e", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/modes/ofb.js": "c23abaa6f1ec5343e9d7ba61d702acb3d81a0bd3d34dd2004e36975dc043d6ff", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/stream_cipher.js": "a533a03a2214c6b5934ce85a59eb1e04239fd6f429017c7ca3c443ec7e07e68f", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_aes/xor.ts": "4417711c026eb9a07475067cd31fa601e88c2d6ababd606d33d1e74da6fcfd09", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/browserify_rsa.js": "de8c98d2379a70d8c239b4886e2b3a11c7204eec39ae6b65d978d0d516ee6b08", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/cipher_base.js": "f565ad9daf3b3dd3b68381bed848da94fb093a9e4e5a48c92f47e26cc229df39", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/evp_bytes_to_key.ts": "8bd9fa445576b3e39586bdbef7c907f1dfda201bf22602d2ca1c6d760366311e", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/parse_asn1/asn1.js": "4f33b0197ffbe9cff62e5bad266e6b40d55874ea653552bb32ed251ad091f70a", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/parse_asn1/certificate.js": "aab306870830a81ad188db8fa8e037d7f5dd6c5abdabbd9739558245d1a12224", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/parse_asn1/fix_proc.js": "af3052b76f441878e102ffcfc7420692e65777af765e96f786310ae1acf7f76a", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/parse_asn1/mod.js": "e923a13b27089a99eeb578d2ffb9b4cfe8ce690918fec05d0024fa126f3e1ce3", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/public_encrypt/mgf.js": "5b81dc1680829b564fc5a00b842fb9c88916e4639b4fa27fa8bb6b759d272371", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/public_encrypt/mod.js": "eb8b64d7a58ee3823c1b642e799cc7ed1257d99f4d4aefa2b4796dd112ec094a", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/public_encrypt/private_decrypt.js": "0050df879f7c1338132c45056835f64e32140e2a2d5d03c1366ccce64855f632", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/public_encrypt/public_encrypt.js": "0132cb4fb8f72593278474884195b9c52b4e9ba33d8ddd22116d07a07f47005a", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/public_encrypt/with_public.js": "7373dac9b53b8331ccf3521c854a131dcb304a2e4d34cd116649118f7919ed0c", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/public_encrypt/xor.js": "900c6fc8b95e1861d796193c41988f5f70a09c7059e42887a243d0113ecaf0fd", - "https://deno.land/std@0.132.0/node/_crypto/crypto_browserify/randombytes.ts": "f465cd8e114a3c110297e0143445b12125d729b25bada5bd88d5b30cf612d7dd", - "https://deno.land/std@0.132.0/node/_crypto/hash.ts": "6a84a079412d09ead27b900590f0bede9924bc7ce522b8b7d55183a2aaf63a68", - "https://deno.land/std@0.132.0/node/_crypto/pbkdf2.ts": "00af38578729b3060371dfee70dae502a5848b4cc4787c48f634195cab1ce89a", - "https://deno.land/std@0.132.0/node/_crypto/randomBytes.ts": "04e276bcbfa55b3502c7169deab3f2bf58bbc5e9727634f8a150eff734338e90", - "https://deno.land/std@0.132.0/node/_crypto/randomFill.ts": "019ff2a8330c3ede6e65af28c5a8e3dee9d404975749c8dadf6ba11ccc28528e", - "https://deno.land/std@0.132.0/node/_crypto/randomInt.ts": "2db981c2baf4ddac07b6da71f90677f4acf4dc2d93f351563fdd084d645b8413", - "https://deno.land/std@0.132.0/node/_crypto/scrypt.ts": "caf07a6b8afa6ac582f80f99ed7dc7fefd5476fcd2aad771b8440e5b883d6d70", - "https://deno.land/std@0.132.0/node/_crypto/timingSafeEqual.ts": "4a4ef17e482889d9d82138d5ffc0e787c32c04b1f12b28d076b1a69ceca46af1", - "https://deno.land/std@0.132.0/node/_crypto/types.ts": "d3fae758c5b62f63d8126c76eec31a5559a2f34305defb5fe2a7d9034057ff54", - "https://deno.land/std@0.132.0/node/_dns/_utils.ts": "42494c8b8fa1c13eb134c5696744f77197717fa857e4d05147f2395a739b0a40", - "https://deno.land/std@0.132.0/node/_events.mjs": "d7d56df4b9f69e445064bad5e5558978fb18c18c439bbb62fa13149b40d7fb99", - "https://deno.land/std@0.132.0/node/_fixed_queue.ts": "455b3c484de48e810b13bdf95cd1658ecb1ba6bcb8b9315ffe994efcde3ba5f5", - "https://deno.land/std@0.132.0/node/_fs/_fs_access.ts": "0700488320d37208d000b94767ab37208d469550767edab69b65b09a330f245d", - "https://deno.land/std@0.132.0/node/_fs/_fs_appendFile.ts": "5dca59d7f2ec33316d75da3d6a12d39f5c35b429bddf83f4b2c030b3a289d4b3", - "https://deno.land/std@0.132.0/node/_fs/_fs_chmod.ts": "8fc25677b82a2643686e6f8270a8f1bee87dd60986334591450699e199dac7d5", - "https://deno.land/std@0.132.0/node/_fs/_fs_chown.ts": "57858c54d376648fc3c8cf5a8ad4f7f19fb153b75fac3ed41df0332d757e7de9", - "https://deno.land/std@0.132.0/node/_fs/_fs_close.ts": "785a9d1a6d615e8aa9f5a4ac50c9a131931f8b0e17b3d4671cd1fd25a5c10f2b", - "https://deno.land/std@0.132.0/node/_fs/_fs_common.ts": "6a373d1583d9ec5cc7a8ff1072d77dc999e35282a320b7477038a2b209c304d3", - "https://deno.land/std@0.132.0/node/_fs/_fs_constants.ts": "5c20b190fc6b7cfdaf12a30ba545fc787db2c7bbe87ed5b890da99578116a339", - "https://deno.land/std@0.132.0/node/_fs/_fs_copy.ts": "675eb02a2dfc20dab1186bf6ed0a33b1abae656f440bc0a3ce74f385e0052eef", - "https://deno.land/std@0.132.0/node/_fs/_fs_dir.ts": "8a05f72e32dd568b41ef45f8f55f1f54e9a306a7588475fa7014289cd12872d9", - "https://deno.land/std@0.132.0/node/_fs/_fs_dirent.ts": "649c0a794e7b8d930cdd7e6a168b404aa0448bf784e0cfbe1bd6d25b99052273", - "https://deno.land/std@0.132.0/node/_fs/_fs_exists.ts": "83e9ca6ea1ab3c6c7c3fc45f3c1287ee88839f08140ac11056441537450055bb", - "https://deno.land/std@0.132.0/node/_fs/_fs_fdatasync.ts": "bbd078fea6c62c64d898101d697aefbfbb722797a75e328a82c2a4f2e7eb963d", - "https://deno.land/std@0.132.0/node/_fs/_fs_fstat.ts": "559ff6ff094337db37b0f3108aeaecf42672795af45b206adbd90105afebf9c6", - "https://deno.land/std@0.132.0/node/_fs/_fs_fsync.ts": "590be69ce5363dd4f8867f244cfabe8df89d40f86bbbe44fd00d69411d0b798e", - "https://deno.land/std@0.132.0/node/_fs/_fs_ftruncate.ts": "8eb2a9fcf026bd9b85dc07a22bc452c48db4be05ab83f5f2b6a0549e15c1f75f", - "https://deno.land/std@0.132.0/node/_fs/_fs_futimes.ts": "c753cb9e9f129a11d1110ed43905b8966ac2a1d362ed69d5a34bb44513b00082", - "https://deno.land/std@0.132.0/node/_fs/_fs_link.ts": "3f9ccce31c2e56284fbcf2c65ec2e6fed1d9e67a9997410223486ac5092888e3", - "https://deno.land/std@0.132.0/node/_fs/_fs_lstat.ts": "571cea559d270e3b2e7fc585b0eb051899f6d0e54b1786f5e2cee3e9f71e7f27", - "https://deno.land/std@0.132.0/node/_fs/_fs_mkdir.ts": "68421a23b6d3c2d0142a6d0b3ccdd87903f9c8f98d6754aba554ab4c6b435bb8", - "https://deno.land/std@0.132.0/node/_fs/_fs_mkdtemp.ts": "86eaec96c63ea178c749fa856115a345e9797baecad22297b9ef98e3d62b90e2", - "https://deno.land/std@0.132.0/node/_fs/_fs_open.ts": "b1ca72addd2723b2a5a876378e72609fbe168adad2006f5d7b4f1868beef65ca", - "https://deno.land/std@0.132.0/node/_fs/_fs_read.ts": "3b4ef96aad20f3f29a859125ebeac8c9461574743f70c2a7ef301b8505f7d036", - "https://deno.land/std@0.132.0/node/_fs/_fs_readFile.ts": "3eae6c930e08c1279d400c0f5a008e6d96949ff3a4f5bf7d43e1b94b94ce3854", - "https://deno.land/std@0.132.0/node/_fs/_fs_readdir.ts": "a546f01387b7c49ddc1bd78d0e123a9668c710c56cffb4d9577ef46703cab463", - "https://deno.land/std@0.132.0/node/_fs/_fs_readlink.ts": "00553cd155f3bea565ffe43d7f0c10d75e895455562e1e8ea153e8f4e7ac04c7", - "https://deno.land/std@0.132.0/node/_fs/_fs_realpath.ts": "3ec236e4ad3c171203043422939973b6a948200ec4802425db41fa60c860dde9", - "https://deno.land/std@0.132.0/node/_fs/_fs_rename.ts": "3be71e8f43275c349b7abb9343b6e6764df09fabcbd2d316f8ac170ea556c645", - "https://deno.land/std@0.132.0/node/_fs/_fs_rm.ts": "a9328f99d925d7c74d31361d466ca33475aa7c6d1d6f037a49ce1ed996f0a0b4", - "https://deno.land/std@0.132.0/node/_fs/_fs_rmdir.ts": "b74007891357e709b37e6721eb355a1c4f25575995bb7c961a3c40f03ebc624c", - "https://deno.land/std@0.132.0/node/_fs/_fs_stat.ts": "bd47ce0bfc2b867392abc6ec95878ab4f6dddb94af73903d6fa1a02ba3e26af8", - "https://deno.land/std@0.132.0/node/_fs/_fs_streams.ts": "0e54bd4e41b462a701d6729ea17db01624aa48109e402fea8eecf13be324cf16", - "https://deno.land/std@0.132.0/node/_fs/_fs_symlink.ts": "0bddc37c5092f847634bd41cee0b643b9c03fc541c0e635cf35da1fcb4d0f7fa", - "https://deno.land/std@0.132.0/node/_fs/_fs_truncate.ts": "e2d380f7a81f69c4d4db30c442558ba8d8dea561e5097af41022bb5724e494e5", - "https://deno.land/std@0.132.0/node/_fs/_fs_unlink.ts": "c537ca98e507972d65f0b113a179b5f5083f0da3e6f9fae29895fd2a9660c18a", - "https://deno.land/std@0.132.0/node/_fs/_fs_utimes.ts": "c4446b7e39bf6977eca4364360501a97b96db9ea41e0cdf49abddab73481a175", - "https://deno.land/std@0.132.0/node/_fs/_fs_watch.ts": "2338de777458021d39cb9f0a5f3ea1bd9109a7ca2c2ad6ec41029df1753838f8", - "https://deno.land/std@0.132.0/node/_fs/_fs_write.mjs": "8c130b8b9522e1e4b08e687eb27939240260c115fda1e38e99c57b4f3af6481f", - "https://deno.land/std@0.132.0/node/_fs/_fs_writeFile.ts": "79d176021c8ceae0d956763a33834166ebc3f1691ed9219a21674b2374f115c3", - "https://deno.land/std@0.132.0/node/_fs/_fs_writev.mjs": "274df0a109010862c8f8b320dc7784de9bd9425fe2a6afd05f1f06f547a25cba", - "https://deno.land/std@0.132.0/node/_next_tick.ts": "64c361f6bca21df2a72dd77b84bd49d80d97a694dd3080703bc78f52146351d1", - "https://deno.land/std@0.132.0/node/_options.ts": "27f3c1269a700d330cc046cf748aa9178b8fc39d1473de625688e07cb0eb9d28", - "https://deno.land/std@0.132.0/node/_process/exiting.ts": "bc9694769139ffc596f962087155a8bfef10101d03423b9dcbc51ce6e1f88fce", - "https://deno.land/std@0.132.0/node/_process/process.ts": "84644b184053835670f79652d1ce3312c9ad079c211e6207ebefeedf159352a3", - "https://deno.land/std@0.132.0/node/_process/stdio.mjs": "971c3b086040d8521562155db13f22f9971d5c42c852b2081d4d2f0d8b6ab6bd", - "https://deno.land/std@0.132.0/node/_process/streams.mjs": "555062e177ad05f887147651fdda25fa55098475fcf142c8d162b8fe14097bbb", - "https://deno.land/std@0.132.0/node/_stream.mjs": "07f6cbabaad0382fb4b9a25e70ac3093a44022b859247f64726746e6373f1c91", - "https://deno.land/std@0.132.0/node/_util/_util_callbackify.ts": "79928ad80df3e469f7dcdb198118a7436d18a9f6c08bd7a4382332ad25a718cf", - "https://deno.land/std@0.132.0/node/_utils.ts": "c2c352e83c4c96f5ff994b1c8246bff2abcb21bfc3f1c06162cb3af1d201e615", - "https://deno.land/std@0.132.0/node/buffer.ts": "fbecbf3f237fa49bec96e97ecf56a7b92d48037b3d11219288e68943cc921600", - "https://deno.land/std@0.132.0/node/crypto.ts": "fffbc3fc3dcc16ea986d3e89eed5f70db7dfef2c18d1205a8c8fe5327ee0192d", - "https://deno.land/std@0.132.0/node/dns.ts": "ae2abd1bc8ac79543fe4d702f2aa3607101dc788b6eeba06e06436cb42ee3779", - "https://deno.land/std@0.132.0/node/events.ts": "a1d40fc0dbccc944379ef968b80ea08f9fce579e88b5057fdb64e4f0812476dd", - "https://deno.land/std@0.132.0/node/fs.ts": "21a3189c460bd37ac3f6734e040587125b7c8435c0a9da4e6c57544a3aca81c2", - "https://deno.land/std@0.132.0/node/internal/assert.mjs": "118327c8866266534b30d3a36ad978204af7336dc2db3158b8167192918d4e06", - "https://deno.land/std@0.132.0/node/internal/async_hooks.ts": "8eca5b80f58ffb259e9b3a73536dc2fe2e67d07fd24bfe2aee325a4aa435edb3", - "https://deno.land/std@0.132.0/node/internal/blob.mjs": "52080b2f40b114203df67f8a6650f9fe3c653912b8b3ef2f31f029853df4db53", - "https://deno.land/std@0.132.0/node/internal/buffer.mjs": "6662fe7fe517329453545be34cea27a24f8ccd6d09afd4f609f11ade2b6dfca7", - "https://deno.land/std@0.132.0/node/internal/crypto/keys.ts": "16ce7b15a9fc5e4e3dee8fde75dae12f3d722558d5a1a6e65a9b4f86d64a21e9", - "https://deno.land/std@0.132.0/node/internal/crypto/util.mjs": "1de55a47fdbed6721b467a77ba48fdd1550c10b5eee77bbdb602eaffee365a5e", - "https://deno.land/std@0.132.0/node/internal/dtrace.ts": "50dd0e77b0269e47ff673bdb9ad0ef0ea3a3c53ac30c1695883ce4748e04ca14", - "https://deno.land/std@0.132.0/node/internal/error_codes.ts": "ac03c4eae33de3a69d6c98e8678003207eecf75a6900eb847e3fea3c8c9e6d8f", - "https://deno.land/std@0.132.0/node/internal/errors.ts": "25f91691225b001660e6e64745ecd336fbf562cf0185e8896ff013c2d0226794", - "https://deno.land/std@0.132.0/node/internal/fs/streams.ts": "c925db185efdf56c35cde8270c07d61698b80603a90e07caf1cb4ff80abf195b", - "https://deno.land/std@0.132.0/node/internal/fs/utils.mjs": "2a571ecbd169b444f07b7193306f108fdcb4bfd9b394b33716ad05edf30e899e", - "https://deno.land/std@0.132.0/node/internal/hide_stack_frames.ts": "a91962ec84610bc7ec86022c4593cdf688156a5910c07b5bcd71994225c13a03", - "https://deno.land/std@0.132.0/node/internal/idna.ts": "a8bdd28431f06630d8aad85d3cb8fd862459107af228c8805373ad2080f1c587", - "https://deno.land/std@0.132.0/node/internal/net.ts": "1239886cd2508a68624c2dae8abf895e8aa3bb15a748955349f9ac5539032238", - "https://deno.land/std@0.132.0/node/internal/normalize_encoding.mjs": "3779ec8a7adf5d963b0224f9b85d1bc974a2ec2db0e858396b5d3c2c92138a0a", - "https://deno.land/std@0.132.0/node/internal/process/per_thread.mjs": "a42b1dcfb009ad5039144a999a35a429e76112f9322febbe353eda9d1879d936", - "https://deno.land/std@0.132.0/node/internal/querystring.ts": "c3b23674a379f696e505606ddce9c6feabe9fc497b280c56705c340f4028fe74", - "https://deno.land/std@0.132.0/node/internal/stream_base_commons.ts": "934a9e69f46f2de644956edfa9fb040af7861e326fe5325dab38ef9caf2940bc", - "https://deno.land/std@0.132.0/node/internal/streams/_utils.ts": "77fceaa766679847e4d4c3c96b2573c00a790298d90551e8e4df1d5e0fdaad3b", - "https://deno.land/std@0.132.0/node/internal/streams/add-abort-signal.mjs": "5623b83fa64d439cc4a1f09ae47ec1db29512cc03479389614d8f62a37902f5e", - "https://deno.land/std@0.132.0/node/internal/streams/buffer_list.mjs": "c6a7b29204fae025ff5e9383332acaea5d44bc7c522a407a79b8f7a6bc6c312d", - "https://deno.land/std@0.132.0/node/internal/streams/compose.mjs": "b522daab35a80ae62296012a4254fd7edfc0366080ffe63ddda4e38fe6b6803e", - "https://deno.land/std@0.132.0/node/internal/streams/destroy.mjs": "9c9bbeb172a437041d529829f433df72cf0b63ae49f3ee6080a55ffbef7572ad", - "https://deno.land/std@0.132.0/node/internal/streams/duplex.mjs": "b014087cd04f79b8a4028d8b9423b987e07bbfacf3b5df518cb752ac3657580f", - "https://deno.land/std@0.132.0/node/internal/streams/end-of-stream.mjs": "38be76eaceac231dfde643e72bc0940625446bf6d1dbd995c91c5ba9fd59b338", - "https://deno.land/std@0.132.0/node/internal/streams/from.mjs": "134255c698ed63b33199911eb8e042f8f67e9682409bb11552e6120041ed1872", - "https://deno.land/std@0.132.0/node/internal/streams/legacy.mjs": "6ea28db95d4503447473e62f0b23ff473bfe1751223c33a3c5816652e93b257a", - "https://deno.land/std@0.132.0/node/internal/streams/passthrough.mjs": "a51074193b959f3103d94de41e23a78dfcff532bdba53af9146b86340d85eded", - "https://deno.land/std@0.132.0/node/internal/streams/pipeline.mjs": "9890b121759ede869174ef70c011fde964ca94d81f2ed97b8622d7cb17b49285", - "https://deno.land/std@0.132.0/node/internal/streams/readable.mjs": "a70c41171ae25c556b52785b0c178328014bd33d8c0e4d229d4adaac7414b6ca", - "https://deno.land/std@0.132.0/node/internal/streams/state.mjs": "9ef917392a9d8005a6e038260c5fd31518d2753aea0bc9e39824c199310434cb", - "https://deno.land/std@0.132.0/node/internal/streams/transform.mjs": "3b361abad2ac78f7ccb6f305012bafdc0e983dfa4bb6ecddb4626e34a781a5f5", - "https://deno.land/std@0.132.0/node/internal/streams/utils.mjs": "06c21d0db0d51f1bf1e3225a661c3c29909be80355d268e64ee5922fc5eb6c5e", - "https://deno.land/std@0.132.0/node/internal/streams/writable.mjs": "ad4e2b176ffdf752c8e678ead3a514679a5a8d652f4acf797115dceb798744d5", - "https://deno.land/std@0.132.0/node/internal/timers.mjs": "b43e24580cec2dd50f795e4342251a79515c0db21630c25b40fdc380a78b74e7", - "https://deno.land/std@0.132.0/node/internal/url.ts": "eacef0ace4f4c5394e9818a81499f4871b2a993d1bd3b902047e44a381ef0e22", - "https://deno.land/std@0.132.0/node/internal/util.mjs": "2f0c8ff553c175ea6e4ed13d7cd7cd6b86dc093dc2f783c6c3dfc63f60a0943e", - "https://deno.land/std@0.132.0/node/internal/util/comparisons.ts": "680b55fe8bdf1613633bc469fa0440f43162c76dbe36af9aa2966310e1bb9f6e", - "https://deno.land/std@0.132.0/node/internal/util/debuglog.ts": "99e91bdf26f6c67861031f684817e1705a5bc300e81346585b396f413387edfb", - "https://deno.land/std@0.132.0/node/internal/util/inspect.mjs": "d1c2569c66a3dab45eec03208f22ad4351482527859c0011a28a6c797288a0aa", - "https://deno.land/std@0.132.0/node/internal/util/types.ts": "b2dacb8f1f5d28a51c4da5c5b75172b7fcf694073ce95ca141323657e18b0c60", - "https://deno.land/std@0.132.0/node/internal/validators.mjs": "a7e82eafb7deb85c332d5f8d9ffef052f46a42d4a121eada4a54232451acc49a", - "https://deno.land/std@0.132.0/node/internal_binding/_libuv_winerror.ts": "801e05c2742ae6cd42a5f0fd555a255a7308a65732551e962e5345f55eedc519", - "https://deno.land/std@0.132.0/node/internal_binding/_node.ts": "e4075ba8a37aef4eb5b592c8e3807c39cb49ca8653faf8e01a43421938076c1b", - "https://deno.land/std@0.132.0/node/internal_binding/_utils.ts": "1c50883b5751a9ea1b38951e62ed63bacfdc9d69ea665292edfa28e1b1c5bd94", - "https://deno.land/std@0.132.0/node/internal_binding/_winerror.ts": "8811d4be66f918c165370b619259c1f35e8c3e458b8539db64c704fbde0a7cd2", - "https://deno.land/std@0.132.0/node/internal_binding/async_wrap.ts": "f06b8a403ad871248eb064190d27bf6fefdbe948991e71a18d7077390d5773f9", - "https://deno.land/std@0.132.0/node/internal_binding/buffer.ts": "722c62b85f966e0777b2d98c021b60e75d7f2c2dabc43413ef37d60dbd13a5d9", - "https://deno.land/std@0.132.0/node/internal_binding/cares_wrap.ts": "25b7b5d56612b2985260b673021828d6511a1c83b4c1927f5732cad2f2a718af", - "https://deno.land/std@0.132.0/node/internal_binding/config.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/connection_wrap.ts": "0380444ee94d5bd7b0b09921223d16729c9762a94e80b7f51eda49c7f42e6d0a", - "https://deno.land/std@0.132.0/node/internal_binding/constants.ts": "aff06aac49eda4234bd3a2b0b8e1fbfc67824e281c532ff9960831ab503014cc", - "https://deno.land/std@0.132.0/node/internal_binding/contextify.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/credentials.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/crypto.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/errors.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/fs.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/fs_dir.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/fs_event_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/handle_wrap.ts": "e59df84b1fb1b9823b09774b3e512d9c0029b4557400d09dd02cd7661c2c4830", - "https://deno.land/std@0.132.0/node/internal_binding/heap_utils.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/http_parser.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/icu.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/inspector.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/js_stream.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/messaging.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/mod.ts": "f68e74e8eed84eaa6b0de24f0f4c47735ed46866d7ee1c5a5e7c0667b4f0540f", - "https://deno.land/std@0.132.0/node/internal_binding/module_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/native_module.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/natives.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/node_file.ts": "c96ee0b2af319a3916de950a6c4b0d5fb00d09395c51cd239c54d95d62567aaf", - "https://deno.land/std@0.132.0/node/internal_binding/node_options.ts": "3cd5706153d28a4f5944b8b162c1c61b7b8e368a448fb1a2cff9f7957d3db360", - "https://deno.land/std@0.132.0/node/internal_binding/options.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/os.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/performance.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/pipe_wrap.ts": "00e942327f8e1c4b74a5888a82f0e16ba775cd09af804f96b6f6849b7eab1719", - "https://deno.land/std@0.132.0/node/internal_binding/process_methods.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/report.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/serdes.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/signal_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/spawn_sync.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/stream_wrap.ts": "d6e96f4b89d82ad5cc9b243c3d3880c9d85086165da54a7d85821a63491e5abf", - "https://deno.land/std@0.132.0/node/internal_binding/string_decoder.ts": "5cb1863763d1e9b458bc21d6f976f16d9c18b3b3f57eaf0ade120aee38fba227", - "https://deno.land/std@0.132.0/node/internal_binding/symbols.ts": "51cfca9bb6132d42071d4e9e6b68a340a7f274041cfcba3ad02900886e972a6c", - "https://deno.land/std@0.132.0/node/internal_binding/task_queue.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/tcp_wrap.ts": "10c64d5e092a8bff99cfe05adea716e4e52f4158662a5821790953e47e2cc21c", - "https://deno.land/std@0.132.0/node/internal_binding/timers.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/tls_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/trace_events.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/tty_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/types.ts": "4c26fb74ba2e45de553c15014c916df6789529a93171e450d5afb016b4c765e7", - "https://deno.land/std@0.132.0/node/internal_binding/udp_wrap.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/url.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/util.ts": "90364292e2bd598ab5d105b48ca49817b6708f2d1d9cbaf08b2b3ab5ca4c90a7", - "https://deno.land/std@0.132.0/node/internal_binding/uv.ts": "3821bc5e676d6955d68f581988c961d77dd28190aba5a9c59f16001a4deb34ba", - "https://deno.land/std@0.132.0/node/internal_binding/v8.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/worker.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/internal_binding/zlib.ts": "e292217d048a33573966b7d25352828d3282921fbcadce8735a20fb3da370cc4", - "https://deno.land/std@0.132.0/node/net.ts": "dfcb7e412abb3d5c55edde7d823b0ccb9601f7d40555ae3c862810c78b176185", - "https://deno.land/std@0.132.0/node/os.ts": "943d3294a7a00f39491148cd2097cdbf101233a421262223bb20ae702c059df5", - "https://deno.land/std@0.132.0/node/path.ts": "c65858e9cbb52dbc0dd348eefcdc41e82906c39cfa7982f2d4d805e828414b8c", - "https://deno.land/std@0.132.0/node/path/_constants.ts": "bd26f24a052b7d6b746151f4a236d29ab3c2096883bb6449c2fa499494406672", - "https://deno.land/std@0.132.0/node/path/_interface.ts": "6034ee29f6f295460ec82db1a94df9269aecbb0eceb81be72e9d843f8e8a97e6", - "https://deno.land/std@0.132.0/node/path/_util.ts": "9d4735fc05f8f1fb94406450e84e23fd201dc3fef5298b009e44cfa4e797b8f0", - "https://deno.land/std@0.132.0/node/path/common.ts": "f41a38a0719a1e85aa11c6ba3bea5e37c15dd009d705bd8873f94c833568cbc4", - "https://deno.land/std@0.132.0/node/path/glob.ts": "d6b64a24f148855a6e8057a171a2f9910c39e492e4ccec482005205b28eb4533", - "https://deno.land/std@0.132.0/node/path/mod.ts": "62e21dc6e1fe2e9742fce85de631a7b067d968544fe66954578e6d73c97369a2", - "https://deno.land/std@0.132.0/node/path/posix.ts": "9dd5fc83c4ae0e0b700bef43c88c67e276840c187a66d4d6a661440cf1fecc52", - "https://deno.land/std@0.132.0/node/path/separator.ts": "c908c9c28ebe7f1fea67daaccf84b63af90d882fe986f9fa03af9563a852723a", - "https://deno.land/std@0.132.0/node/path/win32.ts": "f869ee449b6dee69b13e2d1f8f7f1d01c7ae1e67fa573eab789429929f7a3864", - "https://deno.land/std@0.132.0/node/process.ts": "699f47f2f177556e17e2f7d0dcd3705ff5065cbdf72029e534c1540404d6f501", - "https://deno.land/std@0.132.0/node/querystring.ts": "967b8a7b00a73ebe373666deb3a7e501f164bac27bb342fde7221ecbb3522689", - "https://deno.land/std@0.132.0/node/stream.ts": "d127faa074a9e3886e4a01dcfe9f9a6a4b5641f76f6acc356e8ded7da5dc2c81", - "https://deno.land/std@0.132.0/node/stream/promises.mjs": "b263c09f2d6bd715dc514fab3f99cca84f442e2d23e87adbe76e32ea46fc87e6", - "https://deno.land/std@0.132.0/node/string_decoder.ts": "51ce85a173d2e36ac580d418bb48b804adb41732fc8bd85f7d5d27b7accbc61f", - "https://deno.land/std@0.132.0/node/timers.ts": "2d66fcd21e37acf76c3a699a97230da57cc21382c8e885b3c5377b37efd0f06c", - "https://deno.land/std@0.132.0/node/url.ts": "bc0bde2774854b6a377c4c61fa73e5a28283cbeb7f8703479f44e471219c33a8", - "https://deno.land/std@0.132.0/node/util.ts": "7fd6933b37af89a8e64d73dc6ee1732455a59e7e6d0965311fbd73cd634ea630", - "https://deno.land/std@0.132.0/node/util/types.mjs": "f9288198cacd374b41bae7e92a23179d3160f4c0eaf14e19be3a4e7057219a60", - "https://deno.land/std@0.132.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", - "https://deno.land/std@0.132.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", - "https://deno.land/std@0.132.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", - "https://deno.land/std@0.132.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", - "https://deno.land/std@0.132.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", - "https://deno.land/std@0.132.0/path/mod.ts": "4275129bb766f0e475ecc5246aa35689eeade419d72a48355203f31802640be7", - "https://deno.land/std@0.132.0/path/posix.ts": "663e4a6fe30a145f56aa41a22d95114c4c5582d8b57d2d7c9ed27ad2c47636bb", - "https://deno.land/std@0.132.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", - "https://deno.land/std@0.132.0/path/win32.ts": "e7bdf63e8d9982b4d8a01ef5689425c93310ece950e517476e22af10f41a136e", - "https://deno.land/std@0.132.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", - "https://deno.land/std@0.132.0/testing/_diff.ts": "9d849cd6877694152e01775b2d93f9d6b7aef7e24bfe3bfafc4d7a1ac8e9f392", - "https://deno.land/std@0.132.0/testing/asserts.ts": "b0ef969032882b1f7eb1c7571e313214baa1485f7b61cf35807b2434e254365c", "https://deno.land/std@0.214.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5", "https://deno.land/std@0.214.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8", "https://deno.land/std@0.214.0/async/delay.ts": "8e1d18fe8b28ff95885e2bc54eccec1713f57f756053576d8228e6ca110793ad", @@ -4437,99 +4127,15 @@ "https://deno.land/std@0.224.0/assert/unimplemented.ts": "8c55a5793e9147b4f1ef68cd66496b7d5ba7a9e7ca30c6da070c1a58da723d73", "https://deno.land/std@0.224.0/assert/unreachable.ts": "5ae3dbf63ef988615b93eb08d395dda771c96546565f9e521ed86f6510c29e19", "https://deno.land/std@0.224.0/async/delay.ts": "f90dd685b97c2f142b8069082993e437b1602b8e2561134827eeb7c12b95c499", - "https://deno.land/std@0.224.0/bytes/concat.ts": "86161274b5546a02bdb3154652418efe7af8c9310e8d54107a68aaa148e0f5ed", - "https://deno.land/std@0.224.0/collections/_utils.ts": "b2ec8ada31b5a72ebb1d99774b849b4c09fe4b3a38d07794bd010bd218a16e0b", - "https://deno.land/std@0.224.0/collections/aggregate_groups.ts": "c63a57a16e87537ee71df1174a111e2c4cd05f0d4be83db701c8740e81bd157c", - "https://deno.land/std@0.224.0/collections/associate_by.ts": "8c09c6a66769480f3181bd7b582796aed85fa71e2595c1b3d73684b9caae33b1", - "https://deno.land/std@0.224.0/collections/associate_with.ts": "5cbbdb53ffb0160338b86d7c3ba6e0b343c66d5104ccff4430dd766c603ea3d4", - "https://deno.land/std@0.224.0/collections/chunk.ts": "e6e533d6ae047f2082892831d463426f79cdd0d3f09ce298317a8469abf8467e", - "https://deno.land/std@0.224.0/collections/deep_merge.ts": "04f8d2a6cfa15c7580e788689bcb5e162512b9ccb18bab1241824b432a78551e", - "https://deno.land/std@0.224.0/collections/distinct.ts": "42d81633e4ccd5ea89118cb08f875bbfc683ac6620df2fa60f3d07270b177f4d", - "https://deno.land/std@0.224.0/collections/distinct_by.ts": "e895705decb0ce88b31c6679fd4e2bd08ac6d47cde7d00bf2016e3c2bac565a7", - "https://deno.land/std@0.224.0/collections/drop_last_while.ts": "4bfb91818d0165b172843bfd41a8b988e566b23a29e038794ca832118de150bf", - "https://deno.land/std@0.224.0/collections/drop_while.ts": "cf15d7f83ece2828e1fe04bbe04b646801d11be9c259a0f47c1b0ac2aa7dabdf", - "https://deno.land/std@0.224.0/collections/filter_entries.ts": "12202e99001695fcf541ec0191e9762fe7290ba4597df762d3a0c6e611a1aafe", - "https://deno.land/std@0.224.0/collections/filter_keys.ts": "bf8eaae2769e6ddd34f23ba1912f7feda2b6f374253c07a6630e9a2e384ba611", - "https://deno.land/std@0.224.0/collections/filter_values.ts": "ad8fae5751977598f8c794d65f0d42c9f9e47a7d774cf82b2449cd78ff4f729a", - "https://deno.land/std@0.224.0/collections/find_single.ts": "d2f69dd19d85c85d0f82ffff18517076795fe8a4a960b75f33b00655e070d6f7", - "https://deno.land/std@0.224.0/collections/first_not_nullish_of.ts": "cc5581ace9b896c83b9c002dc90a2f7b4c5dcddc319d78542287479dd348c300", - "https://deno.land/std@0.224.0/collections/includes_value.ts": "c5755ad1ac0b95cdc60ca794ada0e65e85ecad96729a9f6cd715516b77497564", - "https://deno.land/std@0.224.0/collections/intersect.ts": "9a4427ce81bd0982f4e6e65c51da99648b09f89ed0e4950fcf89fc7052336e60", - "https://deno.land/std@0.224.0/collections/join_to_string.ts": "6f3441958aeb382e8e35be527e5ff5e6f6346e83ac4c17fe3f9fa293eff0f18e", - "https://deno.land/std@0.224.0/collections/map_entries.ts": "45b8bf3f197ee24abe2e078213a4cf2f4e187ad130649fff34e13b1a03ede478", - "https://deno.land/std@0.224.0/collections/map_keys.ts": "2fd91963117d2376ea6dbbe473d77c20ede79b72437ed0dac36161b1af62f058", - "https://deno.land/std@0.224.0/collections/map_not_nullish.ts": "f519f74db550afcf6c6e2486382cb4dc6b0465e4234b6acca26910d118e7dd55", - "https://deno.land/std@0.224.0/collections/map_values.ts": "91d6ece4b4dc4b94abc378f51e0e309e7f7f18b2ce4c335dab673a31ebd17c75", - "https://deno.land/std@0.224.0/collections/max_by.ts": "a601c296d54349097d5b424bc86c84010ab22733b622b480e2ad65927063d7bb", - "https://deno.land/std@0.224.0/collections/max_of.ts": "a56297ed49ee42eb948d348451c9158c9f7b8e4e1fc0259829e945924893ca07", - "https://deno.land/std@0.224.0/collections/max_with.ts": "ea4838b17246166991ed033c52b43f04be957168c12bdb193b0f8ffdd046a6d0", - "https://deno.land/std@0.224.0/collections/min_by.ts": "79477d359b5882acf670179ba18ac619b63bb01f8a681d067f9fb318f3367dfe", - "https://deno.land/std@0.224.0/collections/min_of.ts": "a80b6881494f505fe42c160317225c99a69bf393419563063ac2dd258cffd9b2", - "https://deno.land/std@0.224.0/collections/min_with.ts": "94e011b9f0329be593527975c5f511b02010c4f42a50098297cb5012a418ac76", - "https://deno.land/std@0.224.0/collections/mod.ts": "c65d90938582b7d0b3e8fc319cc6d41d736f87656a256428c7b4cd600703fd62", - "https://deno.land/std@0.224.0/collections/omit.ts": "7a875ecbb02e3c418195325fd8c520bcf492362344d4d6b295d2e0f101ccccae", - "https://deno.land/std@0.224.0/collections/partition.ts": "22689dc4834bbcaa06f9ac204ac5502ab0f7087d7fca26bad50319c12434d099", - "https://deno.land/std@0.224.0/collections/partition_entries.ts": "4112ef54d8f1b24a281a432d1d55e183c260139da9153a8449021884ff2bd675", - "https://deno.land/std@0.224.0/collections/permutations.ts": "976f444c0fe52f764ad473d2dbcfbc5a97a3066aebed2f809e084c548dcf7f19", - "https://deno.land/std@0.224.0/collections/pick.ts": "eb3940ff8107e5990e35b30f4cc63f52a469e35b53dc83f904b0f30fab968bc3", - "https://deno.land/std@0.224.0/collections/reduce_groups.ts": "59a375aec7dfacdf1f22c39e618fbbfbfb50ed36e338b1c57c704beadaeef2a7", - "https://deno.land/std@0.224.0/collections/running_reduce.ts": "b8b4b5bf0b3d61db8fc0993b9e7e630fba299e360c463ebb0d3ce7e12a65abeb", - "https://deno.land/std@0.224.0/collections/sample.ts": "bdf721d86a6eb3d27ae419aea92a2f24a3de19772b24aad831064e8a0ff7ecd1", - "https://deno.land/std@0.224.0/collections/sliding_windows.ts": "254402e0603a94063a90e5561c48435c2fb278b8915e801632b8deebdd731219", - "https://deno.land/std@0.224.0/collections/sort_by.ts": "c84b51b70e9698313c021d11531a1eb07ddda0f423b7778e3cda24663c8b0eaa", - "https://deno.land/std@0.224.0/collections/sum_of.ts": "a7617a77c2501a54dedf50bc4211ca6c06c9678eee00c31a63e187cc8f0b3b97", - "https://deno.land/std@0.224.0/collections/take_last_while.ts": "d6e05d89e17c4e59015aff3b8e2b08a9d72314c77363590c0db2775f43cbf47b", - "https://deno.land/std@0.224.0/collections/take_while.ts": "b281c439e5195bc1e8a7f75aa538b4a920aeae9b29a45f0df468b4f48434506d", - "https://deno.land/std@0.224.0/collections/union.ts": "7eaec5f85dbf115e14695a740ce43b0463f6202ee2b10408b31efa7b4eeb1968", - "https://deno.land/std@0.224.0/collections/unzip.ts": "7dbe500a7b283a4ad6000316f98e0f590f084be103b3ea2e0519a7e3d98a38b2", - "https://deno.land/std@0.224.0/collections/without_all.ts": "c85ec7c536037385d1b99f9820ccb0e05eea385422e74132c8c081f4dcb353e5", - "https://deno.land/std@0.224.0/collections/zip.ts": "5320938b447da8a8ed4811d6248829886c7ddd088e1653cfce6e59d0abb73692", - "https://deno.land/std@0.224.0/crypto/_wasm/lib/deno_std_wasm_crypto.generated.mjs": "7cd490ae1553c97459bd02de4c3f0a552768a85621949b2366003f3cf84b99d7", - "https://deno.land/std@0.224.0/crypto/_wasm/mod.ts": "e89fbbc3c4722602ff975dd85f18273c7741ec766a9b68f6de4fd1d9876409f8", - "https://deno.land/std@0.224.0/crypto/crypto.ts": "e58d78f3db111a499261dbab037ec78cc89da0516a50e1f0205665980a3417e3", - "https://deno.land/std@0.224.0/crypto/mod.ts": "9148fb70ca3d64977e9487b2002d3b1026e8ad8a2078774b807586ba3c77e3bb", - "https://deno.land/std@0.224.0/crypto/timing_safe_equal.ts": "bc3622b5aec05e2d8b735bf60633425c34333c06cfb6c4a9f102e4a0f3931ced", - "https://deno.land/std@0.224.0/crypto/unstable_keystack.ts": "c2a6f6ed67a4e78745e3c9b490ebb7c12f6066f5c2fe0c69d353961909dc82dd", - "https://deno.land/std@0.224.0/csv/_io.ts": "568718b7eb4cf3ba140b0690a00ef5a8416ceae9a4116f386114c83717bd8a9e", - "https://deno.land/std@0.224.0/csv/csv_parse_stream.ts": "f06696ed1fbda5cb75426dff735b9cc91227eb0fa5367591b98bf88b99ae3048", - "https://deno.land/std@0.224.0/csv/csv_stringify_stream.ts": "b564e43b884eb9ab8e1efee8c30a0868a1a9328a33c32a7dd436dc26f63954ac", - "https://deno.land/std@0.224.0/csv/mod.ts": "289ecf79b3609f63dfc1d39a7c791f8f14b73b29fb65bbb6b3e3e2bd0cddc75d", - "https://deno.land/std@0.224.0/csv/parse.ts": "e2d5e82e19b71a968f5fcd3b76b438ee6f646fe8e948c4c2d3b00ad9cd0a659a", - "https://deno.land/std@0.224.0/csv/stringify.ts": "9e0badcbc32fc63ee089d2dfbc5721650d5766ef0a554f07243ab8f03f7c3127", "https://deno.land/std@0.224.0/datetime/constants.ts": "5df80a84e301da6db5793804122c034d2d090da31f1e1c5fdaa831fc70a45da7", "https://deno.land/std@0.224.0/datetime/difference.ts": "8da08374910cae7d316cd7669912b70465f36d4e159e2c9f525a441f91fa9c7a", - "https://deno.land/std@0.224.0/encoding/_util.ts": "beacef316c1255da9bc8e95afb1fa56ed69baef919c88dc06ae6cb7a6103d376", - "https://deno.land/std@0.224.0/encoding/base64.ts": "dd59695391584c8ffc5a296ba82bcdba6dd8a84d41a6a539fbee8e5075286eaf", - "https://deno.land/std@0.224.0/encoding/base64url.ts": "ef40e0f18315ab539f17cebcc32839779e018d86dea9df39d94d302f342a1713", "https://deno.land/std@0.224.0/fmt/colors.ts": "508563c0659dd7198ba4bbf87e97f654af3c34eb56ba790260f252ad8012e1c5", - "https://deno.land/std@0.224.0/fs/_create_walk_entry.ts": "5d9d2aaec05bcf09a06748b1684224d33eba7a4de24cf4cf5599991ca6b5b412", - "https://deno.land/std@0.224.0/fs/_get_file_info_type.ts": "da7bec18a7661dba360a1db475b826b18977582ce6fc9b25f3d4ee0403fe8cbd", - "https://deno.land/std@0.224.0/fs/_is_same_path.ts": "709c95868345fea051c58b9e96af95cff94e6ae98dfcff2b66dee0c212c4221f", - "https://deno.land/std@0.224.0/fs/_is_subdir.ts": "c68b309d46cc8568ed83c000f608a61bbdba0943b7524e7a30f9e450cf67eecd", - "https://deno.land/std@0.224.0/fs/_to_path_string.ts": "29bfc9c6c112254961d75cbf6ba814d6de5349767818eb93090cecfa9665591e", - "https://deno.land/std@0.224.0/fs/copy.ts": "7ab12a16adb65d155d4943c88081ca16ce3b0b5acada64c1ce93800653678039", - "https://deno.land/std@0.224.0/fs/empty_dir.ts": "e400e96e1d2c8c558a5a1712063bd43939e00619c1d1cc29959babc6f1639418", - "https://deno.land/std@0.224.0/fs/ensure_dir.ts": "51a6279016c65d2985f8803c848e2888e206d1b510686a509fa7cc34ce59d29f", - "https://deno.land/std@0.224.0/fs/ensure_file.ts": "67608cf550529f3d4aa1f8b6b36bf817bdc40b14487bf8f60e61cbf68f507cf3", - "https://deno.land/std@0.224.0/fs/ensure_link.ts": "5c98503ebfa9cc05e2f2efaa30e91e60b4dd5b43ebbda82f435c0a5c6e3ffa01", - "https://deno.land/std@0.224.0/fs/ensure_symlink.ts": "cafe904cebacb9a761977d6dbf5e3af938be946a723bb394080b9a52714fafe4", - "https://deno.land/std@0.224.0/fs/eol.ts": "18c4ac009d0318504c285879eb7f47942643f13619e0ff070a0edc59353306bd", "https://deno.land/std@0.224.0/fs/exists.ts": "3d38cb7dcbca3cf313be343a7b8af18a87bddb4b5ca1bd2314be12d06533b50f", - "https://deno.land/std@0.224.0/fs/expand_glob.ts": "2e428d90acc6676b2aa7b5c78ef48f30641b13f1fe658e7976c9064fb4b05309", - "https://deno.land/std@0.224.0/fs/mod.ts": "c25e6802cbf27f3050f60b26b00c2d8dba1cb7fcdafe34c66006a7473b7b34d4", - "https://deno.land/std@0.224.0/fs/move.ts": "ca205d848908d7f217353bc5c623627b1333490b8b5d3ef4cab600a700c9bd8f", - "https://deno.land/std@0.224.0/fs/walk.ts": "cddf87d2705c0163bff5d7767291f05b0f46ba10b8b28f227c3849cace08d303", "https://deno.land/std@0.224.0/internal/diff.ts": "6234a4b493ebe65dc67a18a0eb97ef683626a1166a1906232ce186ae9f65f4e6", "https://deno.land/std@0.224.0/internal/format.ts": "0a98ee226fd3d43450245b1844b47003419d34d210fa989900861c79820d21c2", "https://deno.land/std@0.224.0/internal/mod.ts": "534125398c8e7426183e12dc255bb635d94e06d0f93c60a297723abe69d3b22e", "https://deno.land/std@0.224.0/io/types.ts": "acecb3074c730b5ff487ba4fe9ce51e67bd982aa07c95e5f5679b7b2f24ad129", "https://deno.land/std@0.224.0/io/write_all.ts": "24aac2312bb21096ae3ae0b102b22c26164d3249dff96dbac130958aa736f038", - "https://deno.land/std@0.224.0/json/_common.ts": "6444c6ea166514eb379f778d9216c1d8eb159f97c753aeeb1fc44cd091e30544", - "https://deno.land/std@0.224.0/json/common.ts": "33f1a4f39a45e2f9f357823fd0b5cf88b63fb4784b8c9a28f8120f70a20b23e9", - "https://deno.land/std@0.224.0/json/concatenated_json_parse_stream.ts": "13a707615e03e5ea93ac81e5f00420e3b7764c4e3fa88043e63bbac87ebe62ce", - "https://deno.land/std@0.224.0/json/json_parse_stream.ts": "2740652ea73726cd0f2edc89188b35d64a1ec15dc8cf7fd87db52a0170bc182c", - "https://deno.land/std@0.224.0/json/json_stringify_stream.ts": "269633e63d4e38ab3ba31e76a4292d11b9eb3151e26ff4f49dee1c264b4878fa", - "https://deno.land/std@0.224.0/json/mod.ts": "acd3e39a6c68c70ee7fa93991a8a8f02d799f7394db3cef09594e2dd8fd69814", "https://deno.land/std@0.224.0/log/_config.ts": "489e11b6d3c917bf5fc954c5e914c095d3480efd924d1e85f2fc576468581c54", "https://deno.land/std@0.224.0/log/_state.ts": "314c0c31ab9c8f4fb33326ad446757d35f75e5bb21746b7720ed4e3f3a939da1", "https://deno.land/std@0.224.0/log/base_handler.ts": "f03f013dac9c1a226aab60c6f5751b3131cc4f2808720715285e0dab5697a54e", @@ -4561,17 +4167,7 @@ "https://deno.land/std@0.224.0/path/_common/strip_trailing_separators.ts": "7024a93447efcdcfeaa9339a98fa63ef9d53de363f1fbe9858970f1bba02655a", "https://deno.land/std@0.224.0/path/_common/to_file_url.ts": "7f76adbc83ece1bba173e6e98a27c647712cab773d3f8cbe0398b74afc817883", "https://deno.land/std@0.224.0/path/_interface.ts": "8dfeb930ca4a772c458a8c7bbe1e33216fe91c253411338ad80c5b6fa93ddba0", - "https://deno.land/std@0.224.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15", - "https://deno.land/std@0.224.0/path/basename.ts": "7ee495c2d1ee516ffff48fb9a93267ba928b5a3486b550be73071bc14f8cc63e", - "https://deno.land/std@0.224.0/path/constants.ts": "0c206169ca104938ede9da48ac952de288f23343304a1c3cb6ec7625e7325f36", - "https://deno.land/std@0.224.0/path/dirname.ts": "85bd955bf31d62c9aafdd7ff561c4b5fb587d11a9a5a45e2b01aedffa4238a7c", - "https://deno.land/std@0.224.0/path/from_file_url.ts": "911833ae4fd10a1c84f6271f36151ab785955849117dc48c6e43b929504ee069", - "https://deno.land/std@0.224.0/path/glob_to_regexp.ts": "7f30f0a21439cadfdae1be1bf370880b415e676097fda584a63ce319053b5972", - "https://deno.land/std@0.224.0/path/is_absolute.ts": "4791afc8bfd0c87f0526eaa616b0d16e7b3ab6a65b62942e50eac68de4ef67d7", "https://deno.land/std@0.224.0/path/is_glob.ts": "a65f6195d3058c3050ab905705891b412ff942a292bcbaa1a807a74439a14141", - "https://deno.land/std@0.224.0/path/join.ts": "ae2ec5ca44c7e84a235fd532e4a0116bfb1f2368b394db1c4fb75e3c0f26a33a", - "https://deno.land/std@0.224.0/path/join_globs.ts": "5b3bf248b93247194f94fa6947b612ab9d3abd571ca8386cf7789038545e54a0", - "https://deno.land/std@0.224.0/path/normalize.ts": "4155743ccceeed319b350c1e62e931600272fad8ad00c417b91df093867a8352", "https://deno.land/std@0.224.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d", "https://deno.land/std@0.224.0/path/posix/basename.ts": "d2fa5fbbb1c5a3ab8b9326458a8d4ceac77580961b3739cd5bfd1d3541a3e5f0", "https://deno.land/std@0.224.0/path/posix/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", @@ -4593,31 +4189,66 @@ "https://deno.land/std@0.224.0/path/posix/resolve.ts": "08b699cfeee10cb6857ccab38fa4b2ec703b0ea33e8e69964f29d02a2d5257cf", "https://deno.land/std@0.224.0/path/posix/to_file_url.ts": "7aa752ba66a35049e0e4a4be5a0a31ac6b645257d2e031142abb1854de250aaf", "https://deno.land/std@0.224.0/path/posix/to_namespaced_path.ts": "28b216b3c76f892a4dca9734ff1cc0045d135532bfd9c435ae4858bfa5a2ebf0", - "https://deno.land/std@0.224.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d", - "https://deno.land/std@0.224.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808", - "https://deno.land/std@0.224.0/path/windows/basename.ts": "6bbc57bac9df2cec43288c8c5334919418d784243a00bc10de67d392ab36d660", - "https://deno.land/std@0.224.0/path/windows/constants.ts": "5afaac0a1f67b68b0a380a4ef391bf59feb55856aa8c60dfc01bd3b6abb813f5", - "https://deno.land/std@0.224.0/path/windows/dirname.ts": "33e421be5a5558a1346a48e74c330b8e560be7424ed7684ea03c12c21b627bc9", - "https://deno.land/std@0.224.0/path/windows/from_file_url.ts": "ced2d587b6dff18f963f269d745c4a599cf82b0c4007356bd957cb4cb52efc01", - "https://deno.land/std@0.224.0/path/windows/glob_to_regexp.ts": "e45f1f89bf3fc36f94ab7b3b9d0026729829fabc486c77f414caebef3b7304f8", - "https://deno.land/std@0.224.0/path/windows/is_absolute.ts": "4a8f6853f8598cf91a835f41abed42112cebab09478b072e4beb00ec81f8ca8a", - "https://deno.land/std@0.224.0/path/windows/join.ts": "8d03530ab89195185103b7da9dfc6327af13eabdcd44c7c63e42e27808f50ecf", - "https://deno.land/std@0.224.0/path/windows/join_globs.ts": "a9475b44645feddceb484ee0498e456f4add112e181cb94042cdc6d47d1cdd25", - "https://deno.land/std@0.224.0/path/windows/normalize.ts": "78126170ab917f0ca355a9af9e65ad6bfa5be14d574c5fb09bb1920f52577780", - "https://deno.land/std@0.224.0/path/windows/normalize_glob.ts": "9c87a829b6c0f445d03b3ecadc14492e2864c3ebb966f4cea41e98326e4435c6", - "https://deno.land/std@0.224.0/path/windows/resolve.ts": "8dae1dadfed9d46ff46cc337c9525c0c7d959fb400a6308f34595c45bdca1972", - "https://deno.land/std@0.224.0/streams/_common.ts": "948735ef6d140cd6916dca861197b88fc57db52c2f923c392b7a14033d8fed4b", - "https://deno.land/std@0.224.0/streams/delimiter_stream.ts": "4e4050740ff27a8824defa6c96126229ef9d794c4ace4ef9cabb10b5ad4a5d14", - "https://deno.land/std@0.224.0/streams/text_delimiter_stream.ts": "94dfc900204e306496c1b58c80473db57b6097afdcb8ea9eaff453a193a659f1", - "https://deno.land/std@0.224.0/streams/to_transform_stream.ts": "4c4836455ef89bab9ece55975ee3a819f07d3d8b0e43101ec7f4ed033c8a2b61", "https://deno.land/std@0.224.0/testing/_test_suite.ts": "f10a8a6338b60c403f07a76f3f46bdc9f1e1a820c0a1decddeb2949f7a8a0546", "https://deno.land/std@0.224.0/testing/bdd.ts": "3e4de4ff6d8f348b5574661cef9501b442046a59079e201b849d0e74120d476b", "https://deno.land/std@0.224.0/testing/mock.ts": "a963181c2860b6ba3eb60e08b62c164d33cf5da7cd445893499b2efda20074db", + "https://deno.land/std@0.93.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", + "https://deno.land/std@0.93.0/async/deferred.ts": "624bef4b755b71394620508a0c234a93cb8020cbd1b04bfcdad41c174392cef6", + "https://deno.land/std@0.93.0/async/delay.ts": "9de1d8d07d1927767ab7f82434b883f3d8294fb19cad819691a2ad81a728cf3d", + "https://deno.land/std@0.93.0/async/mod.ts": "253b41c658d768613eacfb11caa0a9ca7148442f932018a45576f7f27554c853", + "https://deno.land/std@0.93.0/async/mux_async_iterator.ts": "c405c4c1194f7600189aa81dfe243e165c27f36eaea88a301fa2a74ce974548b", + "https://deno.land/std@0.93.0/async/pool.ts": "353ce4f91865da203a097aa6f33de8966340c91b6f4a055611c8c5d534afd12f", + "https://deno.land/std@0.93.0/encoding/base64.ts": "eecae390f1f1d1cae6f6c6d732ede5276bf4b9cd29b1d281678c054dc5cc009e", + "https://deno.land/std@0.93.0/encoding/hex.ts": "f952e0727bddb3b2fd2e6889d104eacbd62e92091f540ebd6459317a61932d9b", + "https://deno.land/std@0.93.0/fmt/colors.ts": "db22b314a2ae9430ae7460ce005e0a7130e23ae1c999157e3bb77cf55800f7e4", + "https://deno.land/std@0.93.0/io/buffer.ts": "2a92f02c1d8daaebaf13e5678ea5969c89f4fab533f687b9e7e86f49f11c3118", + "https://deno.land/std@0.93.0/io/util.ts": "843ccf667ff291ba2315c2419a54b4e76dbc7c0f6c3152f640eac4dc954e3753", + "https://deno.land/std@0.93.0/node/_errors.ts": "c7c2acbf6589964a8b1a52ab5d80d9028f72033ed250b5dd3c9838f32d129378", + "https://deno.land/std@0.93.0/node/_stream/async_iterator.ts": "f5e8e4cf7e823364740a9db1cf492f571a4c7c7cbc4c9f65cb505db439eecca1", + "https://deno.land/std@0.93.0/node/_stream/buffer_list.ts": "93526777ba6436a5e73590b7878506ad4dbe99e6cb041d15cf748b2df28596d1", + "https://deno.land/std@0.93.0/node/_stream/destroy.ts": "c6248bab9e1c85693716867a48cb881c6df6d6111c698d7b9301eda571e54347", + "https://deno.land/std@0.93.0/node/_stream/duplex.ts": "c0a6ce0a286ccd2c37cca217c356316007b799b803865b20a3c75559a6e933ad", + "https://deno.land/std@0.93.0/node/_stream/duplex_internal.ts": "61c6dd6712472ca70019ad207455df2ab5524248ba3c5325ccc78473fe0b2795", + "https://deno.land/std@0.93.0/node/_stream/end_of_stream.ts": "e50febbfa47f2ac4bc7807a16325d2550eb2f0799f8b7b035e30f04b3d399096", + "https://deno.land/std@0.93.0/node/_stream/from.ts": "3f2d282b1fcffbfcf964b4e86518c19187a6dfebca6399d0d368dc9f24de2250", + "https://deno.land/std@0.93.0/node/_stream/passthrough.ts": "361145fcdd270f00b162565c7e12078ef1f48b1c96ce7954998a985b926322ba", + "https://deno.land/std@0.93.0/node/_stream/pipeline.ts": "b51c16a55a9d6999e6bee643e628d1b988f020b0743d8e224aa5f13cdcb5a6eb", + "https://deno.land/std@0.93.0/node/_stream/promises.ts": "71d77087c158c2c3b84ddc0a4a4d70f810f6767b55195374303fa271f224cee9", + "https://deno.land/std@0.93.0/node/_stream/readable.ts": "2ec561391e274e4f79954f0f97fdac00640ffb3c07699703a197f76cc3e9e0a3", + "https://deno.land/std@0.93.0/node/_stream/readable_internal.ts": "2ebb5fdeadbf6dc8eb79a30e8750b08b07c6868c8b6e54d5415a97bd5c067535", + "https://deno.land/std@0.93.0/node/_stream/stream.ts": "12ea4dab20cbef772fbc3d58feb7741cb7b515da7cdd550e9c1c56b624f8b167", + "https://deno.land/std@0.93.0/node/_stream/symbols.ts": "980ba25e8e05593fd775c51e05e7ccf2af7fe466616f110c107dd96bce302754", + "https://deno.land/std@0.93.0/node/_stream/transform.ts": "7b7b7fe1506e461412f5f53325da57d8de11dde2990c7e2f8d0d8cb7690262e3", + "https://deno.land/std@0.93.0/node/_stream/writable.ts": "67bc3c96bd15c7c0cdedf5bf6422304b245d39c2dbdace0c3de2f5598a38b4ce", + "https://deno.land/std@0.93.0/node/_stream/writable_internal.ts": "ef00bd654f949c17eb4b1749d1e37e92a93cbc7fc5807b63875d3b94a667c023", + "https://deno.land/std@0.93.0/node/_util/_util_callbackify.ts": "f2ac50a47572dde37612a52c7b337afeefb6faafdb849184487e06436334a5ab", + "https://deno.land/std@0.93.0/node/_util/_util_promisify.ts": "2ad6efe685f73443d5ed6ae009999789a8de4a0f01e6d2afdf242b4515477ee2", + "https://deno.land/std@0.93.0/node/_util/_util_types.ts": "ae3d21e07c975f06590ab80bbde8173670d70ff40546267c0c1df869fc2ff00c", + "https://deno.land/std@0.93.0/node/_utils.ts": "33b06f2877d3ee80f17190ee81fdc436755ce74b9c2a9a4492c7cdfe2a03e4c6", + "https://deno.land/std@0.93.0/node/assert.ts": "eed03a5a60700d5af0fa4461cb353a5bb4dfbff5740633bb9b378b0b92a97c3c", + "https://deno.land/std@0.93.0/node/assertion_error.ts": "119c61306d2872a70ebde301dc09466db3b91197a49c95149f89ca09d410ad81", + "https://deno.land/std@0.93.0/node/buffer.ts": "5d149bccd443c496b1c48436b6242999b40da5309acb76462c1159766c1b2370", + "https://deno.land/std@0.93.0/node/events.ts": "0feda0707e2229363f5df8b799fed41bb91de6ca7106f27c7a9f0a02ea11b9d4", + "https://deno.land/std@0.93.0/node/stream.ts": "c7c69f423a21ff7634ba2a07b8fe08e308e169f6ea5a7d91c9a7587ccbac82c3", + "https://deno.land/std@0.93.0/node/string_decoder.ts": "da8586cf9288fa8d83574c409b4eadb0d634b0294fad2b4675df78dfac6ff546", + "https://deno.land/std@0.93.0/node/util.ts": "3888b31481d7830e62818078fa6372086a316fff8b3283db6d4a1e01c7012030", + "https://deno.land/std@0.93.0/testing/_diff.ts": "961eaf6d9f5b0a8556c9d835bbc6fa74f5addd7d3b02728ba7936ff93364f7a3", + "https://deno.land/std@0.93.0/testing/asserts.ts": "9ae4f282a1164efa53f566f15b09319e6de7eea0a4ed63e8db7faf8213f05d8c", "https://deno.land/x/bcrypt@v0.4.1/mod.ts": "ff09bdae282583cf5f7d87efe37ddcecef7f14f6d12e8b8066a3058db8c6c2f7", "https://deno.land/x/bcrypt@v0.4.1/src/bcrypt/base64.ts": "b8266450a4f1eb6960f60f2f7986afc4dde6b45bd2d7ee7ba10789e67e17b9f7", "https://deno.land/x/bcrypt@v0.4.1/src/bcrypt/bcrypt.ts": "ec221648cc6453ea5e3803bc817c01157dada06aa6f7a0ba6b9f87aae32b21e2", "https://deno.land/x/bcrypt@v0.4.1/src/main.ts": "08d201b289c8d9c46f8839c69cd6625b213863db29775c7a200afc3b540e64f8", "https://deno.land/x/bcrypt@v0.4.1/src/worker.ts": "5a73bdfee9c9e622f47c9733d374b627dce52fb3ec1e74c8226698b3fc57ffac", + "https://deno.land/x/grpc_basic@0.4.7/client.ts": "db2a754c42068800a95059af3272b894697725f2fcd2d3cf958cd00d37dc950a", + "https://deno.land/x/grpc_basic@0.4.7/error.ts": "b2c4c17b2b1d3e7040db463b23a633ad6634865c8d4720e4fc7506718e87d3d6", + "https://deno.land/x/grpc_basic@0.4.7/http2/conn.ts": "9188f139ff6fd83b79e43782f6469b0e4ca77c195814e48807216bdf86386e6b", + "https://deno.land/x/grpc_basic@0.4.7/http2/flow.ts": "e99768743a03a6a28243e3c8c9a293634afad20970963f32c86c754faa77ad32", + "https://deno.land/x/grpc_basic@0.4.7/http2/frames.ts": "3558edb47caf92f78016d371ad0ab919b571187e8af0d817136fc270b595a588", + "https://deno.land/x/grpc_basic@0.4.7/http2/hpack.ts": "549ca5bdb1d43accaee075c5e0c1b63b6178079ea3c8e653f853127aef8e54a0", + "https://deno.land/x/grpc_basic@0.4.7/http2/stream.ts": "43b198a0e40b61edce4d587a91f220ca93dc62416ede3e2b41db8eac1cde30a7", + "https://deno.land/x/grpc_basic@0.4.7/http2/util.ts": "7e888b00bac606aa81f8e27737f96c6d0309fa41c4a46760ddc73a3d0102763b", + "https://deno.land/x/grpc_basic@0.4.7/proto.ts": "6ca84ac8e15063498cdaa915695414afe07b7834fbd91e76a5708f3c8363bcb9", + "https://deno.land/x/grpc_basic@0.4.7/vendor/protobuf@v6.10.2.js": "8eaefbf219f39998148c27018b88816e3218426517dc497f7ea6802ca3172def", "https://deno.land/x/jose@v5.6.3/index.ts": "fa165e577e778713d000c3e04b456d950e3c30f057b9319aaa7549feaeb04aa5", "https://deno.land/x/jose@v5.6.3/jwe/compact/decrypt.ts": "2d32f0b41e1cc4f428b6dcae1c8931fae9756d7ece45d9e870c558ed1ab27bc8", "https://deno.land/x/jose@v5.6.3/jwe/compact/encrypt.ts": "6d925600f9a8da1a91cbccf0f0bb9e8f26f1b5238566d4033d2e34b8336a7c3c", @@ -4721,18 +4352,7 @@ "https://deno.land/x/postgres@v0.19.3/query/types.ts": "540f6f973d493d63f2c0059a09f3368071f57931bba68bea408a635a3e0565d6", "https://deno.land/x/postgres@v0.19.3/utils/deferred.ts": "5420531adb6c3ea29ca8aac57b9b59bd3e4b9a938a4996bbd0947a858f611080", "https://deno.land/x/postgres@v0.19.3/utils/utils.ts": "ca47193ea03ff5b585e487a06f106d367e509263a960b787197ce0c03113a738", - "https://deno.land/x/postgresjs@v3.4.5/mod.js": "cb68f17d6d90df318934deccdb469d740be0888e7a597a9e7eea7100ce36a252", - "https://deno.land/x/postgresjs@v3.4.5/polyfills.js": "318eb01f2b4cc33a46c59f3ddc11f22a56d6b1db8b7719b2ad7decee63a5bd47", - "https://deno.land/x/postgresjs@v3.4.5/src/bytes.js": "f2de43bdc8fa5dc4b169f2c70d5d8b053a3dea8f85ef011d7b27dec69e14ebb7", - "https://deno.land/x/postgresjs@v3.4.5/src/connection.js": "e63062451fb6a7284c14540b3f268d1373c3028fb0f3b234056ad56569190e8f", - "https://deno.land/x/postgresjs@v3.4.5/src/errors.js": "85cfbed9a5ab0db41ab8e97b806c881af29807dfe99bc656fdf1a18c1c13b6c6", - "https://deno.land/x/postgresjs@v3.4.5/src/index.js": "9dca008e765675f8218d4e2e3ccc75359cc2240f7be4e80bf6735e92b5562e3a", - "https://deno.land/x/postgresjs@v3.4.5/src/large.js": "f3e770cdb7cc695f7b50687b4c6c4b7252129515486ec8def98b7582ee7c54ef", - "https://deno.land/x/postgresjs@v3.4.5/src/query.js": "67c45a5151032aa46b587abc15381fe4efd97c696e5c1b53082b8161309c4ee2", - "https://deno.land/x/postgresjs@v3.4.5/src/queue.js": "15e6345adb6708bf3b99ad39fc2231c2fb61de5f6cba4b7a7a6be881482a4ec3", - "https://deno.land/x/postgresjs@v3.4.5/src/result.js": "001ff5e0c8d634674f483d07fbcd620a797e3101f842d6c20ca3ace936260465", - "https://deno.land/x/postgresjs@v3.4.5/src/subscribe.js": "9e4d0c3e573a6048e77ee2f15abbd5bcd17da9ca85a78c914553472c6d6c169b", - "https://deno.land/x/postgresjs@v3.4.5/src/types.js": "471f4a6c35412aa202a7c177c0a7e5a7c3bd225f01bbde67c947894c1b8bf6ed", + "https://deno.land/x/prohazko@1.3.5/hex.ts": "07b5172c4174a60e8e0b3b709ea12016b5673a55a3d1d0f21f44feccea44ef2e", "https://deno.land/x/s3_lite_client@0.7.0/client.ts": "5acd15f2e231a7cac8a706b7157b71c9b551a760ddcce85679d3fe5d51b0dbd1", "https://deno.land/x/s3_lite_client@0.7.0/deps.ts": "ca6bc4f12c4ce4161f6390a17ed0800b541062ad6a43072c487ec1e004c410e6", "https://deno.land/x/s3_lite_client@0.7.0/errors.ts": "3dd431b0e96f346104d7be6c09e1659b5c360992e6487e35bacb881f10c5a5bf", @@ -4741,9 +4361,6 @@ "https://deno.land/x/s3_lite_client@0.7.0/object-uploader.ts": "b4bad0d771d79b2bb23b8cab0e6f7be85a2390e18957c612fd5cda11c39f55b0", "https://deno.land/x/s3_lite_client@0.7.0/signing.ts": "2ba77aac07a7c94267e83d285bbd33fdb3253dfa32b035df62479d6b224bb748", "https://deno.land/x/s3_lite_client@0.7.0/transform-chunk-sizes.ts": "cecc1167ba366d086a13c754be6ed86717d6b0b27c779c4c766621435a697045", - "https://deno.land/x/s3_lite_client@0.7.0/xml-parser.ts": "de925493369718cab6f26413fbbada18eec74aa6eaf0598d77c7296f5fdfd8a9", - "https://esm.sh/stream-json@1.8.0/filters/Pick": "b1803979c58530e935507651dc9ffb1378345c038a9dc42821879e241a071b34", - "https://esm.sh/v135/stream-chain@2.2.5/denonext/stream-chain.mjs": "7964e6c089c29cbc2f480159d06cfb475758a1bf5f7ab4801d596934af94c4f8", - "https://esm.sh/v135/stream-json@1.8.0/denonext/filters/Pick.js": "f61bc931915aaa8a607d30eae09c93dde5a1f3fb28220021f16c53899ac4d805" + "https://deno.land/x/s3_lite_client@0.7.0/xml-parser.ts": "de925493369718cab6f26413fbbada18eec74aa6eaf0598d77c7296f5fdfd8a9" } } diff --git a/api/justfile b/api/justfile index 47fa095340..d715fd57d9 100644 --- a/api/justfile +++ b/api/justfile @@ -26,7 +26,7 @@ start *services="s3 postgres redis mailer": # Start docker services for e2e [private] -start_e2e *services="s3 postgres redis mailer kc": +start_e2e *services="s3 postgres redis mailer dex": just dc_e2e up -d {{ services }} # Stop docker services @@ -160,6 +160,25 @@ api *command: --unstable-fs \ src/main.ts {{ command }} +debug: + deno repl \ + -A \ + --unstable-fs \ + --eval 'import { getKernel } from "./src/debug.ts"; const kernel = await getKernel();' + +watch: + deno run \ + --allow-net \ + --allow-env \ + --allow-read \ + --allow-write \ + --allow-ffi \ + --allow-sys \ + --allow-run \ + --watch \ + --unstable-fs \ + src/main.ts http \$PORT + # Start the HTTP API server on port 8080 @serve: just api http \$PORT @@ -174,7 +193,7 @@ cache: # refresh the deno.lock file lock: - deno cache --lock=deno.lock --lock-write src/deps.ts src/dev_deps.ts + deno cache --lock=deno.lock --frozen=false src/deps.ts src/dev_deps.ts # Eval and run a file eval *filepath: diff --git a/api/src/db/migrations/20250210000000-alter-users.sql b/api/src/db/migrations/20250210000000-alter-users.sql new file mode 100644 index 0000000000..44668cd0cb --- /dev/null +++ b/api/src/db/migrations/20250210000000-alter-users.sql @@ -0,0 +1,6 @@ +ALTER TABLE auth.users + ALTER COLUMN firstname DROP NOT NULL, + ALTER COLUMN lastname DROP NOT NULL; + +ALTER TABLE territory.territories + ADD COLUMN siret VARCHAR; \ No newline at end of file diff --git a/api/src/deps.ts b/api/src/deps.ts index 1e89a59695..8b90d23e8e 100644 --- a/api/src/deps.ts +++ b/api/src/deps.ts @@ -181,7 +181,6 @@ import xss from "npm:xss@^1"; // @deno-types="npm:@types/jsonwebtoken@^9" import jwt from "npm:jsonwebtoken@^9"; import mjml2html from "npm:mjml@^4.15"; -import KcAdminClient from "npm:@keycloak/keycloak-admin-client@^25.0"; import Handlebars from "npm:handlebars@^4.7"; import helmet from "npm:helmet@^7.1"; // @deno-types="npm:@types/nodemailer@^6.4" @@ -214,7 +213,6 @@ export { https, jsonSchemaSecureJson, jwt, - KcAdminClient, mailer, mapshaper, mjml2html, @@ -243,3 +241,5 @@ export * as path from "https://deno.land/std@0.224.0/path/posix/mod.ts"; export * as bcrypt from "https://deno.land/x/bcrypt@v0.4.1/mod.ts"; import * as _bcrypt_worker from "https://deno.land/x/bcrypt@v0.4.1/src/worker.ts"; // FIX https://github.com/JamesBroadberry/deno-bcrypt/issues/31 export { difference } from "https://deno.land/std@0.224.0/datetime/difference.ts"; +export * as grpc from "https://deno.land/x/grpc_basic@0.4.7/client.ts"; + diff --git a/api/src/ilos/common/Decorators.ts b/api/src/ilos/common/Decorators.ts index d7c32b6ea6..fd2773efb3 100644 --- a/api/src/ilos/common/Decorators.ts +++ b/api/src/ilos/common/Decorators.ts @@ -130,3 +130,7 @@ export function extension(config: ExtensionConfigurationType) { } export { inject, injectable } from "@/deps.ts"; + +export const proxy = Symbol.for("PROXY"); +export const router = Symbol.for("ROUTER"); +export const children = Symbol.for("CHILDREN"); diff --git a/api/src/ilos/connection-redis/RedisConnection.ts b/api/src/ilos/connection-redis/RedisConnection.ts index 455ff8e218..49da3ee246 100644 --- a/api/src/ilos/connection-redis/RedisConnection.ts +++ b/api/src/ilos/connection-redis/RedisConnection.ts @@ -11,13 +11,11 @@ import { * @fixme */ type WindowProcess = Window & typeof globalThis & { process: NodeJS.Process }; -(window as WindowProcess).process = process; +if (typeof window !== "undefined") { + (window as WindowProcess).process = process; +} -export class RedisConnection - implements - ConnectionInterface, - DestroyHookInterface, - InitHookInterface { +export class RedisConnection implements ConnectionInterface, DestroyHookInterface, InitHookInterface { protected client: Redis | null = null; get connected(): boolean { diff --git a/api/src/ilos/core/foundation/ServiceContainer.ts b/api/src/ilos/core/foundation/ServiceContainer.ts index 8cf53e2432..935f64a9e1 100644 --- a/api/src/ilos/core/foundation/ServiceContainer.ts +++ b/api/src/ilos/core/foundation/ServiceContainer.ts @@ -8,6 +8,7 @@ import { RegisterHookInterface, ServiceContainerInterface, ServiceContainerInterfaceResolver, + children as childrenSymbol, } from "@/ilos/common/index.ts"; import { ExtensionRegistry } from "../container/ExtensionRegistry.ts"; import { Container, HookRegistry } from "../container/index.ts"; @@ -107,7 +108,7 @@ export abstract class ServiceContainer for (const child of children) { const childInstance = new child(this.getContainer()); this.getContainer().bind(child).toConstantValue(childInstance); - this.getContainer().bind("children").toConstantValue(child); + this.getContainer().bind(childrenSymbol).toConstantValue(childInstance); this.registerHooks(childInstance); } } diff --git a/api/src/pdc/providers/keycloak/IBotCredentials.ts b/api/src/pdc/providers/keycloak/IBotCredentials.ts deleted file mode 100644 index 4f3acc8e2c..0000000000 --- a/api/src/pdc/providers/keycloak/IBotCredentials.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface IBotCredentials { - access_key: string; - secret_key: string; -} - -export type Token = string; diff --git a/api/src/pdc/providers/keycloak/KeycloakBotAuthenticator.integration.spec.ts b/api/src/pdc/providers/keycloak/KeycloakBotAuthenticator.integration.spec.ts deleted file mode 100644 index 085e9d30da..0000000000 --- a/api/src/pdc/providers/keycloak/KeycloakBotAuthenticator.integration.spec.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { - afterAll, - assert, - assertEquals, - beforeAll, - describe, - it, -} from "@/dev_deps.ts"; -import { IBotCredentials } from "@/pdc/providers/keycloak/IBotCredentials.ts"; -import { KeycloakBotAuthenticator } from "./KeycloakBotAuthenticator.ts"; -import { KeycloakManager } from "./KeycloakManager.ts"; - -describe("Keycloack Bot Auth", () => { - let bot: IBotCredentials; - let token: string; - - const manager = new KeycloakManager(); - const provider = new KeycloakBotAuthenticator(); - - beforeAll(async () => { - bot = await manager.createBot(1); - }); - - afterAll(async () => { - const result = await manager.listUser(); - for ( - const user of result.filter((u) => u.username === `bot@${bot.access_key}`) - ) { - await manager.deleteUser(user.id); - } - // FIXME: UGLY cleanup - const resources = Deno.resources(); - for (const rid in resources) { - if (resources[rid] === "fetchResponse") { - Deno.close(parseInt(rid)); - } - } - }); - - it("Should login", async () => { - const result = await provider.login(bot); - assert(typeof result.token === "string"); - assert(result.expires_in === 300); - token = result.token; - }); - - it("Should verify", async () => { - const result = await provider.verify(token); - assertEquals(result.operator_id, 1); - assertEquals(result.role, "operator.user"); - }); -}); diff --git a/api/src/pdc/providers/keycloak/KeycloakBotAuthenticator.ts b/api/src/pdc/providers/keycloak/KeycloakBotAuthenticator.ts deleted file mode 100644 index 670351d810..0000000000 --- a/api/src/pdc/providers/keycloak/KeycloakBotAuthenticator.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { jose } from "@/deps.ts"; -import { provider } from "@/ilos/common/index.ts"; -import { env_or_fail } from "@/lib/env/index.ts"; -import fetcher from "@/lib/fetcher/index.ts"; -import { logger } from "@/lib/logger/index.ts"; -import { IBotCredentials } from "@/pdc/providers/keycloak/IBotCredentials.ts"; - -@provider() -export class KeycloakBotAuthenticator { - protected baseUrl: string; - protected token?: string; - protected tokenExpiry?: number; - protected realm: string; - protected botClient: string; - protected botClientSecret: string; - - protected JWKS; - - constructor() { - this.baseUrl = env_or_fail("KC_URL", "http://auth.covoiturage.test"); - this.realm = env_or_fail("KC_REALM", "covoiturage"); - this.botClient = env_or_fail("KC_BOT_CLIENT"); - this.botClientSecret = env_or_fail("KC_BOT_CLIENT_SECRET"); - this.JWKS = jose.createRemoteJWKSet( - new URL( - `${this.baseUrl}/realms/${this.realm}/protocol/openid-connect/certs`, - ), - ); - } - - public async login( - data: IBotCredentials, - ): Promise<{ token: string; expires_in: number }> { - try { - const url = - `${this.baseUrl}/realms/${this.realm}/protocol/openid-connect/token`; - - const d = new URLSearchParams(); - d.append("client_id", this.botClient); - d.append("client_secret", this.botClientSecret); - d.append("grant_type", "password"); - d.append("username", `bot@${data.access_key}`); - d.append("password", data.secret_key); - const response = await fetcher.post( - url, - { - headers: { - "Content-Type": "application/x-www-form-urlencoded; charset=utf-8", - "Accept": "application/json", - }, - body: d, - }, - ); - const tokens: { access_token: string; expires_in: number } = - await response.json(); - return { token: tokens.access_token, expires_in: tokens.expires_in }; - } catch (error) { - logger.error("Error logging in to Keycloak", error); - throw new Error("Login failed"); - } - } - - public async verify( - token: string, - ): Promise<{ operator_id: number; role: string }> { - const { payload } = await jose.jwtVerify< - { operator_id: string; pdc_role: string } - >(token, this.JWKS); - return { - operator_id: parseInt(payload.operator_id, 10), - role: payload.pdc_role, - }; - } -} diff --git a/api/src/pdc/providers/keycloak/KeycloakManager.integration.spec.ts b/api/src/pdc/providers/keycloak/KeycloakManager.integration.spec.ts deleted file mode 100644 index 68e792eb7c..0000000000 --- a/api/src/pdc/providers/keycloak/KeycloakManager.integration.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { - afterAll, - assertEquals, - assertObjectMatch, - describe, - it, -} from "@/dev_deps.ts"; -import { KeycloakManager } from "./KeycloakManager.ts"; - -describe("Keycloack Manager", () => { - const user1 = { - firstName: "Jean", - lastName: "Dupond", - email: "registry@admin.com", - attributes: { - phone: "+33601020304", - pdc_role: "registry.admin", - }, - }; - - const user2 = { - firstName: "Jeanne", - lastName: "Dupuis", - email: "territory@admin.com", - attributes: { - phone: "+33601020304", - pdc_role: "territory.admin", - territory_id: 12, - }, - }; - - const provider = new KeycloakManager(); - afterAll(async () => { - const result = await provider.listUser(); - for ( - const user of result.filter((u) => - u.email == user1.email || u.email == user2.email - ) - ) { - await provider.deleteUser(user.id); - } - - // FIXME: UGLY cleanup - const resources = Deno.resources(); - for (const rid in resources) { - if (resources[rid] === "fetchResponse") { - Deno.close(parseInt(rid)); - } - } - }); - - it("Should list user", async () => { - const result = await provider.listUser(); - assertEquals(result.length, 1); - }); - - it("Should create a user", async () => { - await provider.createUser(user1); - await provider.createUser(user2); - const result = await provider.listUser(); - assertObjectMatch(result.find((u) => u.email == user1.email), user1); - assertObjectMatch(result.find((u) => u.email == user2.email), user2); - }); -}); diff --git a/api/src/pdc/providers/keycloak/KeycloakManager.ts b/api/src/pdc/providers/keycloak/KeycloakManager.ts deleted file mode 100644 index 999cb36f34..0000000000 --- a/api/src/pdc/providers/keycloak/KeycloakManager.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { KcAdminClient } from "@/deps.ts"; -import { provider } from "@/ilos/common/index.ts"; -import { env_or_fail } from "@/lib/env/index.ts"; -import { logger } from "@/lib/logger/index.ts"; -import { randomString, v4 } from "@/lib/uuid/index.ts"; -import { IBotCredentials } from "@/pdc/providers/keycloak/IBotCredentials.ts"; - -interface User { - //username: string; - email: string; - firstName?: string; - lastName?: string; - enabled?: boolean; - attributes?: { - phone: string; - pdc_role: string; - operator_id?: number; - territory_id?: number; - }; -} - -@provider() -export class KeycloakManager { - protected client: KcAdminClient; - protected token?: string; - protected tokenExpiry?: number; - protected realm?: string; - protected adminClient: string; - protected adminClientSecret: string; - - protected botClient: string; - - constructor() { - this.client = new KcAdminClient({ - baseUrl: env_or_fail("KC_URL", "http://auth.covoiturage.test"), - realmName: env_or_fail("KC_REALM", "covoiturage"), - }); - - this.adminClient = env_or_fail("KC_ADMIN_CLIENT"); - this.adminClientSecret = env_or_fail("KC_ADMIN_CLIENT_SECRET"); - this.botClient = env_or_fail("KC_BOT_CLIENT"); - } - - private async login(): Promise { - try { - await this.client.auth({ - grantType: "client_credentials", - clientId: this.adminClient, - clientSecret: this.adminClientSecret, - }); - } catch (error) { - logger.error("Error logging in to Keycloak", error); - throw new Error("Login failed"); - } - } - - public async listUser(): Promise { - await this.login(); - try { - const users = await this.client.users.find(); - return users.map((u) => ({ - ...u, - attributes: { - phone: u.attributes?.phone?.pop(), - operator_id: parseInt(u.attributes?.operator_id?.pop() || "0", 10), - territory_id: parseInt(u.attributes?.territory_id?.pop() || "0", 10), - pdc_role: u.attributes?.pdc_role?.pop(), - }, - })); - } catch (error) { - logger.error("Error fetching users from Keycloak", error); - throw new Error("List user failed"); - } - } - - public async createUser(user: User): Promise { - await this.login(); - try { - await this.client.users.create( - { ...user, enabled: true, username: user.email }, - ); - } catch (error) { - logger.error("Error creating user in Keycloak", error); - throw new Error("Create user failed"); - } - } - - public async createBot(operator_id: number): Promise { - await this.login(); - const access_key = v4(); - const secret_key = randomString(32); - const payload = { - username: `bot@${access_key}`, - email: `bot@${access_key}`, - firstName: access_key, - lastName: operator_id.toString(), - enabled: true, - emailVerified: true, - attributes: { - operator_id, - pdc_role: "operator.user", - }, - credentials: [{ - temporary: false, - value: secret_key, - type: "password", - }], - clientRoles: { - [this.botClient]: ["bot"], - }, - realmRoles: [], - }; - - await this.client.users.create(payload); - - return { - access_key, - secret_key, - }; - } - - public async deleteUser(id: string): Promise { - await this.login(); - try { - await this.client.users.del({ id }); - } catch (error) { - logger.error("Error deleting user in Keycloak", error); - throw new Error("Delete user failed"); - } - } -} diff --git a/api/src/pdc/proxy/HttpTransport.ts b/api/src/pdc/proxy/HttpTransport.ts index 36c768e6ca..b90db8a4c5 100644 --- a/api/src/pdc/proxy/HttpTransport.ts +++ b/api/src/pdc/proxy/HttpTransport.ts @@ -12,16 +12,21 @@ import { Response, } from "@/deps.ts"; import { + children, ConfigInterface, ConfigInterfaceResolver, ContextType, InvalidRequestException, KernelInterface, + proxy, + RegisterHookInterface, + router, RPCResponseType, RPCSingleCallType, TransportInterface, UnauthorizedException, } from "@/ilos/common/index.ts"; +import { ServiceProvider } from "@/ilos/core/index.ts"; import { env_or_fail, env_or_false } from "@/lib/env/index.ts"; import { logger } from "@/lib/logger/index.ts"; import { get } from "@/lib/object/index.ts"; @@ -105,6 +110,7 @@ export class HttpTransport implements TransportInterface { this.registerMetrics(); this.registerGlobalMiddlewares(); this.registerCache(); + this.registerNestedRoutes(); this.registerAuthRoutes(); this.registerApplicationRoutes(); this.registerCertificateRoutes(); @@ -126,6 +132,18 @@ export class HttpTransport implements TransportInterface { return this.app; } + private registerNestedRoutes() { + this.kernel.getContainer().bind(proxy).toConstantValue(this.app); + const serviceProviders = this.kernel.getContainer().getAll(children); + for (const serviceProvider of serviceProviders) { + const container = serviceProvider.getContainer(); + if (container.isBound(router)) { + const routerInstance = container.resolve(container.get(router)); + routerInstance.register(); + } + } + } + private async getProviders(): Promise { this.config = this.kernel.getContainer().get(ConfigInterfaceResolver); this.tokenProvider = this.kernel.getContainer().get( diff --git a/api/src/pdc/proxy/Kernel.ts b/api/src/pdc/proxy/Kernel.ts index 6c1b39dd45..6da5605696 100644 --- a/api/src/pdc/proxy/Kernel.ts +++ b/api/src/pdc/proxy/Kernel.ts @@ -4,6 +4,7 @@ import { Kernel as BaseKernel } from "@/ilos/framework/index.ts"; import { SentryProvider } from "@/pdc/providers/sentry/index.ts"; import { TokenProvider } from "@/pdc/providers/token/index.ts"; import { ListCommand } from "@/pdc/proxy/commands/ListCommand.ts"; +import { AuthServiceProvider } from "@/pdc/services/auth/AuthServiceProvider.ts"; import { MonitoringServiceProvider } from "@/pdc/services/monitoring/MonitoringServiceProvider.ts"; import { PostgresConnection } from "../../ilos/connection-postgres/index.ts"; import { AcquisitionServiceProvider } from "../services/acquisition/AcquisitionServiceProvider.ts"; @@ -26,6 +27,7 @@ import { config } from "./config/index.ts"; @kernel({ config, children: [ + AuthServiceProvider, AcquisitionServiceProvider, APDFServiceProvider, ApplicationServiceProvider, diff --git a/api/src/pdc/services/auth/AuthRouter.ts b/api/src/pdc/services/auth/AuthRouter.ts new file mode 100644 index 0000000000..687fa3fb75 --- /dev/null +++ b/api/src/pdc/services/auth/AuthRouter.ts @@ -0,0 +1,33 @@ +import { express } from "@/deps.ts"; +import { ConfigInterfaceResolver, inject, injectable, proxy } from "@/ilos/common/index.ts"; +import { asyncHandler } from "@/pdc/proxy/helpers/asyncHandler.ts"; +import { OidcCallbackAction } from "@/pdc/services/auth/actions/OidcCallbackAction.ts"; +import { OidcProvider } from "@/pdc/services/auth/providers/OidcProvider.ts"; + +@injectable() +export class AuthRouter { + constructor( + @inject(proxy) private app: express.Express, + private oidcProvider: OidcProvider, + private oidcCallbackAction: OidcCallbackAction, + private config: ConfigInterfaceResolver, + ) {} + + register() { + this.app.get("/auth/login", (req: express.Request, res: express.Response, _next: express.NextFunction) => { + return res.redirect(this.oidcProvider.getLoginUrl()); + }); + + this.app.get( + "/auth/callback", + asyncHandler(async (req: express.Request, res: express.Response) => { + const { code } = req.query; + if (typeof code === "string") { + const user = await this.oidcCallbackAction.handle({ code }); + req.session.user = user; + } + return res.redirect(this.config.get("oidc.app_url")); + }), + ); + } +} diff --git a/api/src/pdc/services/auth/AuthServiceProvider.ts b/api/src/pdc/services/auth/AuthServiceProvider.ts new file mode 100644 index 0000000000..b74eaf1826 --- /dev/null +++ b/api/src/pdc/services/auth/AuthServiceProvider.ts @@ -0,0 +1,23 @@ +import { router, serviceProvider } from "@/ilos/common/index.ts"; +import { ServiceProvider as AbstractServiceProvider } from "@/ilos/core/index.ts"; +import { ValidatorMiddleware } from "@/pdc/providers/superstruct/ValidatorMiddleware.ts"; + +import { OidcProvider } from "@/pdc/services/auth/providers/OidcProvider.ts"; +import { OidcCallbackAction } from "./actions/OidcCallbackAction.ts"; +import { AuthRouter } from "./AuthRouter.ts"; +import { config } from "./config/index.ts"; +import { UserRepository } from "./providers/UserRepository.ts"; + +@serviceProvider({ + config, + providers: [ + UserRepository, + OidcProvider, + [router, AuthRouter], + ], + middlewares: [ + ["validate", ValidatorMiddleware], + ], + handlers: [OidcCallbackAction], +}) +export class AuthServiceProvider extends AbstractServiceProvider {} diff --git a/api/src/pdc/services/auth/actions/OidcCallbackAction.ts b/api/src/pdc/services/auth/actions/OidcCallbackAction.ts new file mode 100644 index 0000000000..39a1da76f9 --- /dev/null +++ b/api/src/pdc/services/auth/actions/OidcCallbackAction.ts @@ -0,0 +1,47 @@ +import { ConfigInterfaceResolver, handler, UnauthorizedException } from "@/ilos/common/index.ts"; +import { Action as AbstractAction } from "@/ilos/core/index.ts"; +import { OidcCallback } from "../dto/OidcCallback.ts"; +import { OidcProvider } from "../providers/OidcProvider.ts"; +import { UserRepository } from "../providers/UserRepository.ts"; + +export type ResultInterface = { + email: string; + role: string; + permissions: Array; + operator_id?: number; + territory_id?: number; +}; + +@handler({ + service: "auth", + method: "oidcCallback", + middlewares: [ + ["validate", OidcCallback], + ], +}) +export class OidcCallbackAction extends AbstractAction { + constructor( + private oidcProvider: OidcProvider, + private userRepository: UserRepository, + protected config: ConfigInterfaceResolver, + ) { + super(); + } + + public async handle(params: OidcCallback): Promise { + const token = await this.oidcProvider.getTokenFromCode(params.code); + const info = await this.oidcProvider.getUserInfoFromToken(token); + const user = await this.userRepository.findUserByEmail(info.email); + if (!user || user.siret !== info.siret) { + throw new UnauthorizedException("User not found"); + } + return { + ...user, + permissions: this.getPermissionsFromRole(user.role), + }; + } + + private getPermissionsFromRole(role: string): string[] { + return this.config.get(`permissions.${role}.permissions`, []); + } +} diff --git a/api/src/pdc/services/auth/config/dex.ts b/api/src/pdc/services/auth/config/dex.ts new file mode 100644 index 0000000000..578f5be927 --- /dev/null +++ b/api/src/pdc/services/auth/config/dex.ts @@ -0,0 +1,4 @@ +import { env_or_fail, env_or_int } from "@/lib/env/index.ts"; + +export const grpc_host = env_or_fail("DEX_GRPC_HOST"); +export const grpc_port = env_or_int("DEX_GRPC_PORT", 5557); diff --git a/api/src/pdc/services/auth/config/index.ts b/api/src/pdc/services/auth/config/index.ts new file mode 100644 index 0000000000..e040906088 --- /dev/null +++ b/api/src/pdc/services/auth/config/index.ts @@ -0,0 +1,7 @@ +import * as oidc from "./oidc.ts"; +import * as permissions from "./permissions.ts"; + +export const config = { + permissions, + oidc, +}; diff --git a/api/src/pdc/services/auth/config/oidc.ts b/api/src/pdc/services/auth/config/oidc.ts new file mode 100644 index 0000000000..17d6869b96 --- /dev/null +++ b/api/src/pdc/services/auth/config/oidc.ts @@ -0,0 +1,6 @@ +import { env_or_fail } from "@/lib/env/index.ts"; +export const client_id = env_or_fail("OIDC_CLIENT_ID"); +export const client_secret = env_or_fail("OIDC_CLIENT_SECRET"); +export const base_url = env_or_fail("OIDC_BASE_URL"); +export const redirect_url = env_or_fail("OIDC_REDIRECT_URL"); +export const app_url = env_or_fail("APP_APP_URL"); diff --git a/api/src/pdc/services/auth/config/permissions.ts b/api/src/pdc/services/auth/config/permissions.ts new file mode 100644 index 0000000000..3478a5631a --- /dev/null +++ b/api/src/pdc/services/auth/config/permissions.ts @@ -0,0 +1,274 @@ +const permissions = { + "acquisition.create": ["operator.application", "operator.admin"], + "acquisition.cancel": ["operator.application", "operator.admin"], + "acquisition.status": [ + "operator.user", + "operator.application", + "operator.admin", + ], + "application.create": ["operator.admin"], + "application.find": ["operator.user", "operator.admin"], + "application.list": ["operator.user", "operator.admin"], + "application.revoke": ["operator.admin"], + "certificate.create": [ + "operator.application", + "operator.admin", + "registry.admin", + ], + "certificate.list": ["operator.admin", "registry.admin"], + "certificate.find": ["common"], + "certificate.download": [ + "operator.user", + "operator.application", + "operator.admin", + "registry.admin", + ], + "company.fetch": ["common"], + "company.find": ["common"], + "honor.save": ["common"], + "honor.stats": ["common"], + "monitoring.journeysstats": ["registry.admin"], + "observatory.stats": ["common"], + "operator.create": ["registry.admin"], + "operator.list": ["common"], + "operator.find": [ + "common", + "operator.user", + "operator.admin", + "registry.admin", + ], + "operator.delete": ["registry.admin"], + "operator.update": ["operator.admin", "registry.admin"], + "operator.patchContacts": ["operator.admin", "registry.admin"], + "operator.patchThumbnail": ["operator.admin", "registry.admin"], + "policy.create": ["territory.demo", "territory.admin", "registry.admin"], + "policy.delete": ["territory.demo", "territory.admin", "registry.admin"], + "policy.find": [ + "territory.demo", + "territory.user", + "territory.admin", + "registry.user", + "registry.admin", + "operator.admin", + "operator.user", + ], + "policy.launch": ["territory.admin"], + "policy.list": [ + "common", + "territory.demo", + "territory.user", + "territory.admin", + "registry.user", + "registry.admin", + ], + "policy.patch": ["territory.admin", "registry.admin"], + "policy.simulate.past": [ + "territory.admin", + "territory.demo", + "registry.admin", + ], + "policy.simulate.fake": ["territory.admin", "registry.admin"], + "policy.simulate.future": [ + "operator.application", + "operator.admin", + "territory.admin", + ], + "policy.list.templates": ["common"], + "territory.create": ["registry.admin"], + "territory.delete": ["registry.admin"], + "territory.find": [ + "common", + "territory.demo", + "territory.user", + "territory.admin", + "registry.user", + "registry.admin", + ], + "territory.update": ["territory.admin", "registry.admin"], + "territory.list": ["common"], + "territory.read": [ + "common", + "territory.user", + "territory.admin", + "registry.user", + "registry.admin", + ], + "territory.patchOperator": ["operator.admin"], + "territory.patchContacts": ["territory.admin", "registry.admin"], + "trip.stats": [ + "common", + "operator.user", + "operator.admin", + "territory.demo", + "territory.user", + "territory.admin", + "registry.user", + "registry.admin", + ], + "trip.export": [ + "operator.user", + "operator.admin", + "territory.user", + "territory.admin", + "registry.user", + "registry.admin", + ], + "apdf.list": [ + "operator.admin", + "territory.admin", + "registry.admin", + "operator.user", + ], + "apdf.listCurrentMonth": ["registry.admin"], + "apdf.export": ["registry.admin"], + "trip.list": [ + "operator.user", + "operator.admin", + "territory.demo", + "territory.user", + "territory.admin", + "registry.user", + "registry.admin", + ], + "user.update": [ + "common", + "operator.admin", + "territory.admin", + "registry.admin", + ], + "user.create": ["operator.admin", "territory.admin", "registry.admin"], + "user.delete": ["operator.admin", "territory.admin", "registry.admin"], + "user.find": [ + "common", + "operator.admin", + "territory.admin", + "registry.admin", + ], + "user.list": [ + "operator.user", + "operator.admin", + "territory.demo", + "territory.user", + "territory.admin", + "registry.user", + "registry.admin", + ], + "user.sendEmail": ["operator.admin", "territory.admin", "registry.admin"], + "user.policySimulate": ["common"], + + // export service + "export.create": ["common"], + "export.list": ["common"], + "export.read": ["common"], + "export.status": ["common"], + "export.cancel": ["common"], + "export.download": ["common"], +}; + +function scopeToGroup(permissionName: string, group: string) { + return `${group}.${permissionName}`; +} + +function dispatchPermissionsFromMatrix( + permissionsObject: Record, +) { + const permissionsByGroup: Record = { + common: [], + "territory.demo": [], + "territory.user": [], + "territory.admin": [], + "operator.user": [], + "operator.application": [], + "operator.admin": [], + "registry.user": [], + "registry.admin": [], + }; + + for (const permissionName of Reflect.ownKeys(permissionsObject) as string[]) { + const permissionRoles = permissionsObject[permissionName]; + + for (const permissionRole of permissionRoles) { + const group = permissionRole.split(".")[0]; + permissionsByGroup[permissionRole].push( + scopeToGroup(permissionName, group), + ); + } + } + // prefix common + return permissionsByGroup; +} + +const permissionsByRoles = dispatchPermissionsFromMatrix(permissions); + +export const territory = { + admin: { + slug: "admin", + name: "Admin", + permissions: [ + ...permissionsByRoles["common"], + ...permissionsByRoles["territory.admin"], + ], + }, + demo: { + slug: "demo", + name: "Demo", + permissions: [ + ...permissionsByRoles["common"], + ...permissionsByRoles["territory.demo"], + ], + }, + user: { + slug: "user", + name: "User", + permissions: [ + ...permissionsByRoles["common"], + ...permissionsByRoles["territory.user"], + ], + }, +}; + +export const operator = { + admin: { + slug: "admin", + name: "Admin", + permissions: [ + ...permissionsByRoles["common"], + ...permissionsByRoles["operator.admin"], + ], + }, + application: { + slug: "application", + name: "Application", + permissions: [ + ...permissionsByRoles["common"], + ...permissionsByRoles["operator.application"], + ], + }, + user: { + slug: "user", + name: "User", + permissions: [ + ...permissionsByRoles["common"], + ...permissionsByRoles["operator.user"], + ], + }, +}; + +export const registry = { + admin: { + slug: "admin", + name: "Admin", + permissions: [ + ...permissionsByRoles["common"], + ...permissionsByRoles["registry.admin"], + ], + }, + user: { + slug: "user", + name: "User", + permissions: [ + ...permissionsByRoles["common"], + ...permissionsByRoles["registry.user"], + ], + }, +}; diff --git a/api/src/pdc/services/auth/dex/generated/api.ts b/api/src/pdc/services/auth/dex/generated/api.ts new file mode 100644 index 0000000000..f2903291f3 --- /dev/null +++ b/api/src/pdc/services/auth/dex/generated/api.ts @@ -0,0 +1,217 @@ +/* this code was generated by automated tool, + should not edit by hand */ + +export interface Dex { + GetClient(request: GetClientReq): Promise; + CreateClient(request: CreateClientReq): Promise; + UpdateClient(request: UpdateClientReq): Promise; + DeleteClient(request: DeleteClientReq): Promise; + CreatePassword(request: CreatePasswordReq): Promise; + UpdatePassword(request: UpdatePasswordReq): Promise; + DeletePassword(request: DeletePasswordReq): Promise; + ListPasswords(request: ListPasswordReq): Promise; + CreateConnector(request: CreateConnectorReq): Promise; + UpdateConnector(request: UpdateConnectorReq): Promise; + DeleteConnector(request: DeleteConnectorReq): Promise; + ListConnectors(request: ListConnectorReq): Promise; + GetVersion(request: VersionReq): Promise; + GetDiscovery(request: DiscoveryReq): Promise; + ListRefresh(request: ListRefreshReq): Promise; + RevokeRefresh(request: RevokeRefreshReq): Promise; + VerifyPassword(request: VerifyPasswordReq): Promise; +} + +export interface Client { + id?: string; + secret?: string; + redirectUris?: string[]; + trustedPeers?: string[]; + public?: boolean; + name?: string; + logoUrl?: string; +} + +export interface GetClientReq { + id?: string; +} + +export interface GetClientResp { + client?: Client; +} + +export interface CreateClientReq { + client?: Client; +} + +export interface CreateClientResp { + alreadyExists?: boolean; + client?: Client; +} + +export interface DeleteClientReq { + id?: string; +} + +export interface DeleteClientResp { + notFound?: boolean; +} + +export interface UpdateClientReq { + id?: string; + redirectUris?: string[]; + trustedPeers?: string[]; + name?: string; + logoUrl?: string; +} + +export interface UpdateClientResp { + notFound?: boolean; +} + +export interface Password { + email?: string; + hash?: Uint8Array; + username?: string; + userId?: string; +} + +export interface CreatePasswordReq { + password?: Password; +} + +export interface CreatePasswordResp { + alreadyExists?: boolean; +} + +export interface UpdatePasswordReq { + email?: string; + newHash?: Uint8Array; + newUsername?: string; +} + +export interface UpdatePasswordResp { + notFound?: boolean; +} + +export interface DeletePasswordReq { + email?: string; +} + +export interface DeletePasswordResp { + notFound?: boolean; +} + +export interface ListPasswordReq { + +} + +export interface ListPasswordResp { + passwords?: Password[]; +} + +export interface Connector { + id?: string; + type?: string; + name?: string; + config?: Uint8Array; +} + +export interface CreateConnectorReq { + connector?: Connector; +} + +export interface CreateConnectorResp { + alreadyExists?: boolean; +} + +export interface UpdateConnectorReq { + id?: string; + newType?: string; + newName?: string; + newConfig?: Uint8Array; +} + +export interface UpdateConnectorResp { + notFound?: boolean; +} + +export interface DeleteConnectorReq { + id?: string; +} + +export interface DeleteConnectorResp { + notFound?: boolean; +} + +export interface ListConnectorReq { + +} + +export interface ListConnectorResp { + connectors?: Connector[]; +} + +export interface VersionReq { + +} + +export interface VersionResp { + server?: string; + api?: number; +} + +export interface DiscoveryReq { + +} + +export interface DiscoveryResp { + issuer?: string; + authorizationEndpoint?: string; + tokenEndpoint?: string; + jwksUri?: string; + userinfoEndpoint?: string; + deviceAuthorizationEndpoint?: string; + introspectionEndpoint?: string; + grantTypesSupported?: string[]; + responseTypesSupported?: string[]; + subjectTypesSupported?: string[]; + idTokenSigningAlgValuesSupported?: string[]; + codeChallengeMethodsSupported?: string[]; + scopesSupported?: string[]; + tokenEndpointAuthMethodsSupported?: string[]; + claimsSupported?: string[]; +} + +export interface RefreshTokenRef { + id?: string; + clientId?: string; + createdAt?: number; + lastUsed?: number; +} + +export interface ListRefreshReq { + userId?: string; +} + +export interface ListRefreshResp { + refreshTokens?: RefreshTokenRef[]; +} + +export interface RevokeRefreshReq { + userId?: string; + clientId?: string; +} + +export interface RevokeRefreshResp { + notFound?: boolean; +} + +export interface VerifyPasswordReq { + email?: string; + password?: string; +} + +export interface VerifyPasswordResp { + verified?: boolean; + notFound?: boolean; +} diff --git a/api/src/pdc/services/auth/dex/getDexClient.ts b/api/src/pdc/services/auth/dex/getDexClient.ts new file mode 100644 index 0000000000..bb7cc55d5f --- /dev/null +++ b/api/src/pdc/services/auth/dex/getDexClient.ts @@ -0,0 +1,19 @@ +import { grpc } from "@/deps.ts"; +import { Dex } from "./generated/api.ts"; + +export async function getDexClient( + config: { + host: string; + port: number; + } & Partial, +) { + const protoPath = new URL("./protofiles/api.proto", import.meta.url); + const protoFile = await Deno.readTextFile(protoPath); + // Create a gRPC client + const client = grpc.getClient({ + root: protoFile, + serviceName: "Dex", + ...config, + }); + return client; +} diff --git a/api/src/pdc/services/auth/dex/protofiles/api.proto b/api/src/pdc/services/auth/dex/protofiles/api.proto new file mode 100644 index 0000000000..96cc6e6abc --- /dev/null +++ b/api/src/pdc/services/auth/dex/protofiles/api.proto @@ -0,0 +1,284 @@ +syntax = "proto3"; + +package api; + +option java_package = "com.coreos.dex.api"; +option go_package = "github.com/dexidp/dex/api/v2;api"; + +// Client represents an OAuth2 client. +message Client { + string id = 1; + string secret = 2; + repeated string redirect_uris = 3; + repeated string trusted_peers = 4; + bool public = 5; + string name = 6; + string logo_url = 7; +} + +// GetClientReq is a request to retrieve client details. +message GetClientReq { + // The ID of the client. + string id = 1; +} + +// GetClientResp returns the client details. +message GetClientResp { + Client client = 1; +} + +// CreateClientReq is a request to make a client. +message CreateClientReq { + Client client = 1; +} + +// CreateClientResp returns the response from creating a client. +message CreateClientResp { + bool already_exists = 1; + Client client = 2; +} + +// DeleteClientReq is a request to delete a client. +message DeleteClientReq { + // The ID of the client. + string id = 1; +} + +// DeleteClientResp determines if the client is deleted successfully. +message DeleteClientResp { + bool not_found = 1; +} + +// UpdateClientReq is a request to update an existing client. +message UpdateClientReq { + string id = 1; + repeated string redirect_uris = 2; + repeated string trusted_peers = 3; + string name = 4; + string logo_url = 5; +} + +// UpdateClientResp returns the response from updating a client. +message UpdateClientResp { + bool not_found = 1; +} + +// TODO(ericchiang): expand this. + +// Password is an email for password mapping managed by the storage. +message Password { + string email = 1; + + // Currently we do not accept plain text passwords. Could be an option in the future. + bytes hash = 2; + string username = 3; + string user_id = 4; +} + +// CreatePasswordReq is a request to make a password. +message CreatePasswordReq { + Password password = 1; +} + +// CreatePasswordResp returns the response from creating a password. +message CreatePasswordResp { + bool already_exists = 1; +} + +// UpdatePasswordReq is a request to modify an existing password. +message UpdatePasswordReq { + // The email used to lookup the password. This field cannot be modified + string email = 1; + bytes new_hash = 2; + string new_username = 3; +} + +// UpdatePasswordResp returns the response from modifying an existing password. +message UpdatePasswordResp { + bool not_found = 1; +} + +// DeletePasswordReq is a request to delete a password. +message DeletePasswordReq { + string email = 1; +} + +// DeletePasswordResp returns the response from deleting a password. +message DeletePasswordResp { + bool not_found = 1; +} + +// ListPasswordReq is a request to enumerate passwords. +message ListPasswordReq {} + +// ListPasswordResp returns a list of passwords. +message ListPasswordResp { + repeated Password passwords = 1; +} + +// Connector is a strategy used by Dex for authenticating a user against another identity provider +message Connector { + string id = 1; + string type = 2; + string name = 3; + bytes config = 4; +} + +// CreateConnectorReq is a request to make a connector. +message CreateConnectorReq { + Connector connector = 1; +} + +// CreateConnectorResp returns the response from creating a connector. +message CreateConnectorResp { + bool already_exists = 1; +} + +// UpdateConnectorReq is a request to modify an existing connector. +message UpdateConnectorReq { + // The id used to lookup the connector. This field cannot be modified + string id = 1; + string new_type = 2; + string new_name = 3; + bytes new_config = 4; +} + +// UpdateConnectorResp returns the response from modifying an existing connector. +message UpdateConnectorResp { + bool not_found = 1; +} + +// DeleteConnectorReq is a request to delete a connector. +message DeleteConnectorReq { + string id = 1; +} + +// DeleteConnectorResp returns the response from deleting a connector. +message DeleteConnectorResp { + bool not_found = 1; +} + +// ListConnectorReq is a request to enumerate connectors. +message ListConnectorReq {} + +// ListConnectorResp returns a list of connectors. +message ListConnectorResp { + repeated Connector connectors = 1; +} + +// VersionReq is a request to fetch version info. +message VersionReq {} + +// VersionResp holds the version info of components. +message VersionResp { + // Semantic version of the server. + string server = 1; + // Numeric version of the API. It increases every time a new call is added to the API. + // Clients should use this info to determine if the server supports specific features. + int32 api = 2; +} + +// DiscoveryReq is a request to fetch discover information. +message DiscoveryReq {} + +//DiscoverResp holds the version oidc disovery info. +message DiscoveryResp { + string issuer = 1; + string authorization_endpoint = 2; + string token_endpoint = 3; + string jwks_uri = 4; + string userinfo_endpoint = 5; + string device_authorization_endpoint = 6; + string introspection_endpoint = 7; + repeated string grant_types_supported = 8; + repeated string response_types_supported = 9; + repeated string subject_types_supported = 10; + repeated string id_token_signing_alg_values_supported = 11; + repeated string code_challenge_methods_supported = 12; + repeated string scopes_supported = 13; + repeated string token_endpoint_auth_methods_supported = 14; + repeated string claims_supported = 15; +} + +// RefreshTokenRef contains the metadata for a refresh token that is managed by the storage. +message RefreshTokenRef { + // ID of the refresh token. + string id = 1; + string client_id = 2; + int64 created_at = 5; + int64 last_used = 6; +} + +// ListRefreshReq is a request to enumerate the refresh tokens of a user. +message ListRefreshReq { + // The "sub" claim returned in the ID Token. + string user_id = 1; +} + +// ListRefreshResp returns a list of refresh tokens for a user. +message ListRefreshResp { + repeated RefreshTokenRef refresh_tokens = 1; +} + +// RevokeRefreshReq is a request to revoke the refresh token of the user-client pair. +message RevokeRefreshReq { + // The "sub" claim returned in the ID Token. + string user_id = 1; + string client_id = 2; +} + +// RevokeRefreshResp determines if the refresh token is revoked successfully. +message RevokeRefreshResp { + // Set to true is refresh token was not found and token could not be revoked. + bool not_found = 1; +} + +message VerifyPasswordReq { + string email = 1; + string password = 2; +} + +message VerifyPasswordResp { + bool verified = 1; + bool not_found = 2; +} + +// Dex represents the dex gRPC service. +service Dex { + // GetClient gets a client. + rpc GetClient(GetClientReq) returns (GetClientResp) {}; + // CreateClient creates a client. + rpc CreateClient(CreateClientReq) returns (CreateClientResp) {}; + // UpdateClient updates an existing client + rpc UpdateClient(UpdateClientReq) returns (UpdateClientResp) {}; + // DeleteClient deletes the provided client. + rpc DeleteClient(DeleteClientReq) returns (DeleteClientResp) {}; + // CreatePassword creates a password. + rpc CreatePassword(CreatePasswordReq) returns (CreatePasswordResp) {}; + // UpdatePassword modifies existing password. + rpc UpdatePassword(UpdatePasswordReq) returns (UpdatePasswordResp) {}; + // DeletePassword deletes the password. + rpc DeletePassword(DeletePasswordReq) returns (DeletePasswordResp) {}; + // ListPassword lists all password entries. + rpc ListPasswords(ListPasswordReq) returns (ListPasswordResp) {}; + // CreateConnector creates a connector. + rpc CreateConnector(CreateConnectorReq) returns (CreateConnectorResp) {}; + // UpdateConnector modifies existing connector. + rpc UpdateConnector(UpdateConnectorReq) returns (UpdateConnectorResp) {}; + // DeleteConnector deletes the connector. + rpc DeleteConnector(DeleteConnectorReq) returns (DeleteConnectorResp) {}; + // ListConnectors lists all connector entries. + rpc ListConnectors(ListConnectorReq) returns (ListConnectorResp) {}; + // GetVersion returns version information of the server. + rpc GetVersion(VersionReq) returns (VersionResp) {}; + // GetDiscovery returns discovery information of the server. + rpc GetDiscovery(DiscoveryReq) returns (DiscoveryResp) {}; + // ListRefresh lists all the refresh token entries for a particular user. + rpc ListRefresh(ListRefreshReq) returns (ListRefreshResp) {}; + // RevokeRefresh revokes the refresh token for the provided user-client pair. + // + // Note that each user-client pair can have only one refresh token at a time. + rpc RevokeRefresh(RevokeRefreshReq) returns (RevokeRefreshResp) {}; + // VerifyPassword returns whether a password matches a hash for a specific email or not. + rpc VerifyPassword(VerifyPasswordReq) returns (VerifyPasswordResp) {}; +} \ No newline at end of file diff --git a/api/src/pdc/services/auth/dto/OidcCallback.ts b/api/src/pdc/services/auth/dto/OidcCallback.ts new file mode 100644 index 0000000000..98944f94d3 --- /dev/null +++ b/api/src/pdc/services/auth/dto/OidcCallback.ts @@ -0,0 +1,7 @@ +import { Infer, object, string } from "@/lib/superstruct/index.ts"; + +export const OidcCallback = object({ + code: string(), +}); + +export type OidcCallback = Infer; diff --git a/api/src/pdc/services/auth/providers/DexClient.ts b/api/src/pdc/services/auth/providers/DexClient.ts new file mode 100644 index 0000000000..47216af3f8 --- /dev/null +++ b/api/src/pdc/services/auth/providers/DexClient.ts @@ -0,0 +1,74 @@ +import { grpc } from "@/deps.ts"; +import { ConfigInterfaceResolver, InitHookInterface, NotFoundException, provider } from "@/ilos/common/index.ts"; +import { bcrypt_hash } from "@/lib/crypto/index.ts"; +import { randomString, v4 } from "@/lib/uuid/index.ts"; +import { Dex } from "@/pdc/services/auth/dex/generated/api.ts"; +import { getDexClient } from "@/pdc/services/auth/dex/getDexClient.ts"; + +@provider() +export class DexClient implements InitHookInterface { + protected client: (grpc.GrpcClient & Dex) | undefined; + constructor(protected config: ConfigInterfaceResolver) {} + + async init(): Promise { + await this.getClient(); + } + + protected async getClient() { + if (this.client) { + return this.client; + } + + const host = this.config.get("dex.grpc_host"); + const port = this.config.get("dex.grpc_port"); + this.client = await getDexClient({ + host, + port, + }); + return this.client; + } + + async listByOperator(id: number) { + const result = await (await this.getClient()).ListPasswords({}); + if (!result.passwords) { + return []; + } + return result.passwords.map((p) => { + const [role, operator_id] = p.username?.split(":") || []; + return { + token_id: p.email, + operator_id: parseInt(operator_id), + role, + }; + }).filter((p) => p.operator_id === id); + } + + async createForOperator(operator_id: number, role?: "application") { + const uuid = v4(); + const password = randomString(); + const hash = new TextEncoder().encode(await bcrypt_hash(password)); + await (await this.getClient()).CreatePassword({ + password: { + email: uuid, + username: `${role}:${operator_id}`, + hash, + userId: uuid, + }, + }); + return { + uuid, + password, + }; + } + + async deleteByOperator(operator_id: number, token_id: string) { + const tokens = await this.listByOperator(operator_id); + const exists = tokens.find((t) => t.operator_id === operator_id && t.token_id === token_id); + if (!exists) { + throw new NotFoundException(); + } + await (await this.getClient()).DeletePassword({ + email: token_id, + }); + } +} diff --git a/api/src/pdc/services/auth/providers/OidcProvider.ts b/api/src/pdc/services/auth/providers/OidcProvider.ts new file mode 100644 index 0000000000..e9f794b57e --- /dev/null +++ b/api/src/pdc/services/auth/providers/OidcProvider.ts @@ -0,0 +1,112 @@ +import { encodeBase64, jose } from "@/deps.ts"; +import { ConfigInterfaceResolver, InitHookInterface, provider } from "@/ilos/common/index.ts"; + +@provider() +export class OidcProvider implements InitHookInterface { + protected JWKS: jose.KeyLike | undefined; + constructor(protected config: ConfigInterfaceResolver) {} + + async init(): Promise { + this.getJWKS(); + } + + protected getJWKS() { + if (this.JWKS) { + return this.JWKS; + } + const authBaseUrl = this.config.get("oidc.base_url"); + this.JWKS = jose.createRemoteJWKSet(new URL(`${authBaseUrl}/keys`)); + return this.JWKS; + } + + getLoginUrl() { + const clientId = this.config.get("oidc.client_id"); + const authBaseUrl = this.config.get("oidc.base_url"); + const redirectUrl = this.config.get("oidc.redirect_url"); + const url = new URL(authBaseUrl); + url.pathname = "/auth"; + url.searchParams.set("client_id", clientId); + url.searchParams.set("scope", "openid profile email"); + url.searchParams.set("redirect_uri", redirectUrl); + url.searchParams.set("response_type", "code"); + return url.toString(); + } + + async getTokenFromCode(code: string) { + const clientId = this.config.get("oidc.client_id"); + const clientSecret = this.config.get("oidc.client_secret"); + const authBaseUrl = this.config.get("oidc.base_url"); + const redirectUrl = this.config.get("oidc.redirect_url"); + const url = new URL(authBaseUrl); + url.pathname = "/token"; + const form = new URLSearchParams(); + form.set("grant_type", "authorization_code"); + form.set("client_id", clientId); + form.set("client_secret", clientSecret); + form.set("code", code); + form.set("redirect_uri", redirectUrl); + const response = await fetch(url, { + body: form.toString(), + method: "POST", + headers: { + "Content-type": "application/x-www-form-urlencoded", + }, + }); + const json = await response.json(); + return json.access_token; + } + + async getUserInfoFromToken(token: string) { + const authBaseUrl = this.config.get("oidc.base_url"); + const url = new URL(authBaseUrl); + url.pathname = "/userinfo"; + const response = await fetch(url, { + headers: { + "Authorization": `Bearer ${token}`, + }, + }); + const json = await response.json(); + return { + email: json.email, + siret: json.preferred_username, + }; + } + + async verifyToken(token: string) { + const clientId = this.config.get("oidc.client_id"); + const authBaseUrl = this.config.get("oidc.base_url"); + const { payload } = await jose.jwtVerify<{ name: string; email: string }>(token, this.getJWKS(), { + issuer: authBaseUrl, + audience: clientId, + }); + const [role, operator_id] = (payload.name || "").split(":"); + return { + operator_id: parseInt(operator_id), + role, + token_id: payload.email, + }; + } + + async getToken(access_key: string, secret_key: string): Promise { + const clientId = this.config.get("oidc.client_id"); + const clientSecret = this.config.get("oidc.client_secret"); + const authBaseUrl = this.config.get("oidc.base_url"); + const url = new URL(authBaseUrl); + url.pathname = "/token"; + const form = new URLSearchParams(); + form.set("grant_type", "password"); + form.set("username", access_key); + form.set("password", secret_key); + form.set("scope", "openid email profile"); + const response = await fetch(url, { + body: form.toString(), + method: "POST", + headers: { + "Content-type": "application/x-www-form-urlencoded", + "Authorization": `Basic ${encodeBase64(`${clientId}:${clientSecret}`)}`, + }, + }); + const json = await response.json(); + return json.access_token; + } +} diff --git a/api/src/pdc/services/auth/providers/UserRepository.ts b/api/src/pdc/services/auth/providers/UserRepository.ts new file mode 100644 index 0000000000..8131ac7683 --- /dev/null +++ b/api/src/pdc/services/auth/providers/UserRepository.ts @@ -0,0 +1,39 @@ +import { provider } from "@/ilos/common/index.ts"; +import { PostgresConnection } from "@/ilos/connection-postgres/index.ts"; +import sql, { raw } from "@/lib/pg/sql.ts"; + +@provider() +export class UserRepository { + public readonly table = "auth.users"; + public readonly territoryTable = "territory.territories"; + public readonly operatorTable = "operator.operators"; + + constructor( + protected connection: PostgresConnection, + ) {} + + async findUserByEmail(email: string) { + const query = sql` + SELECT + u.email, + u.role, + u.operator_id, + u.territory_id, + COALESCE(o.siret, t.siret) as siret + FROM ${raw(this.table)} u + LEFT JOIN ${raw(this.territoryTable)} t + ON t._id = u.territory_id + LEFT JOIN ${raw(this.operatorTable)} o + ON o._id = u.operator_id + WHERE u.email = ${email} + LIMIT 1 + `; + const results = await this.connection.getClient().query(query); + return results.rows[0]; + } + + async touchLastLogin(_id: number) { + const query = sql`UPDATE ${raw(this.table)} SET last_login_at = NOW() WHERE _id = ${_id}`; + await this.connection.getClient().query(query); + } +} diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index c05bf0ffd6..6e655d242d 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -44,7 +44,10 @@ services: labels: - 'traefik.http.services.dashboard.loadbalancer.server.port=4200' - + dex: + environment: + PG_DB: dex + api: build: dockerfile: ./docker/api/Dockerfile @@ -54,6 +57,9 @@ services: APP_RATE_LIMIT_MAX_FACTOR: '0' DEBUG: 'api' APP_POSTGRES_URL: postgres://postgres:postgres@postgres:5432/local + command: + - just + - watch volumes: - ./api:/app/api - ./shared:/app/shared:ro diff --git a/docker-compose.e2e.yml b/docker-compose.e2e.yml index fb1da075b3..94d558b286 100644 --- a/docker-compose.e2e.yml +++ b/docker-compose.e2e.yml @@ -33,35 +33,39 @@ services: - s3.covoiturage.test - download.covoiturage.test - local-pdc-export.s3.covoiturage.test - kc: - image: keycloak/keycloak:24.0 + dex: + image: bitnami/dex:2 environment: - KEYCLOAK_ADMIN: admin - KEYCLOAK_ADMIN_PASSWORD: admin - KC_DB: postgres - KC_DB_USERNAME: postgres - KC_DB_PASSWORD: postgres - KC_DB_URL: "jdbc:postgresql://postgres:5432/test" - KC_REALM_NAME: covoiturage - PDC_URL: http://app.covoiturage.test - PDC_ADMIN_USERNAME: admin - PDC_ADMIN_PASSWORD: admin - PDC_KC_ADMIN_CLIENT_SECRET: so_secret_000 - PDC_KC_BOT_CLIENT_SECRET: so_secret_000 - PDC_KC_CLIENT_SECRET: so_secret_000 + PG_DB: test + PG_USERNAME: postgres + PG_PASSWORD: postgres + PG_HOST: postgres + PG_PORT: 5432 + PDC_URL: http://app.covoiturage.test/auth/callback + PDC_CLIENT_ID: secret + PDC_CLIENT_SECRET: secret + OIDC_ISSUER_URL: https://fca.integ01.dev-agentconnect.fr/api/v2 + OIDC_CLIENT_ID: ${PRO_CONNECT_CLIENT_ID} + OIDC_CLIENT_SECRET: ${PRO_CONNECT_CLIENT_SECRET} + OIDC_REDIRECT_URL: http://auth.covoiturage.test/callback + ports: + - 5557:5557 + - 8090:8080 networks: - back labels: - 'traefik.enable=true' - - 'traefik.http.routers.kc-http.rule=Host(`auth.covoiturage.test`)' - - 'traefik.http.routers.kc-http.entrypoints=web' - - 'traefik.http.routers.kc-https.rule=Host(`auth.covoiturage.test`)' - - 'traefik.http.routers.kc-https.entrypoints=websecure' - - 'traefik.http.routers.kc-https.tls=true' - - 'traefik.http.services.kc.loadbalancer.server.port=8080' - command: ["start-dev", "--import-realm"] + - 'traefik.http.routers.dex-http.rule=Host(`auth.covoiturage.test`)' + - 'traefik.http.routers.dex-http.entrypoints=web' + - 'traefik.http.routers.dex-https.rule=Host(`auth.covoiturage.test`)' + - 'traefik.http.routers.dex-https.entrypoints=websecure' + - 'traefik.http.routers.dex-https.tls=true' + - 'traefik.http.services.dex.loadbalancer.server.port=8080' + command: ["serve", "--web-http-addr", "0.0.0.0:8080", "/etc/dex/config.yaml"] volumes: - - ./docker/keycloak/realm.json:/opt/keycloak/data/import/realm.json:ro + - ./docker/dex/config.yaml:/etc/dex/config.yaml:ro + depends_on: + - postgres mailer: image: mailhog/mailhog:v1.0.1 environment: @@ -151,6 +155,12 @@ services: APP_ENV: local APP_INSEE_API_KEY: ${APP_INSEE_API_KEY} APP_USER_REGISTRATION_ENABLED: 'true' + OIDC_CLIENT_ID: secret + OIDC_CLIENT_SECRET: secret + OIDC_BASE_URL: http://auth.covoiturage.test + OIDC_REDIRECT_URL: http://api.covoiturage.test/auth/callback + DEX_GRPC_HOST: localhost + DEX_GRPC_PORT: 5557 networks: - back - front @@ -164,6 +174,8 @@ services: - 'traefik.http.routers.api.rule=Host(`api.covoiturage.test`)' - 'traefik.http.routers.api.entrypoints=websecure' - 'traefik.http.routers.api.tls=true' + - 'traefik.http.routers.api-http.rule=Host(`api.covoiturage.test`)' + - 'traefik.http.routers.api-http.entrypoints=web' - 'traefik.http.services.api.loadbalancer.server.port=8080' volumes: - ./docker/api/certs:/app/certs:ro diff --git a/docker/dex/config.yaml b/docker/dex/config.yaml new file mode 100644 index 0000000000..166928b772 --- /dev/null +++ b/docker/dex/config.yaml @@ -0,0 +1,148 @@ +issuer: http://auth.covoiturage.test +web: + http: 0.0.0.0:8080 +grpc: + addr: 0.0.0.0:5557 + +staticClients: +- id: secret + redirectURIs: + - http://api.covoiturage.test/auth/callback + name: pdc + secret: secret +storage: + type: postgres + config: + host: $PG_HOST + port: 5432 + database: $PG_DB + user: $PG_USERNAME + password: $PG_PASSWORD + ssl: + mode: disable + # caFile: /etc/dex/postgres.ca +connectors: +- type: oidc + id: proconnect + name: ProConnect + config: + # Canonical URL of the provider, also used for configuration discovery. + # This value MUST match the value returned in the provider config discovery. + # + # See: https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig + issuer: $OIDC_ISSUER_URL + + # Connector config values starting with a "$" will read from the environment. + clientID: $OIDC_CLIENT_ID + clientSecret: $OIDC_CLIENT_SECRET + + # Dex's issuer URL + "/callback" + redirectURI: $OIDC_REDIRECT_URL + + + # Some providers require passing client_secret via POST parameters instead + # of basic auth, despite the OAuth2 RFC discouraging it. Many of these + # cases are caught internally, but some may need to uncomment the + # following field. + # + # basicAuthUnsupported: true + + # List of additional scopes to request in token response + # Default is profile and email + # Full list at https://dexidp.io/docs/custom-scopes-claims-clients/ + scopes: + - openid + - email + - siret + - given_name + - usual_name + # - groups + + # Some providers return claims without "email_verified", when they had no usage of emails verification in enrollment process + # or if they are acting as a proxy for another IDP etc AWS Cognito with an upstream SAML IDP + # This can be overridden with the below option + insecureSkipEmailVerified: true + + # Groups claims (like the rest of oidc claims through dex) only refresh when the id token is refreshed + # meaning the regular refresh flow doesn't update the groups claim. As such by default the oidc connector + # doesn't allow groups claims. If you are okay with having potentially stale group claims you can use + # this option to enable groups claims through the oidc connector on a per-connector basis. + # This can be overridden with the below option + # insecureEnableGroups: true + + # When enabled, the OpenID Connector will query the UserInfo endpoint for additional claims. UserInfo claims + # take priority over claims returned by the IDToken. This option should be used when the IDToken doesn't contain + # all the claims requested. + # https://openid.net/specs/openid-connect-core-1_0.html#UserInfo + getUserInfo: true + + # The set claim is used as user id. + # Claims list at https://openid.net/specs/openid-connect-core-1_0.html#Claims + # Default: sub + # userIDKey: nickname + + # The set claim is used as user name. + # Default: name + userNameKey: email + + # The acr_values variable specifies the Authentication Context Class Values within + # the Authentication Request that the Authorization Server is being requested to process + # from this Client. + # acrValues: + # - + # - + + # For offline_access, the prompt parameter is set by default to "prompt=consent". + # However this is not supported by all OIDC providers, some of them support different + # value for prompt, like "prompt=login" or "prompt=none" + promptType: none + + # Some providers return non-standard claims (eg. mail). + # Use claimMapping to map those claims to standard claims: + # https://openid.net/specs/openid-connect-core-1_0.html#Claims + # claimMapping can only map a non-standard claim to a standard one if it's not returned in the id_token. + claimMapping: + # The set claim is used as preferred username. + # Default: preferred_username + preferred_username: siret + family_name: usual_name + + # The set claim is used as email. + # Default: email + # email: mail + + # The set claim is used as groups. + # Default: groups + # groups: siret + + # overrideClaimMapping will be used to override the options defined in claimMappings. + # i.e. if there are 'email' and `preferred_email` claims available, by default Dex will always use the `email` claim independent of the claimMapping.email. + # This setting allows you to override the default behavior of Dex and enforce the mappings defined in `claimMapping`. + overrideClaimMapping: false + + # The section to override options discovered automatically from + # the providers' discovery URL (.well-known/openid-configuration). + providerDiscoveryOverrides: + # tokenURL provides a way to user overwrite the token URL + # from the .well-known/openid-configuration 'token_endpoint'. + # tokenURL: "" + # + # authURL provides a way to user overwrite the authorization URL + # from the .well-known/openid-configuration 'authorization_endpoint'. + # authURL: "" +oauth2: + responseTypes: [ "code" ] + skipApprovalScreen: true + alwaysShowLoginScreen: false + passwordConnector: local + +enablePasswordDB: true +expiry: + deviceRequests: "5m" + signingKeys: "6h" + idTokens: "5m" + refreshTokens: + disableRotation: false + reuseInterval: "3s" + validIfNotUsedFor: "2160h" + absoluteLifetime: "3960h" diff --git a/docker/keycloak/realm.json b/docker/keycloak/realm.json deleted file mode 100644 index 9034747c1d..0000000000 --- a/docker/keycloak/realm.json +++ /dev/null @@ -1,745 +0,0 @@ -{ - "id": "covoiturage", - "realm": "covoiturage", - "sslRequired": "none", - "enabled": true, - "eventsEnabled": true, - "eventsExpiration": 900, - "adminEventsEnabled": true, - "adminEventsDetailsEnabled": true, - "attributes": { - "adminEventsExpiration": "900" - }, - "roles": { - "client": { - "pdc-bot": [{ - "name": "bot", - "clientRole": true - }] - } - }, - "clients": [ - { - "id": "pdc", - "clientId": "pdc", - "name": "pdc", - "enabled": true, - "publicClient": true, - "rootUrl": "${PDC_URL}", - "adminUrl": "${PDC_URL}", - "baseUrl": "${PDC_URL}", - "secret": "${PDC_KC_CLIENT_SECRET}", - "redirectUris": [ - "${PDC_URL}/*" - ], - "webOrigins": [ - "${PDC_URL}" - ] - }, - { - "id": "pdc-bot", - "clientId": "pdc-bot", - "name": "pdc-bot", - "description": "", - "enabled": true, - "alwaysDisplayInConsole": false, - "clientAuthenticatorType": "client-secret", - "secret": "${PDC_KC_BOT_CLIENT_SECRET}", - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": false, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": true, - "serviceAccountsEnabled": false, - "publicClient": false, - "frontchannelLogout": true, - "protocol": "openid-connect", - "fullScopeAllowed": true, - "defaultClientScopes": [ - "attributes" - ] - }, - { - "id": "pdc-manager", - "clientId": "pdc-manager", - "name": "pdc-manager", - "enabled": true, - "alwaysDisplayInConsole": false, - "clientAuthenticatorType": "client-secret", - "secret": "${PDC_KC_ADMIN_CLIENT_SECRET}", - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": false, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": true, - "serviceAccountsEnabled": true, - "publicClient": false, - "frontchannelLogout": true, - "protocol": "openid-connect", - "fullScopeAllowed": true, - "defaultClientScopes": [ - "web-origins", - "acr", - "profile", - "roles", - "email" - ], - "optionalClientScopes": [ - "address", - "phone", - "offline_access", - "microprofile-jwt" - ] - } - ], - "clientScopes": [ - { - "id": "attributes", - "name": "attributes", - "description": "", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "false" - }, - "protocolMappers": [ - { - "id": "territory_id", - "name": "territory_id", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "territory_id", - "id.token.claim": "true", - "lightweight.claim": "false", - "access.token.claim": "true", - "claim.name": "territory_id", - "jsonType.label": "String" - } - }, - { - "id": "operator_id", - "name": "operator_id", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "operator_id", - "id.token.claim": "true", - "lightweight.claim": "false", - "access.token.claim": "true", - "claim.name": "operator_id", - "jsonType.label": "String" - } - }, - { - "id": "pdc_role", - "name": "pdc_role", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "pdc_role", - "id.token.claim": "true", - "lightweight.claim": "false", - "access.token.claim": "true", - "claim.name": "pdc_role", - "jsonType.label": "String" - } - } - ] - }, - { - "id": "d56f07df-f635-4238-a196-bedc83da6e01", - "name": "address", - "description": "OpenID Connect built-in scope: address", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "consent.screen.text": "${addressScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "c45bbc54-7d16-4531-85d3-79eb90b4522a", - "name": "address", - "protocol": "openid-connect", - "protocolMapper": "oidc-address-mapper", - "consentRequired": false, - "config": { - "user.attribute.formatted": "formatted", - "user.attribute.country": "country", - "introspection.token.claim": "true", - "user.attribute.postal_code": "postal_code", - "userinfo.token.claim": "true", - "user.attribute.street": "street", - "id.token.claim": "true", - "user.attribute.region": "region", - "access.token.claim": "true", - "user.attribute.locality": "locality" - } - } - ] - }, - { - "id": "9e2b6563-077a-443e-805c-28f04031b26a", - "name": "email", - "description": "OpenID Connect built-in scope: email", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "consent.screen.text": "${emailScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "7bdbda06-bb82-46e0-80aa-55c708cc9293", - "name": "email", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "email", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "email", - "jsonType.label": "String" - } - }, - { - "id": "4ac28d76-e227-41ba-8081-01264e18179e", - "name": "email verified", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-property-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "emailVerified", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "email_verified", - "jsonType.label": "boolean" - } - } - ] - }, - { - "id": "bae55815-30ee-4640-9c8e-97c5f7b89568", - "name": "microprofile-jwt", - "description": "Microprofile - JWT built-in scope", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "false" - }, - "protocolMappers": [ - { - "id": "476b59f7-489a-4a4c-975f-d92ef96494a5", - "name": "upn", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "username", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "upn", - "jsonType.label": "String" - } - }, - { - "id": "8d578d58-303c-410b-a311-bcd4f1bb06e2", - "name": "groups", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-realm-role-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "multivalued": "true", - "user.attribute": "foo", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "groups", - "jsonType.label": "String" - } - } - ] - }, - { - "id": "d7c9c3f5-800b-4888-b420-52e0f9cfb113", - "name": "profile", - "description": "OpenID Connect built-in scope: profile", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "consent.screen.text": "${profileScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "dcac88e5-f7a1-474a-9e3a-bfa5c077c0ef", - "name": "profile", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "profile", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "profile", - "jsonType.label": "String" - } - }, - { - "id": "9e54cb38-e531-4990-8994-06f4717d9b27", - "name": "zoneinfo", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "zoneinfo", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "zoneinfo", - "jsonType.label": "String" - } - }, - { - "id": "8ed8fc7a-ce13-428a-89e7-c9c7ba67e4f4", - "name": "given name", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "firstName", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "given_name", - "jsonType.label": "String" - } - }, - { - "id": "1deb9fa6-d3eb-4bfa-a64e-fae524c4c59e", - "name": "gender", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "gender", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "gender", - "jsonType.label": "String" - } - }, - { - "id": "08d0567a-d357-45c7-aa89-7d0f14967933", - "name": "full name", - "protocol": "openid-connect", - "protocolMapper": "oidc-full-name-mapper", - "consentRequired": false, - "config": { - "id.token.claim": "true", - "introspection.token.claim": "true", - "access.token.claim": "true", - "userinfo.token.claim": "true" - } - }, - { - "id": "0cc3405c-aed6-415f-8b21-bc4287f48479", - "name": "middle name", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "middleName", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "middle_name", - "jsonType.label": "String" - } - }, - { - "id": "63819346-c6fb-4bef-85a1-70bd885c14cb", - "name": "nickname", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "nickname", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "nickname", - "jsonType.label": "String" - } - }, - { - "id": "caffb470-f4c1-4bad-a5f3-586387ab878e", - "name": "picture", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "picture", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "picture", - "jsonType.label": "String" - } - }, - { - "id": "1664a602-7d6b-48c8-a814-738d495cd790", - "name": "locale", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "locale", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "locale", - "jsonType.label": "String" - } - }, - { - "id": "6759e125-ab84-407f-b6a1-df8830ef938d", - "name": "updated at", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "updatedAt", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "updated_at", - "jsonType.label": "long" - } - }, - { - "id": "357f6c49-5ee5-4898-bf05-f92da868a552", - "name": "family name", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "lastName", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "family_name", - "jsonType.label": "String" - } - }, - { - "id": "bbddd75d-4c1e-44e4-b71d-7de5ee495ea9", - "name": "birthdate", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "birthdate", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "birthdate", - "jsonType.label": "String" - } - }, - { - "id": "2439a1c4-b2d6-4b10-9141-789abcaa3c1f", - "name": "username", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "username", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "preferred_username", - "jsonType.label": "String" - } - }, - { - "id": "5a14ba38-1034-4e08-ba1a-b880dbf6678a", - "name": "website", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "website", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "website", - "jsonType.label": "String" - } - } - ] - }, - { - "id": "717fb6cb-344a-487e-bbc9-fd686d8c1910", - "name": "roles", - "description": "OpenID Connect scope for add user roles to the access token", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "false", - "display.on.consent.screen": "true", - "consent.screen.text": "${rolesScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "2acba004-e356-477a-8457-6fab7420303b", - "name": "audience resolve", - "protocol": "openid-connect", - "protocolMapper": "oidc-audience-resolve-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "access.token.claim": "true" - } - }, - { - "id": "c092f86d-0d4d-4d1d-9ef3-e3675db54c78", - "name": "client roles", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-client-role-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "multivalued": "true", - "user.attribute": "foo", - "access.token.claim": "true", - "claim.name": "resource_access.${client_id}.roles", - "jsonType.label": "String" - } - }, - { - "id": "2f62e0cb-bda8-487f-acac-f2da65bab020", - "name": "realm roles", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-realm-role-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "multivalued": "true", - "user.attribute": "foo", - "access.token.claim": "true", - "claim.name": "realm_access.roles", - "jsonType.label": "String" - } - } - ] - }, - { - "id": "bf07a7ca-2ec9-45c9-8192-94fa1f6c52f3", - "name": "role_list", - "description": "SAML role list", - "protocol": "saml", - "attributes": { - "consent.screen.text": "${samlRoleListScopeConsentText}", - "display.on.consent.screen": "true" - }, - "protocolMappers": [ - { - "id": "17d858a5-a0c9-4ad4-9bff-eb817aaab05f", - "name": "role list", - "protocol": "saml", - "protocolMapper": "saml-role-list-mapper", - "consentRequired": false, - "config": { - "single": "false", - "attribute.nameformat": "Basic", - "attribute.name": "Role" - } - } - ] - }, - { - "id": "7fe3af81-e8cf-4c12-8386-2382b4b45a99", - "name": "phone", - "description": "OpenID Connect built-in scope: phone", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "consent.screen.text": "${phoneScopeConsentText}" - }, - "protocolMappers": [ - { - "id": "6e2e6ab4-469a-4730-8415-dee62ca21399", - "name": "phone number", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "phoneNumber", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "phone_number", - "jsonType.label": "String" - } - }, - { - "id": "6860e3d3-be32-41e6-ab84-8682bc8a4056", - "name": "phone number verified", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "phoneNumberVerified", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "phone_number_verified", - "jsonType.label": "boolean" - } - } - ] - }, - { - "id": "db7259e9-a3cd-476b-bc66-1775283fd7f6", - "name": "acr", - "description": "OpenID Connect scope for add acr (authentication context class reference) to the token", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "false", - "display.on.consent.screen": "false" - }, - "protocolMappers": [ - { - "id": "825fb89c-39ee-42ae-9800-298847fbb827", - "name": "acr loa level", - "protocol": "openid-connect", - "protocolMapper": "oidc-acr-mapper", - "consentRequired": false, - "config": { - "id.token.claim": "true", - "introspection.token.claim": "true", - "access.token.claim": "true" - } - } - ] - }, - { - "id": "69c2defa-4e0b-4eff-9232-fecee7420d3a", - "name": "offline_access", - "description": "OpenID Connect built-in scope: offline_access", - "protocol": "openid-connect", - "attributes": { - "consent.screen.text": "${offlineAccessScopeConsentText}", - "display.on.consent.screen": "true" - } - }, - { - "id": "ab63e561-fa45-4c3c-8d4f-9566395a630e", - "name": "web-origins", - "description": "OpenID Connect scope for add allowed web origins to the access token", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "false", - "display.on.consent.screen": "false", - "consent.screen.text": "" - }, - "protocolMappers": [ - { - "id": "63842510-286f-43aa-8d2d-1f6241f3c8f6", - "name": "allowed web origins", - "protocol": "openid-connect", - "protocolMapper": "oidc-allowed-origins-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "access.token.claim": "true" - } - } - ] - } - - ], - "users": [ - { - "id": "admin", - "email": "${PDC_ADMIN_USERNAME}@admin", - "username": "${PDC_ADMIN_USERNAME}", - "firstName": "DevOps", - "lastName": "SRE", - "enabled": true, - "emailVerified": true, - "credentials": [ - { - "temporary": false, - "type": "password", - "value": "${PDC_ADMIN_PASSWORD}" - } - ] - }, - { - "username": "service-account-pdc-manager", - "emailVerified": false, - "enabled": true, - "serviceAccountClientId": "pdc-manager", - "disableableCredentialTypes": [], - "requiredActions": [], - "realmRoles": [ - "default-roles-covoiturage" - ], - "clientRoles": { - "realm-management": [ - "manage-users" - ] - } - } - ], - "components": { - "org.keycloak.userprofile.UserProfileProvider": [ - { - "id": "57af2c57-cfa1-4fdc-9448-ed9388f561f2", - "providerId": "declarative-user-profile", - "subComponents": {}, - "config": { - "kc.user.profile.config": [ - "{\"attributes\":[{\"name\":\"username\",\"displayName\":\"${username}\",\"validations\":{\"length\":{\"min\":3,\"max\":255},\"username-prohibited-characters\":{},\"up-username-not-idn-homograph\":{}},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"email\",\"displayName\":\"${email}\",\"validations\":{\"email\":{},\"length\":{\"max\":255}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"firstName\",\"displayName\":\"${firstName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"lastName\",\"displayName\":\"${lastName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"territory_id\",\"displayName\":\"\",\"validations\":{\"integer\":{\"min\":\"0\",\"max\":\"640000\"}},\"annotations\":{},\"permissions\":{\"view\":[\"admin\"],\"edit\":[\"admin\"]},\"multivalued\":false},{\"name\":\"operator_id\",\"displayName\":\"\",\"validations\":{\"integer\":{\"min\":\"0\",\"max\":\"640000\"}},\"annotations\":{},\"permissions\":{\"view\":[\"admin\"],\"edit\":[\"admin\"]},\"multivalued\":false},{\"name\":\"pdc_role\",\"displayName\":\"\",\"validations\":{\"options\":{\"options\":[\"registry.admin\",\"operator.admin\",\"operator.user\",\"territory.admin\",\"territory.user\",\"registry.user\"]}},\"annotations\":{\"inputType\":\"select\"},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\"],\"edit\":[\"admin\"]},\"multivalued\":false},{\"name\":\"phone\",\"displayName\":\"Téléphone\",\"validations\":{\"length\":{\"min\":\"0\",\"max\":\"32\"}},\"annotations\":{},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false}],\"groups\":[{\"name\":\"user-metadata\",\"displayHeader\":\"User metadata\",\"displayDescription\":\"Attributes, which refer to user metadata\"}]}" - ] - } - } - ] - } -} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index c955780d6c..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,1654 +0,0 @@ -{ - "name": "preuve-covoiturage", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "pm2": "^5.3.1" - }, - "devDependencies": { - "get-port": "^5.1.1" - } - }, - "node_modules/@opencensus/core": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.9.tgz", - "integrity": "sha512-31Q4VWtbzXpVUd2m9JS6HEaPjlKvNMOiF7lWKNmXF84yUcgfAFL5re7/hjDmdyQbOp32oGc+RFV78jXIldVz6Q==", - "dependencies": { - "continuation-local-storage": "^3.2.1", - "log-driver": "^1.2.7", - "semver": "^5.5.0", - "shimmer": "^1.2.0", - "uuid": "^3.2.1" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@opencensus/core/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@opencensus/propagation-b3": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@opencensus/propagation-b3/-/propagation-b3-0.0.8.tgz", - "integrity": "sha512-PffXX2AL8Sh0VHQ52jJC4u3T0H6wDK6N/4bg7xh4ngMYOIi13aR1kzVvX1sVDBgfGwDOkMbl4c54Xm3tlPx/+A==", - "dependencies": { - "@opencensus/core": "^0.0.8", - "uuid": "^3.2.1" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@opencensus/propagation-b3/node_modules/@opencensus/core": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@opencensus/core/-/core-0.0.8.tgz", - "integrity": "sha512-yUFT59SFhGMYQgX0PhoTR0LBff2BEhPrD9io1jWfF/VDbakRfs6Pq60rjv0Z7iaTav5gQlttJCX2+VPxFWCuoQ==", - "dependencies": { - "continuation-local-storage": "^3.2.1", - "log-driver": "^1.2.7", - "semver": "^5.5.0", - "shimmer": "^1.2.0", - "uuid": "^3.2.1" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@opencensus/propagation-b3/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@pm2/agent": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.3.tgz", - "integrity": "sha512-xkqqCoTf5VsciMqN0vb9jthW7olVAi4KRFNddCc7ZkeJZ3i8QwZANr4NSH2H5DvseRFHq7MiPspRY/EWAFWWTg==", - "dependencies": { - "async": "~3.2.0", - "chalk": "~3.0.0", - "dayjs": "~1.8.24", - "debug": "~4.3.1", - "eventemitter2": "~5.0.1", - "fast-json-patch": "^3.0.0-1", - "fclone": "~1.0.11", - "nssocket": "0.6.0", - "pm2-axon": "~4.0.1", - "pm2-axon-rpc": "~0.7.0", - "proxy-agent": "~6.3.0", - "semver": "~7.5.0", - "ws": "~7.4.0" - } - }, - "node_modules/@pm2/agent/node_modules/dayjs": { - "version": "1.8.36", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz", - "integrity": "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==" - }, - "node_modules/@pm2/agent/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pm2/agent/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pm2/io": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@pm2/io/-/io-5.0.2.tgz", - "integrity": "sha512-XAvrNoQPKOyO/jJyCu8jPhLzlyp35MEf7w/carHXmWKddPzeNOFSEpSEqMzPDawsvpxbE+i918cNN+MwgVsStA==", - "dependencies": { - "@opencensus/core": "0.0.9", - "@opencensus/propagation-b3": "0.0.8", - "async": "~2.6.1", - "debug": "~4.3.1", - "eventemitter2": "^6.3.1", - "require-in-the-middle": "^5.0.0", - "semver": "~7.5.4", - "shimmer": "^1.2.0", - "signal-exit": "^3.0.3", - "tslib": "1.9.3" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@pm2/io/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/@pm2/io/node_modules/eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" - }, - "node_modules/@pm2/io/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pm2/io/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pm2/js-api": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.8.0.tgz", - "integrity": "sha512-nmWzrA/BQZik3VBz+npRcNIu01kdBhWL0mxKmP1ciF/gTcujPTQqt027N9fc1pK9ERM8RipFhymw7RcmCyOEYA==", - "dependencies": { - "async": "^2.6.3", - "debug": "~4.3.1", - "eventemitter2": "^6.3.1", - "extrareqp2": "^1.0.0", - "ws": "^7.0.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@pm2/js-api/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/@pm2/js-api/node_modules/eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" - }, - "node_modules/@pm2/pm2-version-check": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz", - "integrity": "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==", - "dependencies": { - "debug": "^4.3.1" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" - }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/amp": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz", - "integrity": "sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw==" - }, - "node_modules/amp-message": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz", - "integrity": "sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg==", - "dependencies": { - "amp": "0.3.1" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/argparse/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ast-types/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" - }, - "node_modules/async-listener": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", - "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", - "dependencies": { - "semver": "^5.3.0", - "shimmer": "^1.1.0" - }, - "engines": { - "node": "<=0.11.8 || >0.11.10" - } - }, - "node_modules/async-listener/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/blessed": { - "version": "0.1.81", - "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", - "integrity": "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==", - "bin": { - "blessed": "bin/tput.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/bodec": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz", - "integrity": "sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ==" - }, - "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==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/charm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", - "integrity": "sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/cli-tableau": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz", - "integrity": "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==", - "dependencies": { - "chalk": "3.0.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", - "dependencies": { - "async-listener": "^0.6.0", - "emitter-listener": "^1.1.1" - } - }, - "node_modules/croner": { - "version": "4.1.97", - "resolved": "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz", - "integrity": "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==" - }, - "node_modules/culvert": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz", - "integrity": "sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg==" - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/emitter-listener": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", - "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", - "dependencies": { - "shimmer": "^1.2.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter2": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", - "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==" - }, - "node_modules/extrareqp2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/extrareqp2/-/extrareqp2-1.0.0.tgz", - "integrity": "sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/fast-json-patch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", - "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" - }, - "node_modules/fclone": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", - "integrity": "sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw==" - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/git-node-fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz", - "integrity": "sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ==" - }, - "node_modules/git-sha1": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz", - "integrity": "sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg==" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/js-git": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz", - "integrity": "sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==", - "dependencies": { - "bodec": "^0.1.0", - "culvert": "^0.1.2", - "git-sha1": "^0.1.2", - "pako": "^0.2.5" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "optional": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/lazy": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", - "integrity": "sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA==", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "engines": { - "node": ">=0.8.6" - } - }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" - }, - "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==" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" - }, - "node_modules/needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nssocket": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", - "integrity": "sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w==", - "dependencies": { - "eventemitter2": "~0.4.14", - "lazy": "~1.0.11" - }, - "engines": { - "node": ">= 0.10.x" - } - }, - "node_modules/nssocket/node_modules/eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==" - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidusage": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-3.0.2.tgz", - "integrity": "sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w==", - "dependencies": { - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pm2": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/pm2/-/pm2-5.3.1.tgz", - "integrity": "sha512-DLVQHpSR1EegaTaRH3KbRXxpPVaqYwAp3uHSCtCsS++LSErvk07WSxuUnntFblBRqNU/w2KQyqs12mSq5wurkg==", - "dependencies": { - "@pm2/agent": "~2.0.0", - "@pm2/io": "~5.0.0", - "@pm2/js-api": "~0.8.0", - "@pm2/pm2-version-check": "latest", - "async": "~3.2.0", - "blessed": "0.1.81", - "chalk": "3.0.0", - "chokidar": "^3.5.3", - "cli-tableau": "^2.0.0", - "commander": "2.15.1", - "croner": "~4.1.92", - "dayjs": "~1.11.5", - "debug": "^4.3.1", - "enquirer": "2.3.6", - "eventemitter2": "5.0.1", - "fclone": "1.0.11", - "mkdirp": "1.0.4", - "needle": "2.4.0", - "pidusage": "~3.0", - "pm2-axon": "~4.0.1", - "pm2-axon-rpc": "~0.7.1", - "pm2-deploy": "~1.0.2", - "pm2-multimeter": "^0.1.2", - "promptly": "^2", - "semver": "^7.2", - "source-map-support": "0.5.21", - "sprintf-js": "1.1.2", - "vizion": "~2.2.1", - "yamljs": "0.3.0" - }, - "bin": { - "pm2": "bin/pm2", - "pm2-dev": "bin/pm2-dev", - "pm2-docker": "bin/pm2-docker", - "pm2-runtime": "bin/pm2-runtime" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "pm2-sysmonit": "^1.2.8" - } - }, - "node_modules/pm2-axon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz", - "integrity": "sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==", - "dependencies": { - "amp": "~0.3.1", - "amp-message": "~0.1.1", - "debug": "^4.3.1", - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=5" - } - }, - "node_modules/pm2-axon-rpc": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz", - "integrity": "sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==", - "dependencies": { - "debug": "^4.3.1" - }, - "engines": { - "node": ">=5" - } - }, - "node_modules/pm2-deploy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz", - "integrity": "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==", - "dependencies": { - "run-series": "^1.1.8", - "tv4": "^1.3.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pm2-multimeter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz", - "integrity": "sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA==", - "dependencies": { - "charm": "~0.1.1" - } - }, - "node_modules/pm2-sysmonit": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz", - "integrity": "sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==", - "optional": true, - "dependencies": { - "async": "^3.2.0", - "debug": "^4.3.1", - "pidusage": "^2.0.21", - "systeminformation": "^5.7", - "tx2": "~1.0.4" - } - }, - "node_modules/pm2-sysmonit/node_modules/pidusage": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz", - "integrity": "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==", - "optional": true, - "dependencies": { - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/promptly": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz", - "integrity": "sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA==", - "dependencies": { - "read": "^1.0.4" - } - }, - "node_modules/proxy-agent": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", - "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-in-the-middle": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", - "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", - "dependencies": { - "debug": "^4.1.1", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/run-series": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", - "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" - }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", - "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/systeminformation": { - "version": "5.22.7", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.22.7.tgz", - "integrity": "sha512-AWxlP05KeHbpGdgvZkcudJpsmChc2Y5Eo/GvxG/iUA/Aws5LZKHAMSeAo+V+nD+nxWZaxrwpWcnx4SH3oxNL3A==", - "optional": true, - "os": [ - "darwin", - "linux", - "win32", - "freebsd", - "openbsd", - "netbsd", - "sunos", - "android" - ], - "bin": { - "systeminformation": "lib/cli.js" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "Buy me a coffee", - "url": "https://www.buymeacoffee.com/systeminfo" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" - }, - "node_modules/tv4": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", - "integrity": "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tx2": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz", - "integrity": "sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==", - "optional": true, - "dependencies": { - "json-stringify-safe": "^5.0.1" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/vizion": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz", - "integrity": "sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==", - "dependencies": { - "async": "^2.6.3", - "git-node-fs": "^1.0.0", - "ini": "^1.3.5", - "js-git": "^0.7.8" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/vizion/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yamljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", - "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", - "dependencies": { - "argparse": "^1.0.7", - "glob": "^7.0.5" - }, - "bin": { - "json2yaml": "bin/json2yaml", - "yaml2json": "bin/yaml2json" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 0b649d5703..0000000000 --- a/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "dependencies": { - "pm2": "^5.3.1" - }, - "devDependencies": { - "get-port": "^5.1.1" - } -}